Windows API一日一練(17)DialogBox和DialogBoxParam函數

來源:互聯網
上載者:User
 對話方塊是比較常用的視窗,比如當你想讓使用者輸入一些參數時就可以使用對話方塊。或者提示一些警告的資訊,都是可以使用對話方塊的。比如當你拷貝檔案時,Windows就會提示一個拷貝檔案的進度對話方塊。對話方塊的使用範圍比較廣,並且它在設計時就可以看到啟動並執行結果模樣,這樣方便設計。但對話方塊又分為兩類,一種對話方塊運行後,一定要使用者關閉那個對話方塊後才能返回到父視窗;一種對話方塊是不需要關閉後就可以直接返回父視窗。因此,軟體開發人員就要考慮這個對話方塊的結果是否會影響後面的操作,如果這個對話方塊的結果跟後面的操作沒有因果關係的,可以設定為第二種對話方塊。像拷貝檔案的對話方塊就是第二種的對話方塊,稱作無模式的對話方塊。如果設定為第一類,非要等那裡拷貝檔案才可以去操作其它東西,那麼Windows就不方便使用了,這樣會浪費大量的時間。讓人等待,就是一個不好用的軟體,所以軟體開發人員設計軟體時,要站在使用者的立場思考問題,在保持軟體正確的情況下,不要讓人等待,任何讓人等待超過20秒以上的軟體,會讓使用者煩躁不安。如果非要等待的話,也要加入進度條對話方塊提示,這樣可以有效地緩解使用者煩躁不安的心情。這就跟你去銀行排隊時,可以坐在那裡看著電視,感覺不到時間長的道理一樣的。

函數DialogBox函數和DialogBoxParam函式宣告如下:
#define DialogBoxA(hInstance, lpTemplate, hWndParent, lpDialogFunc) /
DialogBoxParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)

#define DialogBoxW(hInstance, lpTemplate, hWndParent, lpDialogFunc) /
DialogBoxParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)

#ifdef UNICODE
#define DialogBox DialogBoxW
#else
#define DialogBox DialogBoxA
#endif // !UNICODE

WINUSERAPI
INT_PTR
WINAPI
DialogBoxParamA(
   __in_opt HINSTANCE hInstance,
    __in LPCSTR lpTemplateName,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);

WINUSERAPI
INT_PTR
WINAPI
DialogBoxParamW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpTemplateName,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);

#ifdef UNICODE
#define DialogBoxParam DialogBoxParamW
#else
#define DialogBoxParam DialogBoxParamA
#endif // !UNICODE
hInstance是當前應用程式的執行個體控制代碼。
lpTemplateName是對話方塊的資源模板。
hWndParent是父視窗的控制代碼。
lpDialogFunc是對話方塊的訊息處理函數。
      dwInitParam是初始化參數,這裡預設設定為0。

調用這個函數的例子如下:
#001 //
#002 // 目的: 處理主視窗的訊息.
#003 //
#004 // 蔡軍生 2007/07/12   QQ:9073204
#005 //
#006 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
#007 {
#008  int wmId, wmEvent;
#009  PAINTSTRUCT ps;
#010  HDC hdc;
#011
#012  switch (message)
#013  {
#014  case WM_COMMAND:
#015         wmId    = LOWORD(wParam);
#016         wmEvent = HIWORD(wParam);
#017         // 菜單選項命令響應:
#018         switch (wmId)
#019         {
#020         case IDM_ABOUT:
#021               DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
#022               break;
#023         case IDM_EXIT:
#024               DestroyWindow(hWnd);
#025               break;
#026         default:
#027               return DefWindowProc(hWnd, message, wParam, lParam);
#028         }
#029         break;
#030  case WM_PAINT:
#031         hdc = BeginPaint(hWnd, &ps);
#032         //
#033         EndPaint(hWnd, &ps);
#034         break;
#035  case WM_DESTROY:
#036         PostQuitMessage(0);
#037         break;
#038  default:
#039         return DefWindowProc(hWnd, message, wParam, lParam);
#040  }
#041  return 0;
#042 }
第21行就是調用函數DialogBox來顯示對話方塊視窗。

對話方塊的模板如下:
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUTBOX DIALOGEX 22, 17, 230, 75
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "關於"
FONT 9, "新宋體", 400, 0, 0x86
BEGIN
    ICON            IDI_TESTWIN,IDC_MYICON,14,9,21,21
    LTEXT           "TestWin Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2007",IDC_STATIC,49,20,119,8
    DEFPUSHBUTTON   "確定",IDOK,185,51,38,16,WS_GROUP
END

IDD_ABOUTBOX是對話方塊模板的名稱。
DIALOGEX是對話方塊定義的關鍵字。
22, 17, 230, 75是對話方塊的座標和大小。
STYLE是設定對話方塊的顯示類型。
CAPTION是定義標題名稱。這裡是"關於"。
FONT是定義對話的字型。
ICON是定義一個表徵圖顯示。
LTEXT是定義顯示靜態文本。
DEFPUSHBUTTON是定義一個按鈕。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.