国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建

這篇具有很好參考價(jià)值的文章主要介紹了【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

引言

在本章節(jié)中我們來(lái)講解Windows/Win32編程中對(duì)話框的原理和對(duì)話框的創(chuàng)建,我們?cè)谇皫灼鹿?jié)中講解到了普通窗口中回調(diào)函數(shù)的處理,在普通窗口的窗口消息處理函數(shù)(回調(diào)函數(shù))中,系統(tǒng)會(huì)首先調(diào)用我們自己寫(xiě)的回調(diào)函數(shù),我們自己編寫(xiě)的回調(diào)函數(shù)沒(méi)有處理的消息,才會(huì)交給系統(tǒng)的缺省函數(shù)處理,但是對(duì)話框中消息處理機(jī)制不同,系統(tǒng)會(huì)首先調(diào)用系統(tǒng)中的回調(diào)函數(shù),在缺省函數(shù)中沒(méi)有處理的消息,才會(huì)尋找我們自己寫(xiě)的回調(diào)函數(shù)去處理。簡(jiǎn)單來(lái)說(shuō),在普通窗口中是我們自己寫(xiě)的回調(diào)函數(shù)調(diào)用系統(tǒng)缺省回調(diào)函數(shù),而在對(duì)話框中,是系統(tǒng)的缺省函數(shù)調(diào)用我們字節(jié)寫(xiě)的回調(diào)函數(shù)。

我們來(lái)編寫(xiě)一段偽代碼來(lái)幫助大家理解:
普通窗口:

WndProc(...){
	...    //我們自己寫(xiě)的回調(diào)函數(shù)過(guò)程
	DefWinsowsProc(...);     //之后調(diào)用系統(tǒng)缺省回調(diào)函數(shù)
}

而在對(duì)話框中,是系統(tǒng)的缺省函數(shù)調(diào)用我們寫(xiě)的回調(diào)函數(shù):

缺省函數(shù)( ... ){
 	...     //系統(tǒng)寫(xiě)好的處理過(guò)程
 	自定義回調(diào)函數(shù);    //我們自己寫(xiě)的回調(diào)函數(shù)
}

一.對(duì)話框原理

1.對(duì)話框的分類(lèi)

  • 模式對(duì)話框
    當(dāng)對(duì)話框顯示時(shí),會(huì)禁止其他窗口和用戶進(jìn)行交互
  • 無(wú)模式對(duì)話框/非模式對(duì)話框
    當(dāng)窗口顯示后,其他窗口仍可以與用戶進(jìn)行交互

2.對(duì)話框的基本使用

  • 1.對(duì)話框消息處理函數(shù)
    我們?cè)谇懊娴恼鹿?jié)中講解過(guò)在系統(tǒng)內(nèi)核中,局部窗口類(lèi),全局窗口類(lèi),系統(tǒng)窗口類(lèi)的保存方式,這個(gè)對(duì)話框處理函數(shù),就是保存于系統(tǒng)窗口類(lèi),我們給出一張圖來(lái)幫助大家理解:
    【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建
    我們來(lái)看看對(duì)話框窗口處理函數(shù)的過(guò)程:
    我們來(lái)通過(guò)一段偽代碼來(lái)講解:
缺省函數(shù)(。。。){
.....       //系統(tǒng)定義好的處理過(guò)程
if(DigProc){
我們自己寫(xiě)的窗口消息處理函數(shù)。
return 。。。;
}
......        //后續(xù)的缺省消息處理過(guò)程

};
  • 2.注冊(cè)窗口類(lèi)(程序員一般不適用)
  • 3.創(chuàng)建對(duì)話框
  • 4.對(duì)話框的關(guān)閉

2.自定義對(duì)話框窗口消息處理函數(shù)

既然我們可以自己定義回調(diào)函數(shù),那么我們來(lái)看看在對(duì)話框中我們到底該怎么編寫(xiě)回調(diào)函數(shù):
MSDN官方文檔解釋DigProc回調(diào)函數(shù)

  • 應(yīng)用程序定義的回調(diào)函數(shù)與CreateDialoc函數(shù)和DialocBox函數(shù)系列一起使用(我們后文會(huì)講到)。它處理發(fā)送到模式或無(wú)模式對(duì)話框的消息。DLGPROC類(lèi)型定義指向此回調(diào)函數(shù)的指針。
  • 語(yǔ)法:
    INT_PTR DlgProc( HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){...}
    其中,hWnd指定對(duì)話框的句柄,uMsg是消息,wParam和lParam都是消息的附加信息。
    一般情況下,如果此回調(diào)函數(shù)(我們自定義的回調(diào)函數(shù))處理了消息,則對(duì)話框過(guò)程應(yīng)返回TURE,如果未處理,則返回FALSE。如果對(duì)話框過(guò)程返回FALSE,對(duì)話管理器將執(zhí)行默認(rèn)對(duì)話操作以響應(yīng)消息。

二.模式對(duì)話框

- 1.創(chuàng)建對(duì)話框

通過(guò)DialogBox函數(shù)來(lái)創(chuàng)建,我們來(lái)看看這個(gè)函數(shù):
MSDN官方文檔解釋DialogBox函數(shù)

  • 函數(shù)功能:從對(duì)話框模板資源創(chuàng)建模式對(duì)話框

語(yǔ)法:

void DialogBox(
	HINSTANCE hInstance,          //包含對(duì)話框模板的模塊的句柄
	LPCTSTR lpTemplate,           //對(duì)話框模板
	HWND hWndparent,              //擁有對(duì)話框的窗口句柄
	DIGPROC lpDialogFunc          //指向?qū)υ捒蜻^(guò)程的指針
};

DialogBox函數(shù)是一個(gè)阻塞函數(shù),只有當(dāng)對(duì)話框關(guān)閉后,才會(huì)返回,執(zhí)行后續(xù)代碼
返回值通過(guò)EndDialog函數(shù)設(shè)置

- 2.對(duì)話框的關(guān)閉

關(guān)閉模式對(duì)話框,使用EndDialog函數(shù),不能使用DwstroyWindow函數(shù)(原因我們后文會(huì)講到)。
MSDN官方文檔解釋EndDialog函數(shù)

  • 函數(shù)功能:銷(xiāo)毀模式對(duì)話框,導(dǎo)致系統(tǒng)結(jié)束對(duì)對(duì)話框的任何處理
  • 語(yǔ)法:
BOOL EndDialog(
	HWND hDlg,              //要銷(xiāo)毀的對(duì)話框的句柄
	INT_PTR nResult         //要從創(chuàng)建對(duì)話框的函數(shù)返回到應(yīng)用程序的值
);

注意這里的nResult參數(shù),它是DialogBox函數(shù)退出時(shí)的返回值,我們前面講到DialogBox是一個(gè)阻塞函數(shù),我們可以通過(guò)EndDialog函數(shù)來(lái)設(shè)置DialogBox函數(shù)返回的值,通過(guò)不同的返回值,我們可以做不同的事。

- 3.對(duì)話框消息

WM_INITDIALOG–對(duì)話框創(chuàng)建之后,在對(duì)話框顯示之前,通知對(duì)話框窗口處理函數(shù)的消息,我們可以在此消息中完成自己初始化相關(guān)的工作。

三.模式對(duì)話框創(chuàng)建過(guò)程實(shí)踐

我們來(lái)帶領(lǐng)大家一步一步創(chuàng)建模式對(duì)話框:

  • 1.我們需要模式對(duì)話框,首先我們肯定需要一個(gè)菜單資源,我這里用的是之前文章內(nèi)容中的菜單資源,怎樣添加資源,如果大家不會(huì)的話可以到Windows編程資源,菜單資源,圖標(biāo)資源,光標(biāo)資源,上下文菜單,字符串資源,加速鍵資源
    文章中學(xué)習(xí)。
    【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建
  • 2.創(chuàng)建了菜單資源后,我們還需要做出一個(gè)i對(duì)話框資源:
    添加->資源->Dialog資源
    這里我就使用程序初始化時(shí)的模式對(duì)話框了,至于模式對(duì)話框之后的創(chuàng)建按鈕,我們后續(xù)會(huì)講到
    【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建
  • 3.做好前兩步之后,我們來(lái)到普通窗口回調(diào)函數(shù)來(lái)處理消息,我們的需求是當(dāng)點(diǎn)擊菜單中的關(guān)于按鈕后,出現(xiàn)這個(gè)模式對(duì)話框
    我們先來(lái)到普通窗口的回調(diào)函數(shù)來(lái)處理點(diǎn)擊幫助按鈕的消息:這里給出的是命令消息的全部處理,幫助按鈕的消息處理在第三個(gè)分支
case WM_COMMAND: {
		switch(LOWORD(wParam)) {
			case MY_OPEN: {
				sprintf(output, "打開(kāi)按鈕被點(diǎn)擊,請(qǐng)到回調(diào)函數(shù)中做具體處理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
			case MY_QUIT: {
				sprintf(output, "退出按鈕被點(diǎn)擊,請(qǐng)到回調(diào)函數(shù)中做具體處理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
			case IDM_ABOUT: {
				sprintf(output, "幫助按鈕被點(diǎn)擊,請(qǐng)到回調(diào)函數(shù)中做具體處理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				int nResult = DialogBox(hIns, (char*)IDD_ABOUTBOX, hwnd, DiaLogProc);
				if (nResult == 100) {
					MessageBox(hwnd, "Success", "Infor", MB_OK);
				}
			}
			case MY_NEWFILE: {
				sprintf(output, "打開(kāi)新文件按鈕被點(diǎn)擊,請(qǐng)到回調(diào)函數(shù)中做具體處理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
			case MY_LASTTIMEFILE: {
				sprintf(output, "上次打開(kāi)文件按鈕被點(diǎn)擊,請(qǐng)到回調(diào)函數(shù)中做具體處理。\n");
				WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
				break;
			}
		}
		break;
	}

我們來(lái)看看處理效果:
【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建
我們?cè)诔绦蜻\(yùn)行起來(lái)之后,我們發(fā)現(xiàn)一個(gè)問(wèn)題:程序無(wú)法退出,這時(shí)候我們就需要來(lái)到模式對(duì)話框的回調(diào)函數(shù)來(lái)處理這個(gè)關(guān)閉模式對(duì)話框的消息了:

INT CALLBACK DiaLogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg){
	case WM_SYSCOMMAND:{
		if (wParam = WM_CLOSE) {
			EndDialog(hwndDlg, 100);
		}
		break;
		}
	}
	return FALSE;
}

這時(shí)候我們發(fā)現(xiàn)就可以正常退出程序了。

四.無(wú)模式對(duì)話框

  • 創(chuàng)建對(duì)話框:
HWND CreateDialog(
	HINSTANCE hInstance,          //包含對(duì)話框模板的模塊句柄
	LPCTSTR lpTemplate,           //對(duì)話框模板
	HWND hWndParent,              //擁有對(duì)話框的窗口句柄
	DLGPROC lpDialogFunc          //指向?qū)υ捒蜻^(guò)程的指針
);

MSDN官方文檔解釋CreateDialog函數(shù)
該函數(shù)為非阻塞函數(shù),創(chuàng)建成功后返回窗口句柄,需要使用ShowWindow函數(shù)來(lái)顯示對(duì)話框

  • 非模式對(duì)話框的關(guān)閉:
    關(guān)閉非模式對(duì)話框,需要使用DestroyWindow函數(shù)來(lái)銷(xiāo)毀窗口,不能使用EndDialog函數(shù)來(lái)關(guān)閉對(duì)話框。

今天的分享就到這里,如果文章中有錯(cuò)誤之處,還請(qǐng)大家指出來(lái),我會(huì)非常虛心地學(xué)習(xí),希望我們共同進(jìn)步?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-438171.html

到了這里,關(guān)于【windows編程之對(duì)話框】對(duì)話框原理,對(duì)話框的創(chuàng)建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MFC基于對(duì)話框——仿照Windows計(jì)算器制作C++簡(jiǎn)易計(jì)算器

    MFC基于對(duì)話框——仿照Windows計(jì)算器制作C++簡(jiǎn)易計(jì)算器

    目錄 一、界面設(shè)計(jì) 二、設(shè)置成員變量 三、初始化成員變量? 四、初始化對(duì)話框 ?五、添加控件代碼 1.各個(gè)數(shù)字的代碼(0~9) 2.清除功能的代碼 3.退格功能的代碼 4.加減乘除功能的代碼 5.小數(shù)點(diǎn)功能的代碼 6.正負(fù)號(hào)功能的代碼 7.等于功能的代碼 六、源碼領(lǐng)取方式 制作好之后

    2024年02月05日
    瀏覽(97)
  • .net-----Windows 窗體應(yīng)用程序包括控件,對(duì)話框,多重窗體,繪制圖形,菜單和工具欄

    .net-----Windows 窗體應(yīng)用程序包括控件,對(duì)話框,多重窗體,繪制圖形,菜單和工具欄

    Windows窗體應(yīng)用程序概述; ? 使用Visual Studio開(kāi)發(fā)Windows窗體應(yīng)用程序; ? 窗體和控件概述; ? 使用常用Windows窗體控件; ? 通用對(duì)話框; ? 菜單和工具欄; ? 多重窗體; ? 多文檔界面; ? 繪制圖形 Windows窗體應(yīng)用程序是運(yùn)行在用戶計(jì)算機(jī)本地的基于Windows的應(yīng)用程序,

    2024年02月04日
    瀏覽(26)
  • python圖形界面化編程GUI(三)事件綁定(鼠標(biāo)和鍵盤(pán)、OptionMenu、scale、顏色、文件對(duì)話框、菜單和工具欄、ttk子模塊)

    python圖形界面化編程GUI(三)事件綁定(鼠標(biāo)和鍵盤(pán)、OptionMenu、scale、顏色、文件對(duì)話框、菜單和工具欄、ttk子模塊)

    Tkinter類(lèi) 名稱(chēng) 簡(jiǎn)介 Toplevel 頂層 容器類(lèi),可用于為其他組件提供單獨(dú)的容器,類(lèi)似于窗口 Button 按鈕 代表按鈕組件 Canvas 畫(huà)布 提供繪圖功能,包括直線、矩形、橢圓、多邊形、位圖等 Entry 單行輸入框 用戶可輸入內(nèi)容 Frame 容器 用于裝載其他GUI組件 Label 標(biāo)簽 用于顯示不可編輯

    2024年02月12日
    瀏覽(22)
  • 對(duì)話框之模式對(duì)話框與無(wú)模式對(duì)話框以及自定義消息

    對(duì)話框之模式對(duì)話框與無(wú)模式對(duì)話框以及自定義消息

    模式對(duì)話框 創(chuàng)建模式對(duì)話框步驟 創(chuàng)建模式對(duì)話框模板 IDD_COptionsDialog 構(gòu)造一個(gè)CDialog對(duì)象,并封裝對(duì)話框模板 調(diào)用CDialog:Domal()顯示對(duì)話框 無(wú)模式對(duì)話框 創(chuàng)建對(duì)話框模板 IDD_COptionsDialog 構(gòu)造一個(gè)CDialog對(duì)象,并封裝進(jìn)對(duì)話框模板 單擊菜單項(xiàng)顯示無(wú)模式對(duì)話框

    2024年02月10日
    瀏覽(114)
  • 【Qt】對(duì)話框QDialog類(lèi),模態(tài)對(duì)話框和非模態(tài)對(duì)話框

    【Qt】對(duì)話框QDialog類(lèi),模態(tài)對(duì)話框和非模態(tài)對(duì)話框

    QDialog類(lèi)是所有對(duì)話框窗口類(lèi)的基類(lèi)。對(duì)話框窗口是一個(gè)用來(lái)完成短小任務(wù)或和用戶進(jìn)行簡(jiǎn)單交互的 頂層窗口 。 按照運(yùn)行對(duì)話框時(shí)是否還可以和該程序的其它窗口進(jìn)行交互,將它分為兩類(lèi):模態(tài)(modal)對(duì)話框和非模態(tài)(modaless)對(duì)話框。 模態(tài)對(duì)話框 先看一個(gè)例子: 創(chuàng)建一

    2024年02月05日
    瀏覽(101)
  • MFC 通用對(duì)話框之文件對(duì)話框

    MFC 通用對(duì)話框之文件對(duì)話框

    CFileDialog 類(lèi) 封裝了Windows通用文件對(duì)話框,Windows通用文件對(duì)話框提供了輕松實(shí)現(xiàn)與Windows標(biāo)準(zhǔn)一致的打開(kāi)文件、保存文件、另存文件對(duì)話框的方法。 當(dāng)我們用CFileDialog類(lèi)的構(gòu)造函數(shù)生成一個(gè)對(duì)象后就修改 m_ofn 結(jié)構(gòu)體對(duì)象里的值, m_ofn 的類(lèi)型為 OPENFILENAME。 CFileDialog類(lèi)構(gòu)造函數(shù)的

    2024年02月05日
    瀏覽(105)
  • MFC 通用對(duì)話框之顏色對(duì)話框

    MFC 通用對(duì)話框之顏色對(duì)話框

    CColorDialog類(lèi)封裝了顏色對(duì)話框,此類(lèi)允許您將顏色選擇對(duì)話框合并到應(yīng)用程序中。顏色對(duì)話框就像畫(huà)家的調(diào)色板一樣,可顯示系統(tǒng)定義的顏色列表,用戶可以從列表中選擇或創(chuàng)建特定顏色。構(gòu)造一個(gè)CColorDialog類(lèi)對(duì)象后,可用 DoModal( ) 函數(shù)來(lái)顯示顏色對(duì)話框。 CColorDialog 的構(gòu)造

    2024年02月06日
    瀏覽(89)
  • Qt對(duì)話框——QInputDialog輸入對(duì)話框

    Qt對(duì)話框——QInputDialog輸入對(duì)話框 在Qt開(kāi)發(fā)中,我們有時(shí)需要通過(guò)一個(gè)對(duì)話框獲取用戶的輸入,而QInputDialog就是Qt框架提供的一種方便地彈出輸入對(duì)話框并獲取用戶輸入數(shù)據(jù)的方式。 QInputDialog使用非常簡(jiǎn)單,我們可以通過(guò)訪問(wèn)不同的接口來(lái)彈出輸入對(duì)話框獲取多種類(lèi)型的返回

    2024年02月12日
    瀏覽(92)
  • Qt標(biāo)準(zhǔn)對(duì)話框:8大對(duì)話框詳解

    Qt標(biāo)準(zhǔn)對(duì)話框:8大對(duì)話框詳解

    顏色對(duì)話框類(lèi) QColorDialog 提供了一個(gè)可以獲取指定顏色的對(duì)話框的對(duì)話框部件: 這里使用 QColorDialog 的靜態(tài)函數(shù) getColor () 來(lái)獲取顏色,執(zhí)行時(shí)彈出顏色選擇對(duì)話框: 返回的是一個(gè) QColor 類(lèi)型的數(shù)據(jù): 這四個(gè)數(shù)值分別代表:透明度(alpha)、Red、Green、Blue。它們的默認(rèn)值都是

    2024年02月03日
    瀏覽(102)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包