2012-04-28 1 views
0

Я имею в виду статью msdn «Хостинг пользовательского элемента Windows Form в диалоговом окне MFC» [link] (http://msdn.microsoft.com/en-us/library/94t3ebxz.aspx), для повторного использования окна формируют пользовательские элементы управления в устаревшем приложении MFC. С помощью полезной утилиты DDX_ManagedControl я могу видеть, что элемент управления (класс MyPanel) включен в диалоговом окне, даже вкладки работают на 100%.Когда диалог MFC с элементом управления WinForms размещен внутри, деактивируется и снова активируется, а затем не отвечает

Затем я двигаюсь вперед, чтобы сделать диалог хостинга дочерним по отношению к другому модальному диалоговому окну, тогда проблема возникает, когда одно из текстовых полей на моей панели 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-child с элементами управления 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 
}