實戰經驗:MFC非模態對話框的使用

2020-12-14 漫漫開發路

問題

在MFC編程中,我們經常會使用到模態對話框,模態對話框的一個典型特徵是當對話框彈出後,其父窗口將不接受任何UI響應,直到關閉當前的模態對話框後才能繼續。然而,非模態對話框就沒有這個限制,今天我們就來講講如何在MFC中使用非模態對話框。

Step by step

1) 在VS的資源管理器中新建一個對話框資源。

2) 為這個對話框新建對話框類,這裡將對話框類命名為CTestDlg。

3) 對話框資源及對話框類創建好之後,需要在父窗口類中定義一個指向對話框對象的指針。例如,我們的對話框類名為CTestDlg,那麼我們就需要在父窗口類中定義一個CTestDlg指針。

4) 在父窗口類的構造函數中初始化m_pTestDlg為空。

5) 創建並顯示非模態對話框。

6) 對話框關閉並銷毀

對話框的關閉:

可以使用DestroyWindow函數實現。

對話框的銷毀:

由於對話框是動態在堆內存上創建的,當我們不再使用到這個對話框後,我們需要手動銷毀對話框並釋放內存,否則會造成內存洩漏。方法如下:重寫CTestDlg的PostNcDestroy虛函數,其函數實現為delete this,也即在非模態對話框窗口銷毀之後,自動釋放對話框對象的內存。

7) OnOK和OnCancel的處理

當用戶在對話框上點擊OK按鈕或者敲擊回車,系統會自動調用OnOK虛函數。當用戶在對話框上點擊Cancel按鈕或者敲擊ECS,系統會自動調用OnCancel虛函數,如果我們需要在這些事件發生時做一些自定義處理,則可以重寫這兩個虛函數。

8) WM_SIZE消息處理

當對話框上有子控制項時,我們需要映射對話框的WM_SIZE消息並編寫子控制項的自適應代碼。

9) 客戶區拖動

當我們希望用戶通過拖動對話框的客戶區來改變對話框的位置時,可以重寫OnNcHitTest方法。

總結

今天主要講解了如何使用MFC中的模塊對話框,有了這個技能,就可以做出一些比較有意思的界面了。

相關焦點

  • 彈框體系總結:模態彈框和非模態彈框
    所有的對話框,浮層,提示條我們都習慣性的稱之為彈框,其實彈框我們可以分為兩種:模態彈框和非模態彈框。   模態彈框   模態彈框和非模態彈框最大的區別就是是否強制用戶交互。模態彈框會打斷用戶的當前操作流程,用戶不在彈框上操作的話,其餘功能都使用不了。
  • 將非模態對話框顯示為模態對話框
    首頁 > 語言 > 關鍵詞 > 對話框最新資訊 > 正文 將非模態對話框顯示為模態對話框
  • 示例程序詳解MFC動態連結庫
    動態連結庫分為兩種win32和mfc動態連結庫,今天我們講解MFC動態連結庫 再閱讀本文之前,希望你看看《動態連結庫基礎詳解》
  • 單目標跟蹤論文綜述:SiamFC、Siam系列和GradNet
    在檢測領域RPN本意是用作檢測,它將feature map上的各個點當做錨點,並映射到映射到輸入圖片上,再在每個錨點周圍取9個尺度不同的錨框,對每個錨框進行檢測是否有物體以及位置回歸。三、由於第二個缺陷,原始的siam以及siamRPN使用了餘弦窗,因此當目標丟失,然後從另一個位置出現,此時siam不能重新識別target, (siamRPN的搜索區域是上一陣的中心加上預設的搜索區域大小形成的搜索框),該缺陷導致siam無法適應長時間跟蹤的問題。對此作者提出了local-to-global的搜索策略,其實就是隨著目標消失幀數的增加,搜索區域逐漸擴大。
  • Python使用tkinter界面編程中對話框樣式匯總
    tkinter模塊的子模塊messagebox、filedialog、colorchooser、simpledialog中包括了一些常用的預定義好的對話框,當然也可以通過繼承Toplevel創建自定義的對話框。如果對於界面顯示沒有太嚴苛的要求的話,建議還是使用預定義的對話框,無論從功能還是容錯機制上使用預定義好的對話框都是比較有優勢的。
  • 如何調用Word內置對話框
    例如,使用「打開」對話框打開一個文件;使用「段落」對話框設置段落格式;使用「選項」對話框設置選項等等。這些內置對話框在 Word 中是通過菜單命令、工具欄按鈕或快捷鍵來調用的。如果能在程序中直接調用 Word 內置對話框,將大大簡化程序設計過程,提高編程效率。下面以VBA(Visual Basic for Applications)程式語言為例,說明調用方法。
  • Qt 標準對話框之 QFileDialog
    我並不打算介紹很多組件的使用,因為 Qt 有很多組件,各種組件用法眾多,根本不可能介紹完,只能把API 放在手邊,邊用邊查。所以,對於很多組件我只是簡單的介紹一下,具體用法還請自行查找(確切地說,我知道的也並不多,很多時候還是要到 API 裡面去找)。下面還是按照我們的進度,從 Qt 的標準對話框開始說起。所謂標準對話框,其實就是 Qt 內置的一些對話框,比如文件選擇、顏色選擇等等。
  • C++ MFC中定時器的使用
    其中 nIDEvent 中的n代表定時器的編號;通常與switch-case語句構成多個定時器的同時使用。步驟:一.通過類嚮導在對話框基類中添加 OnTimer子類。步驟:【查看】-【類嚮導】-【Messagemaps】-【CMy**Dlg】-【message】-【WM_timer】編譯後CMyDlg類此時會自動添加一個 OnTimer(UINT nIDEvent)子類。
  • 關閉模態對話框的正確順序
    調用順序很重要如果你想顯示一個模態對話框,你需要先將所有者窗口禁用,然後啟用模態對話框,當關閉一個模態對話框時,則要確保嚴格按照相反的流程來進行。為什麼要按照這樣的流程呢?如果關閉了一個模態對話框,你可能想要這樣做:> 關閉並銷毀模態對話框> 重新啟用所有者窗口但是,如果你按照上面的順序操作的話,你會發現:所有者窗口將不會像正常的那樣在前景激活。它會隨機地激活一些其他的窗口。
  • Excel VBA超強大把Excel變成了機器人(Dialogs屬性打開對話框)
    「文件」菜單的「打開」對話框。用Dialogs屬性顯示Excel打開對話框,本示例顯示「文件」菜單的「打開」對話框。每個 Dialog 對象代表一個內置對話框。不能在集合中新建或添加內置對話框。Dialog 對象只能在 Show 方法中用來顯示相應的對話框。Microsoft Excel Visual Basic 對象庫包含許多內置對話框的內置常量。每個常量的前綴均為「xlDialog」,隨後即為對話框的名稱。
  • Application.DisplayAlerts不顯示警告對話框
    使用VBA的代碼如下,意思是指刪除第2張表。Sheets(2).delete使用VBA可以循環處理,批量刪除很多張表。可以使用以下代碼,聲明i為工作表對象,遍歷集合中的每個表,只要表的名字不是"Sheet1",刪除,這樣就可以保留這一張表,其他的全刪除。
  • 微信又更新:終於能刪對話框了!
    相信大家一定都試過,在微信上把聊天框刪除以後,聊天記錄就沒有了,一不小心就會丟失重要的文件和信息!但留著聊天框,既佔內存,又礙眼,強迫症患者真的是抓狂。我就問問這合理嗎?不過隨著安卓新版微信的推出,佳佳驚喜地發現,微信上線了在刪除對話框的情況下,聊天記錄仍可保存的功能。用戶只需要按住對話框,並左滑,點擊不顯示即可。
  • VBA代碼中,Msgbox函數如何實現個性化對話框
    朋友們好,今日我們講解VBA代碼解決方案的第39講:VBA 代碼中如何實現Msgbox函數定製化人機對話消息框。在上篇文章中簡單實現了MSGBOX對話框,但是界面不是很友好,那麼,如果希望MsgBox函數顯示的消息框具有特定的按鈕、圖標和標題欄,實現相對友好的人機對話界面該怎麼辦呢?
  • Origin 2017 官方中文版軟體安裝實戰教程及下載
    簡單了解Origin之後,我們就進入今天的主題Origin 2017軟體的實戰安裝操作。2017安裝對話框中可點擊【瀏覽】按鈕來選擇Origin2017的安裝路徑,然後點擊【下一步】按鈕提示:可直接點擊下一步按鈕進行默認安裝第9步在彈出的Origin 2017安裝對話框中點擊【是】按鈕第10步
  • LabVIEW編程實例:一個簡單的「關於」對話框模板實現
    當軟體功能功能代碼編寫完成後,一般在軟體中還需要一個「關於」對話框,用以指示軟體的相關信息,如軟體名稱、作者、創建日期及版權等信息。該對話框一般在軟體的菜單「Help|About……」中可以調出這個對話框。
  • 除了窗口,Windows還有兩個重要組件,就是菜單和對話框
    Windows 7對話框可以將對話框看作是一種人機交流的媒介,當小夥伴們對對象進行操作時,會自動彈出一個對話框,以給出進一步的說明和操作提示。可以將對話框看作是特殊的窗口,與普通的Windows窗口有相似之處,但是它比一般的窗口更加簡潔直觀。
  • MFC下的cstring與char互相轉換方法
    Mfc下的cstring與char互相轉換方法本次課程主要來為大家講一下平時我們總是在mfc下環境開發中使用的char類型的數組和cstring格式的轉換,還有在qt下該如何轉換,送給有需要的小夥伴們。
  • 少兒英語實戰對話:郵政用語
    根據郵局的業務辦理,我們把郵政用語分為郵寄包裹信件、取包裹、購買郵票信封和明信片實戰對話4個部分進行講解。第一部:分郵寄包裹信件郵寄包裹信件中郵政工作人員常用表達方式。How should you like to send it?
  • C/C++學習指南系列 QT界面開發入門與實戰視頻教程
    15、(5.2) 單行文本框QLineEdit.mp416、(5.3) 組合框QComboBox.mp417、(5.4) 工具按鈕QToolButton.mp418、(5.5) QLabel顯示文字和圖片.mp419、(6.1) 拉丁字符集 (ISO 8859).mp420、(6.2) 中文字符集 (GBK, UnicodeUTF8