MFC MDI アプリケーションがあり、それに新しいダイアログを追加しようとしています。このダイアログをWPF(基本的にダイアログではなくウィンドウ)にしたい。このウィンドウはモードレスで、現在の MDI ビューの子である必要があります。
MFC アプリケーションに CMyView があり、その OnCreate で WPF ウィンドウを作成しようとするとします。そのために、CMyWindowWrapper (/CLR でコンパイル) というラッパー クラスを作成しました。
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_wrapper.Create(this);
return 0;
}
ウィンドウ ラッパー クラスには、実際に WPF ウィンドウを作成する Create 関数があります。
void CMyWindowWrapper::Create(CWnd* pParent)
{
MyWindow^ window = gcnew MyWindow();
window->ShowModeless((IntPtr)pParent->GetSafeHwnd());
m_myWindow = window;
}
MyWindow は、次のように ShowModeless という関数を追加した WPF ウィンドウです。
public void ShowModeless(IntPtr parent)
{
WindowInteropHelper helper = new WindowInteropHelper(this);
helper.Owner = parent;
Show();
ShowInTaskbar = false;
}
現在、アプリケーションは次のように動作します。CMyView が作成されるたびに、モードレス MyWindow が正常に作成され、フォーカスが CMyView にある場合でも常に CMyView の上に表示されます。ただし、CMyView を閉じたり最小化したりすると、MyWindow は追従しません。アプリケーション全体が閉じられる/最小化される場合にのみ、閉じられる/最小化されます。
必要に応じて、問題を示すサンプル アプリケーションを添付できます。
お知らせ下さい。
どうもありがとう。