日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows SDK 非模态对话框的消息处理

發布時間:2025/3/20 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows SDK 非模态对话框的消息处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在SDK中使用非模態對話框時的幾個問題: 1、為什么要調用IsDialogMessage?? 2、非模態對話框與主窗口有什么區別? 3、如果不調用IsDialogMessage,消息能不能傳遞到對話框? 4、如果一定要調用IsDialogMessage,那么如果有多個非模態對話框的話,是否對每一個非模態對話框都必須單獨調用 IsDialogMessage?如果真是這樣,MFC是如何處理的?因為MFC隱藏了主消息循環,我如何增加對IsDialogMessage的調用?

?

?

在SDK中使用非模態對話框時,主循環中必須插入下列代碼:

1.while(GetMessage(&msg,NULL,0,0) { 2.if(!IsDialogMessage(hdlg,&msg){ 3.TranslateMessage(&msg); 4.DispatchMessage(&msg); 5.} 6.}

我的問題是:

為什么要調用IsDialogMessage?? 非模態對話框與主窗口有什么區別? 如果不調用IsDialogMessage,消息能不能傳遞到對話框? 如果一定要調用IsDialogMessage,那么如果有多個非模態對話框的話,是否對每一個非模態對話框都必須單獨調用 IsDialogMessage?如果真是這樣,MFC是如何處理的?因為MFC隱藏了主消息循環,我如何增加對IsDialogMessage的調用?

要搞掂這一連串的問題,首先要明白IsDialogMessage的作用,不要被它的名字搞懵。

IsDialogMessage并不是象它的名字那樣用來檢查對話框消息的,而是用來解釋或轉換消息的,更貼切的名字應該是TranslateDialogMessage。

與TranslateAccelerator有點類似,IsDialogMessage解釋非模態對話框消息。例如,它映射Tab鍵和Shift+Tab 鍵到對話框前/后的控制,并且映射箭頭鍵到對話框相應的操作。你可以將它看成是對話框中專門內建的解釋消息的加速鍵表。實際 上,IsDialogMessage不是對話框專用的-你可以在任何有控制的窗口中使用它來實現與在對話框中一樣的鍵盤行為。但是因為它的第一個參數是對 話框的HWND,所以實際上你必須應用中的每一個非模態對話框都調用這個函數。通常當你創建對話框時可以獲得一個全程的HWND類型變量g_hDlg。

?

下一個要解決的問題是:MFC如何進行對話框消息的解釋?在MFC中使用了一個復雜的虛函數:CWnd::PreTranslateMessage,這個 虛函數讓任何窗口消息自己進入主消息循環,而不用去修改窗口自身的循環。以下是CDialog::PreTranslateMessage的缺省實現代 碼:

1.BOOL CDialog::PreTranslateMessage(MSG* pMsg) 2.{ 3....... 4.// many lines of intimidating code 5....... 6.return PreTranslateInput(pMsg); 7.}

換句話說,CDialog還傳遞消息到另一個虛函數:CWnd::PreTranslateInput

1.BOOL CWnd::PreTranslateInput(LPMSG lpMsg) 2.{ 3.if (/* keyboard or mouse message */) 4.{ 5.return IsDialogMessage(lpMsg); 6.} 7.return FALSE; 8.}

你可能想到了CWnd::IsDialogMessage實際上是一個用m_hWnd作為HWND參數調用全程::IsDialogMessage的打包 函數。這就導致了MFC中每一個對話框解釋自己的輸入。如果你同時運行五個對話框,每一個對話框的PreTranslateMessage都調用 IsDialogMessage-所以說你就不必做什么了。MFC實在是牛啊,你壓根就不必去操心IsDialogMessage,它會自己運轉良好。

轉載于:https://www.cnblogs.com/sideny/p/3283538.html

總結

以上是生活随笔為你收集整理的Windows SDK 非模态对话框的消息处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。