模式對話框與非模式對話框的區別



?????? 模式對話框就是不處理它就沒法處理父窗口,而非模式對話框就是不用先處理此對話框也可以處理父窗口.例子:在桌面上右擊我的電腦,選擇屬性,彈出系統屬性窗口,點擊下面的技術支持,彈出技術支持信息,現在再對系統屬性窗口進行操作就操作不了,這種叫做模式對話框;關閉技術支持信息,在系統屬性里選擇硬件,點擊設備管理器,彈出設備管理器窗口,現在再對系統屬性窗口進行操作仍然可以操作,這種就叫做非模式對話框。

?

?


??

???????在WIN32中,模式對話框的創建一般是使用DialogBox來進行創建的。而非模式對話框則是利用CreateWindow來創建的。在MFC或是WTL中,模式對話框一般是使用DoModal,而非模式對話框的創建則是使用Create。

一、使用中的區別

????? 模式對話框創建后,程序的其他窗口便不能進行操作,必須將該窗口關閉后,其他窗口才能進行操作。而非模式對話框則無需這樣,它不強制要求用戶立即反應,而是與其他窗口同時接受用戶操作。

二、消息響應的區別

????? 在消息響應方面,模式對話框和非模式對話框之間又有著很大的區別。模式對話框工作的時候,它有內部的消息泵機制,控件之間的交互不用我們人為的去控制,系統會幫助我們去處理。非模式對話框則像普通窗口一樣,則由WinMain中書寫的消息循環驅動。但由于是對話框,它對一些消息有特殊的處理。因此,在消息循環中,需要先對對話框提供截獲消息的機會。

While (GetMessage(&msg, NULL, 0, 0)){if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg)){TranslateMessage(&msg);DispatchMessage( &msg);}}

???? 如果當前取得的消息是對話框的消息,IsDialogMessage 將它交由對話消息處理函數處理,并返回TRUE。不需要再派發了。

注意:這個方法并不是很好用,因為當對話框過多的時候,處理起來就比較麻煩了。另一種處理的方法是利用子類化控件的方法,來處理控件間的交互。

三、銷毀的區別

????? 模式對話框的銷毀是使用EndDialog,而非模式對話框的銷毀是使用DestroyWindow.。所以我們在銷毀對話框的時候,也要對其進行區別。

非模式對話框,用戶關閉對話框時,對話框消息處理函數將收到WM_CLOSE消息,接到后調用DestroyWindow以銷毀非模式對話框。

模式對話框,則一般響應IDOK和IDCANCEL。在PPC上,我們對于OK鍵和X鍵的處理要注意這點。

四、其他

??? 非模態對話框的模板必須具有Visible風格,否則對話框將不可見,而模態對話框則無需設置該項風格。更保險的辦法是調用ShowWindow(hDialog, SW_SHOW)來顯示對話框,而不管對話框是否具有Visible風格。 

??? 非模態對話框對象是用new操作符在堆中動態創建的,而不是以成員變量的形式嵌入到別的對象中或以局部變量的形式構建在堆棧上。通常應在對話框的擁有者窗口類內聲明一個指向對話框類的指針成員變量,通過該指針可訪問對話框對象。

??? 通過調用Create函數來啟動對話框,而不是DoModal,這是模態對話框的關鍵所在。由于Create函數不會啟動新的消息循環,對話框與應用程序共用同一個消息循環,這樣對話框就不會壟斷用戶的輸入。Create在顯示了對話框后就立即返回,而DoModal是在對話框被關閉后才返回的。眾所周知,在MFC程序中,窗口對象的生存期應長于對應的窗口,也就是說,不能在未關閉屏幕上窗口的情況下先把對應的窗口對象刪除掉。由于在Create返回后,不能確定對話框是否已關閉,這樣也就無法確定對話框對象的生存期,因此只好在堆中構建對話框對象,而不能以局部變量的形式來構建之。

??? 因為是用new操作符構建非模態對話框對象,因此必須在對話框關閉后,用delete操作符刪除對話框對象。

??? 必須有一個標志表明非模態對話框是否是打開的。這樣做的原因是用戶有可能在打開一個模態對話框的情況下,又一次選擇打開命令。程序根據 標志來決定是打開一個新的對話框,還是僅僅把原來打開的對話框激活。通常可以用擁有者窗口中的指向對話框對象的指針作為這種標志,當對話框關閉時,給該指 針賦NULL值,以表明對話框對象已不存在了。

??? 注意:在C++編程中,判斷一個位于堆中的對象是否存在的常用方法是判斷指向該對象的指針是否為空。這種機制要求程序員將指向該對象的指針初始化為NULL值,在創建對象時將返回的地址賦給該指針,而在刪除對象時將該指針置成NULL值。

??


??

  非模
形式上 ①一個模式對話框是一個有系標題欄邊線等的出式窗口。在對話指定WS_POPUP, WS_SYSMENU, WS_CAPTION和 DS_MODALFRAME格。即使沒有指定WS_VISIBLE格,模式對話框也會被示。

對話框窗口,將送WM_INITDIALOG消息(如果指定對話框的DS_SETFONT格,有WM_SETFONT消息)給對話程。(對話框的窗口程由Windows系提供,用對話框窗口提供一個對話程由窗口調
用。)

對話框窗口被建之后,Windows使得它成一個激活的窗口,它保持激活直到對話調用::EndDialog函數對話框的運行或者Windows激活另一個用程序止,在激活,用或者
用程序不可以激活它的所屬窗口(Owner window)。
①一個無模式對話框是一個有系標題欄邊線等的出式窗口。在對話框模板指定WS_POPUP、WS_CAPTION、WS_BORDER和WS_SYSMENU格。如果沒有指定WS_VISIBLE格,無模式對話框不會自示出來。

②一個無模式
對話框既不會禁止所屬窗口,也不會送消息。當建一個模式對話,Windows使它成窗口,但用或者程序可以隨置活窗口。如果對話框失去激活,那么即使所屬窗口是活的,在Z軸順
序上,它仍然在所屬窗口之上。

創建 DoModal() Create()
銷毀 一個用程序通過調用::EndDialog函數來一個模式對話框。一般情況下,當用從系選擇了關(Close)命令或者按下了確(OK)或取消(CANCLE)按,::EndDialog被對話程所調用。調用::EndDialog,指定其參數nResult的,Windows將在對話框窗口后返回,一般,程序通返回判斷對話框窗口是否完成了任或者被用取消。

※ EndDialog(IDC_BUTTON_DEFAULT);我
們的代碼中EndDialog方法在指定的BUTTON處理事件結束時調用,來關閉對話框

用程序束之前,它必須銷所有的無模式對話框。使用::DestroyWindow一個無模式對話框,不是使用::EndDiaLog。一般來對話程響戶輸入,如用戶選擇了“取消”按則自動調用::DestroyWindow;如果用沒有有關作,則應用程序必須調用::DestroyWindow。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFMpeg框架代碼閱讀

簡介FFmpeg是一個集錄制、轉換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發是基于Linux操作系統,但是可以在大多數操作系統中編譯和使用。FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多種編碼,AVI、MPEG、OGG、Matroska、ASF等90…

C#DotNetBar TabControl將水平標簽設置成豎直

小哥哥小姐姐覺得有用點個贊唄! 首先選中整個TabControl控件 更改屬性: 完成

WCF調試異常信息:ServiceHost 僅支持類服務類型

“/CommonHelpServices”應用程序中的server錯誤。ServiceHost 僅支持類服務類型。說明: 運行當前 Web 請求期間,出現未經處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的具體信息。異常具體信息: System.ArgumentException…

使用 Drone 構建 Coding 項目

2019獨角獸企業重金招聘Python工程師標準>>> 使用 Drone 構建 Coding 項目 Drone 是一個輕量級的持續集成工具。它具備許多現代持續集成工具的特性:輕巧(Docker 鏡像不到 10M)、部署方便(docker-compose 一鍵部署&…

C++類的構造函數 后單冒號加基類 例如:CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) 比如兩個類 class A{A(int *x);...}class B : public A{B(int *x);...}然后B在構造的時候 B::B(int *x) : A(x){...}B是A的子類,B類對象在構造過程中必須先構造出一個A類對象,而A類的構造函數需要一…

C#InI文件讀寫剖析

C#InI文件讀寫剖析 1.讀取ini文件 StringBuilder stringBuilder new StringBuilder();GetPrivateProfileString(section, key, "err", stringBuilder, 1024, filePath);para_value stringBuilder.ToString();GetPrivateProfileString( LPCTSTR lpAppName, //配置文…

bzoj1385: [Baltic2000]Division expression

歐幾里得算法。可以發現規律&#xff0c;a[2]作為分母&#xff0c;其他作為分子&#xff0c;必定是最好的選擇。判斷是否為整數即可。 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(…

成員變量 局部變量 類變量

成員變量和局部變量的區別 成員變量&#xff1a; 1、成員變量定義在類中&#xff0c;在整個類中都可以被訪問。 2、成員變量隨著對象的建立而建立&#xff0c;隨著對象的消失而消失&#xff0c;存在于對象所在的堆內存中。 3、成員變量有默認初始化值。 局部變量&#xff1a; 1…

從DevOps到Cloud Native,應用上云姿勢全解鎖

本文由網易云 發布作者&#xff1a;林帆序文伴隨著IaaS、PaaS等云端基礎設施技術的成熟&#xff0c;“應用上云”成為許多企業軟件部門的心頭大事。通過把傳統軟件系統搬到云上&#xff0c;一方面可以讓業務方獲得更多的資源靈活性&#xff0c;另一方面也可以緩解運營方的成本壓…

foreach

foreach 遍歷數組內每個元素&#xff0c;迭代一次執行一次循環語句。 相當于增前后的for循環

深入理解C++對象模型-對象的內存布局,vptr,vtable

vtpr的位置: 為了支持多態,C引入了vtpr和vtable這兩個概念.對于每個有虛函數的類,C都會為其生成一個vtable,并在類中添加一個隱含的數據成員vptr. 對于vptr在對象中的位置,跟類的數據成員的布局一樣,C標準里面并沒有做出任何的規定.但是對于特定的編譯器,我們還是可以通…

Visual Studio Code 常用插件整理

常用插件說明&#xff1a; 一、HTML Snippets 超級使用且初級的H5代碼片段以及提示 二、HTML CSS Support 讓HTML標簽上寫class智能提示當前項目所支持的樣式 三、Debugger for Chrome 讓vscode映射chrome的debug功能&#xff0c;靜態頁面都可以用vscode來打斷點調試、配飾稍…

sublime 正則搜索日語字符

sublime 正則搜索日語字符 [\x{3041}-\x{3096}\x{30A0}-\x{30FF}\x{3400}-\x{4DB5}\x{4E00}-\x{9FCB}\x{F900}-\x{FA6A}\x{2E80}-\x{2FD5}\x{FF5F}-\x{FF9F}\x{3000}-\x{303F}\x{31F0}-\x{31FF}\x{3220}-\x{3243}\x{3280}-\x{337F}\x{FF01}-\x{FF5E}] 參考: http://www.localiz…

函數域中申請堆空間出函數后不會自動釋放

#include<iostream> using std::cout; using std::endl; char *scat(char *s1,char *s2) { char *snew char[strlen(s1)strlen(s2)1]; strcpy(s,s1); strcat(s,s2); return s;//返回剛申請的堆空間的首址&#xff0c;出了函數后變量s就不復存在了&#xff0c;但申請的…

/home文件夾重新劃分獨立分區

1. 備份home文件夾&#xff0c;數據丟失的時候可以使用cp -av /home/* /data/2. 磁盤分區2.1 虛擬機中添加磁盤并讓系統識別&#xff0c;使用# echo - - - >> /sys/class/scsi_host/host0/scan# echo - - - >> /sys/class/scsi_host/host1/scan# echo - - - >…

使用halcon將一個圓上的點擬合成圓形并且求出圓心

我們在自動化貼裝機標定過程中&#xff0c;需要計算吸頭的旋轉中心位置。我們一般使用的方法是使用模板匹配&#xff0c;做一個模板&#xff0c;吸頭旋轉一個角度尋找模板一次&#xff0c;通過多次旋轉求取吸頭的旋轉中心。 使用halcon實現 public bool FitCircle(double[] X…

This 指針

如果你期望衍生類別重新定義一個成員函數&#xff0c;那么你應該在基礎類別中把此函數設為 virtual。 以單一指令喚起不同函數&#xff0c;這種性質稱為Polymorphism&#xff0c;意思是"the ability toassume many forms"&#xff0c;也就是多態。 虛擬函…

史上最全亞歷山大大帝名言

&#xff08;1&#xff09;把財富分給他人&#xff0c;把希望留給自己&#xff0c;他將帶給我無窮的財富。——亞歷山大大帝 &#xff08;2&#xff09;山不走到我這里來&#xff0c;我就走到他那里去。——亞歷山大大帝 &#xff08;3&#xff09;能夠戰勝恐懼就能戰勝死亡。—…

jdbcmysql

做java開發難免會用到數據庫,操作數據庫也是java開發的核心技術。那我們現在就來談談javajdbc來操作mysql數據庫吧 第一步&#xff1a;我們需要把mysql的驅動引進來這里引驅動就是把mysql-connector-java-5.1.37-bin.jar加到項目中來&#xff0c;下面附jar包 第二步&#xff1a…

char **p, char a[16][8]; 問:p=a 是否會導致程序在以后出現問題?為什么?

int (*v)[10]; 在 Visual C 里面不能與 int **v 等同起來。 舉個例子&#xff1a; int **p; int (*v)[10]; int a[10][10]; 如果寫 v a 是可以的。 如果寫 p a 將會引起一個類型不匹配的編譯錯誤。 二級指針&#xff08;int **p&#xff09;需要自己指向一個一級指針&#x…