程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Win32開發入門(18):使用對話框的兩個技巧

Win32開發入門(18):使用對話框的兩個技巧

編輯:關於C++

相信大家知道對話框怎麼用了,就是先用“資源編輯器”設計一個對話框,然後在代碼中加載處理 。今天,我向大家分享兩個使用對話框的技巧,還是比較實用的。不用擔心,先喝杯茶,很簡單的,一 點也不復雜,總之,看俺寫的博客,你不會有思想壓力的。放心好了。

這兩個技巧分別是:

1、在顯示某個對話框時,向對話框傳遞數據。

這個我相信大家能夠理解,就好比咱們 在做Web開發的時候,在打開一個頁面時,可能會考慮向目標頁面傳一些參數,如這樣http://www.牛 B.com/yyy.aspx?tid=19999,是吧,我們都很經常這樣做,所以,在玩Win32的時候,我們也同樣希望 這樣。

我們知道,要顯示一個模態對話框,可以調用DialogBox函數,這個不難,我有理由相信 大家只需稍稍研究一下,一定會玩的,就像遙控飛機那麼簡單。如果你認真閱讀MSDN,你一定會發現有 這麼一個函數:DialogBoxParam。怎麼樣,是不是和前面的那個DialogBox很像,只是腦袋後面多了幾 根汗毛罷了,而且,從Param就可以猜到,應該與參數傳遞有關。對,猜得相當好,我們在顯示某個對 話框時,要向對話框傳參數,就是用它了。

順便提一下,什麼是模態對話框呢?模態對話框就 是說如果這個對話框彈出來(顯示)了,你就不能操作父窗口或者其上面的控年了,程序也會在彈出對 話框後停下,直到操作完成了,你把對話框關了,程序才會繼續,你才能操作其他控件,就好像你開車 上班,行駛到某個路口,前面有幾輛車突然停了下來,車上下來一群不男不女的人,在馬路上打起架來 了,導致交通嚴重受阻,你的車夾在車流中間,既不前進,也不能後退,就卡在那裡,你估計只好呆在 車裡,拿出MP5,看看恐怖片,等到交通恢復正常了,才能繼續行車。

看看這個DialogBoxParam 函數的定義:

INT_PTR WINAPI DialogBoxParam(     
  _In_opt_  HINSTANCE hInstance,     
  _In_      LPCTSTR lpTemplateName,     
  _In_opt_  HWND hWndParent,     
  _In_opt_  DLGPROC lpDialogFunc,     
  _In_      LPARAM dwInitParam     
);

前面幾個參數估計不用我介紹了,大家都認識,比周傑倫和刀郎還要出名。重點是最後一 個參數,它是一個LPARAM類型的,我記得Win32的許多類型的命名是有規律的,你看看,凡是P開頭或者 LP開頭都是指針類型,不信你可以總結一下。

所以這個參數肯定是指定某種未知生物的指針, 指針存的是地址,所以我們通過把我們要傳給對話框的數據的地址傳給這個參數,這樣,對話框的消息 處理函數如果想取到你傳給它的數據,就從這個地址去找。就好像你同學介紹了一位美女給你認識,他 告訴你這位MM的QQ號,然後你想泡她你就知道怎麼做了,加QQ聊呗。

那麼,這個參數會傳到哪 裡去呢,怎麼取出來呢?這個參數傳給了WM_INITDIALOG消息的lParam參數,所以,在對話框的消息處 理函數中,捕捉WM_INITDIALOG消息,從它的lParam參數就可以找到數據的首地址了。

顯示對話 框並傳遞參數。

DialogBoxParam(glo_hInst,     
    MAKEINTRESOURCE(IDD_DLG1),     
    hwnd,     
    (DLGPROC)DialogProcWithPrm,     
    (LPARAM)L"Win32程序好玩不?");

我傳遞了一些文本給它,即“Win32程序好玩不?” ,接著在響應WM_INITDIALOG消息時就接收並顯示這個參數。

switch (uMsg)     
{     
case WM_INITDIALOG:     
    {     
        LPCWSTR param = (LPCWSTR)lParam;     
        //取得顯示文本控件的句柄     
        HWND stDisplay = GetDlgItem(hwndDlg, IDC_STINFO);     
        //設置文本     
        SendMessage(stDisplay, WM_SETTEXT, NULL, (WPARAM)param);     
    }     
    return 0;

哈哈,不難吧。

2、獲取對話框返回的數據。

前面是傳數據給 對話框,現在要反過來,是獲得從對話框傳回來的數據。剛才我們說了,模態對話框顯示時,父窗口會 在等待,等啥,就是等DialogBox返回,它返回的類型是INT_PTR,所以,如果要返回比較復雜的數據, 可以用它來保存指針,因為指針本質上就是一個數值。

// 顯示對話框並取得返回的數據     
LPCWSTR returnData = (LPCWSTR)DialogBox(glo_hInst,MAKEINTRESOURCE(IDD_DLG2),hwnd,

(DLGPROC)DialogProcWithRtVl);     
if(returnData != NULL)     
{     
    //先將字符拷貝一次     
    WCHAR str[100];     
    wcscpy(str, returnData);     
    //顯示從對話框返回的內容     
    MessageBox(hwnd, str, L"從對話框返回的數據", MB_OK);     
}     
break;

我這個例子是在對話框中輸入一些字符,然後把這些字符串返回。所以,返回的內容 是指向字符數組首地址的指針,故我直接把它轉換為LPCWSTR類型的變量。

在對話框中,調用 EndDialog結束對話框,並在第二個參數中傳回數據。

if(LOWORD(wParam)== IDOK)     
{     
    //獲得Edit編輯框的句柄     
    HWND hEdit = GetDlgItem(hwndDlg, IDC_EDTIN);     
    //獲得文本     
    WCHAR wText[100];     
    int len = Edit_GetText(hEdit, wText, 100);     
    EndDialog(hwndDlg, (INT_PTR)wText);//退出對話框並返回數據     
}

例子運行之後的結果可以看看下面的截圖。

示例源代碼隨後我上傳到資源區,有興趣的朋友可以下載來玩一 下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved