60104


大規模な業務系のデスクトップアプリを作成しています、開発はMFC、VC++、Win32といった古い技術を使用しています。  
気になっているのはUIで、内部処理は旧資産を活用し、UIなどの見た目をモダンなフラットデザインにし現代的なWindowsアプリに近づけたいと思います。

UIを刷新する上で、何がよい選択肢なのでしょうか？  
自分が考えているは、UIはWPFで開発（C#)、内部処理はVC++,C++/CLI,MFCなどの旧資産を活かせる開発


CC BY-SA 4.0
2019-10-30T01:48:56.753
60100
2019-10-31T01:05:55.157
2019-10-31T01:05:55.157
3060
31497
question
c# c++ windows
WindowsデスクトップアプリのUIを刷新する際の選択肢について


範囲が広すぎるかもしれません。  
やや答えづらいのですが、何かの参考になるかもしれないので、限定的なケースでの説明をしてみます。

また、ハイブリッドな構成ではなくMFCで作成されている場合で、それをカスタマイズするケースのみに限定させてもらいます。

(1)CWinAPPの派生クラスを使用している場合。  
CWinAppExクラスを使用する様に変更します。

(2)CMDIFrameWndの派生クラスを使用している場合。  
同様にCMDIFrameWndExを使用します。

以上の作業はMFCアプリケーションウィザードで雛型を作って既存の機能を実装する方が良いと考えられます。

(3)コモンコントロールを使用していない場合  
InitCommonControlsEx()を使用して新しいコモンコントロールを使用することを指定します。  
自分はICC_WIN95_CLASSESを指定していますが、  
Windows10上では自動的にフラットなデザインになります。

(4)メッセージボックスMessageBox()をタスクダイアログ=CTaskDialogに変更する。  
メッセージボックスが陳腐に感じる場合に試してみる価値があります。

既に、ここまでやってしまっている場合には、ハイブリッドを検討する段階にあるかもしれません。


CC BY-SA 4.0
2019-10-30T02:54:59.297
60104
2019-10-30T02:54:59.297
3793
60100
answer


既に `C++/CLI` による GUI アプリケーション開発がサポート外となっている現在、最新マシンの高解像度ディスプレイの拡縮表示にフル対応するなら
WPF を [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") /
[vb.net](/questions/tagged/vb.net "'vb.net' のタグが付いた質問を表示") で開発するしかないでしょう。それとも
UWP ?  
(Surface の高解像度画面で WinForms アプリを使うと悲しくなります）

そうなるとどうしても .NET の manage 環境を使うことになりますが、その場合内部処理を VC++ 等の native
環境で書くのありえないとアプリ１つ作ってみると思うようになります。 VC++ で書かざるを得ない部分があると AnyCPU かつ x64/x86
両対応アプリにしたいとき面倒すぎて投げ出したくなります。

既存資産をどこまで流用するか流用できるかは既存資産の規模と開発メンバーの能力による部分が多いので第三者には判断できません。オイラは、昔作った MFC
アプリと完全互換になる（＋進化した機能追加） .NET C# WinForms アプリを新規作成しちゃいましたが、規模が違うっちゃ規模が違うんですよね・・・

オイラのお勧めは「 manage で完全リライト」っす。 native/manage ハイブリッド構成は native も manage
も両方できる人がいないと無理。ならば manage のみで完全リライトのほうがまだましっす。

無責任な外野からすると、どうせリライトするなら Web App にすればスマホからもアクセス出来てうんぬん・・・


CC BY-SA 4.0
2019-10-30T03:33:55.067
60105
2019-10-30T06:38:26.923
2019-10-30T06:38:26.923
8589
8589
60100
answer


「モダンなフラットデザイン」次第ですが、例えばメモ帳がモダンでフラットデザインと捉えることができるかどうかで分かれるように思います。Yesであれば、Uncle-
Keiさんが回答されているようにMFCでも実現できます。Noであれば、C#などでWPFを記述する必要があります。もしくはC++でUWPもあり…かな？

現状、MFCで記述されているとのことですが、扱うデータも`CString`や`CObject`に依存していますでしょうか？
またロジックもUIのイベント処理に強く依存していないでしょうか？
MFCオブジェクトはC#から呼び出すことができませんし、ロジックもデータバインディングを基本とするWPF / UWPとは馴染みません。  
（WPF上で強引にイベントドリブンで記述し盛大にこけた[例](https://www.gesource.jp/weblog/?p=4351)もあります。）

内部処理を生かすためには、全体的にラッパーが必要となります。そうまでして生かすべきかは規模にもよりますが、規模が大きければ大きいほどラッパーも大きくなるので、どちらにしてもあまり現実的ではないように思います。


CC BY-SA 4.0
2019-10-30T03:50:58.670
60108
2019-10-30T03:50:58.670
4236
60100
answer


C++で書いてある内部処理をDLL化できるのであれば、C#からDLLを呼んでもいいかもしれません。  
[ちょっと古いですが、参考に
C#からC++のDLLを使う](https://qiita.com/ask/items/ee2ff5b8706effc0c3d8)


CC BY-SA 4.0
2019-10-30T06:53:42.367
60117
2019-10-30T06:53:42.367
24490
60100
answer