2012-04-28 41 views
0

我指的是msdn文章“在MFC对话框中托管Windows窗体用户控件”[0123](http://msdn.microsoft.com/en-us/library/94t3ebxz.aspx),以便重用Windows在MFC遗留应用程序中形成用户控件。使用花哨的DDX_ManagedControl工具,我可以看到嵌入到对话框中的控件(MyPanel类),甚至可以使用100%的制表符。当一个WinForms控件托管的MFC对话框被禁用并重新激活时,没有响应,然后

然后我继续让托管对话框成为另一个模式对话框的子项,然后当我的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. 在这种情况下上述的,如果我用间谍++监控所有WM_ACTIVATEXXX消息在当前过程中,我发现没有WM_ACTIVATE或WM_ACTIVATEAPP消息捕获时有问题的失活和再活化发生,也没有任何其他消息,即消息泵已经死亡。
  2. 相比之下,对于只有MFC控件的普通MFC子对话框,当一个文本框获得焦点后停用和重新激活时,它仍然响应,我可以看到所有WM_ACTIVATEXXX消息。
  3. 如果我直接将我的WinForms控件托管到模态MFC对话框中,问题就没有了。但是,我需要一个临时的无模式对话框,在我的情况下,我使用TreeView,其中每个树节点将加载一个不同的无模式对话框。

回答

1

今天我设法克服了这个问题,在模式对话框中添加了一个ON_WM_ACTIVATE宏和一个带有正确签名的空白消息处理程序。 FYI

//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 
} 
相关问题