3

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 は追従しません。アプリケーション全体が閉じられる/最小化される場合にのみ、閉じられる/最小化されます。

必要に応じて、問題を示すサンプル アプリケーションを添付できます。

お知らせ下さい。

どうもありがとう。

4

1 に答える 1

0

別の解決策は、WPF ウィンドウをユーザー コントロールにすることです。MFC モードレス ダイアログを作成し、WPF ユーザー コントロールを MFC モードレス ダイアログに配置します。

于 2012-01-31T21:13:16.923 に答える