2012-04-28 47 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 
} 
相關問題