【C++/CLI】WinFormsでMFCのコントロールのメソッドを使う(MFC移植)
MFCから.Net WinForms化するときのメモ。
レガシーなMFCアプリをWinForms化する場合(と言っても、WinFormsももう十分レガシーですが。。)、コントロールは.Netのクラスになったけど、既存のコードを流用したい場合で、MFCなクラスメソッドの呼び出しがある箇所はCWnd::FromHandleが利用できます。
このメソッドはウィンドウハンドルからCWndクラスを作るメソッドなので、.NetコントロールのHandleプロパティを、ToPointerからHWNDでキャストすれば、CWndにすることができ、そこからCWndのメソッドで対象のコントロールを操作することが可能です。
さらには、ボタンやエディットボックスのコントロールの派生クラスであるCButtonやCEditにもダウンキャストで変換できて操作できるので、処理をそのまま流用できます。
確認までにCComboBoxで、GetDroppedControlRect、ShowDropdownを呼んでみましたがちゃんと動作しました。
ただし注意点としては、コントロールに操作を行うメソッドを呼んだ場合、基底クラスのControlが持つメソッドのMoveWindowなんかはLocationも追従するのですが、派生クラスの固有のメンバを操作するような場合には追従しなかったりします。
例えばMFCのResetContentを実行すると、確かに見た目上のドロップダウンのリストは空になりますが、Itemsは残ったままで参照できてしまいます。
ただMFCのGetLBTextで参照すると例外になるので、MFCのクラスとしてはクリアされているっぽく、MFCのメソッドで処理が完結するのであれば上手く動きそうな感じです。
また、CDialogはMapDialogRect、EndDialogやNextDlgCtrlを試したところ動作しなかったので、全てが利用できるわけでは無さそうです。
おそらく、MFCのCDialogと.NetのFormでは作りが大幅に変わっているのかなと想像。以前書いたこの辺の記事とも関係してきそうです。
なので、全ては試していませんがCDialog固有のメソッドは殆どが使えないような感じです。
と、もうあまり使う機会はないかもしれませんが、ご参考まで。。