跟我一起玩Win32开发(18):使用对话框的两个技巧
相信大家知道對(duì)話框怎么用了,就是先用“資源編輯器”設(shè)計(jì)一個(gè)對(duì)話框,然后在代碼中加載處理。今天,我向大家分享兩個(gè)使用對(duì)話框的技巧,還是比較實(shí)用的。不用擔(dān)心,先喝杯茶,很簡(jiǎn)單的,一點(diǎn)也不復(fù)雜,總之,看俺寫(xiě)的博客,你不會(huì)有思想壓力的。放心好了。
?
這兩個(gè)技巧分別是:
1、在顯示某個(gè)對(duì)話框時(shí),向?qū)υ捒騻鬟f數(shù)據(jù)。
這個(gè)我相信大家能夠理解,就好比咱們?cè)谧鯳eb開(kāi)發(fā)的時(shí)候,在打開(kāi)一個(gè)頁(yè)面時(shí),可能會(huì)考慮向目標(biāo)頁(yè)面?zhèn)饕恍﹨?shù),如這樣http://www.牛B.com/yyy.aspx?tid=19999,是吧,我們都很經(jīng)常這樣做,所以,在玩Win32的時(shí)候,我們也同樣希望這樣。
我們知道,要顯示一個(gè)模態(tài)對(duì)話框,可以調(diào)用DialogBox函數(shù),這個(gè)不難,我有理由相信大家只需稍稍研究一下,一定會(huì)玩的,就像遙控飛機(jī)那么簡(jiǎn)單。如果你認(rèn)真閱讀MSDN,你一定會(huì)發(fā)現(xiàn)有這么一個(gè)函數(shù):DialogBoxParam。怎么樣,是不是和前面的那個(gè)DialogBox很像,只是腦袋后面多了幾根汗毛罷了,而且,從Param就可以猜到,應(yīng)該與參數(shù)傳遞有關(guān)。對(duì),猜得相當(dāng)好,我們?cè)陲@示某個(gè)對(duì)話框時(shí),要向?qū)υ捒騻鲄?shù),就是用它了。
順便提一下,什么是模態(tài)對(duì)話框呢?模態(tài)對(duì)話框就是說(shuō)如果這個(gè)對(duì)話框彈出來(lái)(顯示)了,你就不能操作父窗口或者其上面的控年了,程序也會(huì)在彈出對(duì)話框后停下,直到操作完成了,你把對(duì)話框關(guān)了,程序才會(huì)繼續(xù),你才能操作其他控件,就好像你開(kāi)車(chē)上班,行駛到某個(gè)路口,前面有幾輛車(chē)突然停了下來(lái),車(chē)上下來(lái)一群不男不女的人,在馬路上打起架來(lái)了,導(dǎo)致交通嚴(yán)重受阻,你的車(chē)夾在車(chē)流中間,既不前進(jìn),也不能后退,就卡在那里,你估計(jì)只好呆在車(chē)?yán)?#xff0c;拿出MP5,看看恐怖片,等到交通恢復(fù)正常了,才能繼續(xù)行車(chē)。
?
看看這個(gè)DialogBoxParam函數(shù)的定義:
INT_PTR WINAPI DialogBoxParam(_In_opt_ HINSTANCE hInstance,_In_ LPCTSTR lpTemplateName,_In_opt_ HWND hWndParent,_In_opt_ DLGPROC lpDialogFunc,_In_ LPARAM dwInitParam );前面幾個(gè)參數(shù)估計(jì)不用我介紹了,大家都認(rèn)識(shí),比周杰倫和刀郎還要出名。重點(diǎn)是最后一個(gè)參數(shù),它是一個(gè)LPARAM類型的,我記得Win32的許多類型的命名是有規(guī)律的,你看看,凡是P開(kāi)頭或者LP開(kāi)頭都是指針類型,不信你可以總結(jié)一下。
所以這個(gè)參數(shù)肯定是指定某種未知生物的指針,指針存的是地址,所以我們通過(guò)把我們要傳給對(duì)話框的數(shù)據(jù)的地址傳給這個(gè)參數(shù),這樣,對(duì)話框的消息處理函數(shù)如果想取到你傳給它的數(shù)據(jù),就從這個(gè)地址去找。就好像你同學(xué)介紹了一位美女給你認(rèn)識(shí),他告訴你這位MM的QQ號(hào),然后你想泡她你就知道怎么做了,加QQ聊唄。
那么,這個(gè)參數(shù)會(huì)傳到哪里去呢,怎么取出來(lái)呢?這個(gè)參數(shù)傳給了WM_INITDIALOG消息的lParam參數(shù),所以,在對(duì)話框的消息處理函數(shù)中,捕捉WM_INITDIALOG消息,從它的lParam參數(shù)就可以找到數(shù)據(jù)的首地址了。
?
顯示對(duì)話框并傳遞參數(shù)。
DialogBoxParam(glo_hInst,MAKEINTRESOURCE(IDD_DLG1),hwnd,(DLGPROC)DialogProcWithPrm,(LPARAM)L"Win32程序好玩不?");?我傳遞了一些文本給它,即“Win32程序好玩不?”,接著在響應(yīng)WM_INITDIALOG消息時(shí)就接收并顯示這個(gè)參數(shù)。
switch (uMsg){case WM_INITDIALOG:{LPCWSTR param = (LPCWSTR)lParam;//取得顯示文本控件的句柄HWND stDisplay = GetDlgItem(hwndDlg, IDC_STINFO);//設(shè)置文本SendMessage(stDisplay, WM_SETTEXT, NULL, (WPARAM)param);}return 0;哈哈,不難吧。
?
2、獲取對(duì)話框返回的數(shù)據(jù)。
前面是傳數(shù)據(jù)給對(duì)話框,現(xiàn)在要反過(guò)來(lái),是獲得從對(duì)話框傳回來(lái)的數(shù)據(jù)。剛才我們說(shuō)了,模態(tài)對(duì)話框顯示時(shí),父窗口會(huì)在等待,等啥,就是等DialogBox返回,它返回的類型是INT_PTR,所以,如果要返回比較復(fù)雜的數(shù)據(jù),可以用它來(lái)保存指針,因?yàn)橹羔槺举|(zhì)上就是一個(gè)數(shù)值。
// 顯示對(duì)話框并取得返回的數(shù)據(jù)LPCWSTR returnData = (LPCWSTR)DialogBox(glo_hInst,MAKEINTRESOURCE(IDD_DLG2),hwnd,(DLGPROC)DialogProcWithRtVl);if(returnData != NULL){//先將字符拷貝一次WCHAR str[100];wcscpy(str, returnData);//顯示從對(duì)話框返回的內(nèi)容MessageBox(hwnd, str, L"從對(duì)話框返回的數(shù)據(jù)", MB_OK);}break;我這個(gè)例子是在對(duì)話框中輸入一些字符,然后把這些字符串返回。所以,返回的內(nèi)容是指向字符數(shù)組首地址的指針,故我直接把它轉(zhuǎn)換為L(zhǎng)PCWSTR類型的變量。
?
在對(duì)話框中,調(diào)用EndDialog結(jié)束對(duì)話框,并在第二個(gè)參數(shù)中傳回?cái)?shù)據(jù)。
if(LOWORD(wParam)== IDOK){//獲得Edit編輯框的句柄HWND hEdit = GetDlgItem(hwndDlg, IDC_EDTIN);//獲得文本W(wǎng)CHAR wText[100];int len = Edit_GetText(hEdit, wText, 100);EndDialog(hwndDlg, (INT_PTR)wText);//退出對(duì)話框并返回?cái)?shù)據(jù)}?
例子運(yùn)行之后的結(jié)果可以看看下面的截圖。
?
?
示例源代碼隨后我上傳到資源區(qū),有興趣的朋友可以下載來(lái)玩一下。
總結(jié)
以上是生活随笔為你收集整理的跟我一起玩Win32开发(18):使用对话框的两个技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 宿舍管理系统(简单版)
- 下一篇: Attachments