あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

まとめサイト「ソノウソホント?」と「ムードもりあげ楽団」はこちら。

【C++/CLI】WinFormsでMFCのコントロールのメソッドを使う(MFC移植)

MFCから.Net WinForms化するときのメモ。

レガシーなMFCアプリをWinForms化する場合(と言っても、WinFormsももう十分レガシーですが。。)、コントロール.Netのクラスになったけど、既存のコードを流用したい場合で、MFCなクラスメソッドの呼び出しがある箇所はCWnd::FromHandleが利用できます。

 このメソッドはウィンドウハンドルからCWndクラスを作るメソッドなので、.NetコントロールHandleプロパティを、ToPointerからHWNDでキャストすれば、CWndにすることができ、そこからCWndのメソッドで対象のコントロールを操作することが可能です。

さらには、ボタンやエディットボックスのコントロールの派生クラスであるCButtonCEditにもダウンキャストで変換できて操作できるので、処理をそのまま流用できます。

確認までにCComboBoxで、GetDroppedControlRectShowDropdownを呼んでみましたがちゃんと動作しました。

ただし注意点としては、コントロールに操作を行うメソッドを呼んだ場合、基底クラスのControlが持つメソッドのMoveWindowなんかはLocationも追従するのですが、派生クラスの固有のメンバを操作するような場合には追従しなかったりします。

例えばMFCResetContentを実行すると、確かに見た目上のドロップダウンのリストはになりますが、Itemsは残ったままで参照できてしまいます。
ただMFCGetLBTextで参照すると例外になるので、MFCのクラスとしてはクリアされているっぽく、MFCのメソッドで処理が完結するのであれば上手く動きそうな感じです。

また、CDialogMapDialogRectEndDialogNextDlgCtrlを試したところ動作しなかったので、全てが利用できるわけでは無さそうです。
おそらく、MFCCDialog.NetFormでは作りが大幅に変わっているのかなと想像。以前書いたこの辺の記事とも関係してきそうです。

allthewayfrom.hatenablog.com

なので、全ては試していませんがCDialog固有のメソッドは殆どが使えないような感じです。

と、もうあまり使う機会はないかもしれませんが、ご参考まで。。