PreTranslateMessage處理模態窗口和非模態窗口

1. 非模態窗口,如控件即爲非模態窗口。

	BOOL CProgressEdit::PreTranslateMessage(MSG* pMsg)
	{
		if (pMsg->message == WM_LBUTTONUP)
		{
			// Do something
			return FALSE;
		}
		return CStatic::PreTranslateMessage(pMsg);
	}

返回FALSE,表示消息需要往底層窗口繼續分發,即控件所在窗口將接收到此消息WM_LBUTTONUP。
返回TRUE,表示消息已經處理,不需要往底層窗口分發,即控件所在窗口不會再接受到此消息WM_LBUTTONUP。

2. 模態窗口,即DoModal()

父窗口和子窗口共用一個線程,所有的消息會進入了子窗口,子窗口會將父窗口的內部消息通過調用父窗口的PreTranslateMessage來保證父窗口的基本繪製保持完成。那麼所有的外部消息都只有子容能夠接收並進行處理。如果我們在父窗口的PreTranslateMessage函數中創建一個模態對話框,在執行完DoModal之後必須返回TRUE,爲什麼呢?

	BOOL CTestMessageDlg::PreTranslateMessage(MSG* pMsg)
	{
		if (pMsg->message == WM_LBUTTONUP)
		{
			CMyDlg dlg;
			dlg.DoModal();
			return TRUE;
		}
	
		return CDialog::PreTranslateMessage(pMsg);
	}

pMsg在一個MFC應用程序中是一個全局變量AfxGetThreadState來記錄的,所以當dlg.DoModal()執行完之後,指針pMsg所指向的其實是dlg窗口退出時最後一個消息,這個消息的窗口句柄是dlg的,是不能給當前父窗口使用的,即不能在當前父窗口的PreTranslateMessage中繼續分發,即返回TURE,即告訴消息機制,當前消息不再進行分發。如果返回FLASE或默認,在分發時,會檢測消息句柄是否有效,不一致會報斷言錯誤提示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章