對話方塊是比較常用的視窗,比如當你想讓使用者輸入一些參數時就可以使用對話方塊。或者提示一些警告的資訊,都是可以使用對話方塊的。比如當你拷貝檔案時,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是定義一個按鈕。