1

我指的是 msdn 文章“在 MFC 对话框中托管 Windows 窗体用户控件”[链接](http://msdn.microsoft.com/en-us/library/94t3ebxz.aspx),以重用 Windows 窗体用户MFC 旧应用程序中的控件。使用花哨的 DDX_ManagedControl 实用程序,我可以看到控件(MyPanel 类)嵌入到对话框中,甚至可以 100% 浏览选项卡。

然后我继续使托管对话框成为另一个模式对话框的子对话框,然后当我的 WinForms 面板上的一个文本框获得键盘焦点并且我切换到另一个应用程序窗口(不同的进程)以停用当前对话框时,问题就出现了,接下来当我再次激活 MFC 对话框时,它不再响应。

澄清问题的一些代码://在我的 MFC 子对话框中 CWinFormsControl m_ctrl1;

void CMyWinFormControlTab::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_ManagedControl(pDX, IDC_MYPANEL_STATIC, m_ctrl1);
}

//in my out-most modal dialog
BOOL CMFCAppTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    CDialog *pNewTab = new CMyWinFormControlTab();
    pNewTab->Create(IDD_MYWINFORMTAB, this);
    pNewTab->ShowWindow(SW_SHOW);
}

一些观察:

  1. 在上述情况下,如果我使用 Spy++ 监视当前进程中的所有 WM_ACTIVATEXXX 消息,我发现当有问题的停用和重新激活发生时,没有捕获到 WM_ACTIVATE 或 WM_ACTIVATEAPP 消息,也没有任何其他消息,即消息泵已死。
  2. 相比之下,对于仅具有 MFC 控件的普通 MFC 子对话框,当在一个文本框获得焦点后发生停用和重新激活时,它仍在响应并且我可以看到所有 WM_ACTIVATEXXX 消息。
  3. 如果我直接将我的 WinForms 控件托管到模态 MFC 对话框中,问题就消失了。但是,我需要一个临时无模式对话框,因为在我的情况下,我使用 TreeView,其中每个树节点将加载不同的无模式对话框。
4

1 回答 1

1

今天,我设法通过在模态对话框中添加一个 ON_WM_ACTIVATE 宏和一个具有正确签名的空白消息处理程序来克服这个问题。供参考

//in header
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);

//in implementation cpp
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    //{{AFX_MSG_MAP(CMyDialog)
    ON_WM_ACTIVATE()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CMyDialog::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
    //you can leave it blank
}
于 2012-05-07T08:41:17.817 回答