目錄
資源描述表中對話框定義
模態對話框
非模態對話框
MessageBox
(本章節中例子都是用 VS2005 編譯調試的)
資源描述表中對話框定義
格式:
- 對話框名 DIALOG[載入特性] X,Y,Width,Height[設置選項]
{
對話框控件定義;
}
說明:
- 對話框名稱: 標識對話框資源,可為一個字符串也可以為1~65535之間的任何數
- DIALOG: 關鍵字
- 載入特性: 對話框資源的載入特性選項與菜單資源相同
- X,Y,Width,Height:
- X,Y: 為對話框左上角坐標
- Width,Height: 為寬與高
- 設置選項:
- 常用的有CAPTION(標題)和STYLE(樣式)
- 對話框的樣式選項決定了對話框資源外形特點,windows還提供了一些對話框特點樣式:
- DS_SDLOOK: 使用三維邊框
- DS_CENTERMOUSE: 鼠標點作為對話框中心
- DS_FIXEDSYS: 使用SYSTEM_FIXED字體
- DS_CENTER: 對話框居中
- DS_MODALFRAME: 使用細實線邊框
- DS_SETFOREGROUND: 置對話框前台
- DS_SYSMODAL: 系統模態對話框
- 對於窗口對話框樣式,它還包含窗口樣式的選項,經常把它的樣式和窗口樣式組合起來一起用(例如 DS_MODALFRAME | WS_POPUP | WS_CAPTION)
- 控件定義
- CHECKBOX: 復選框
- LISTBOX: 列表框
- COMBOBOX: 組合框
- LTEXT: 文本右對齊的靜態控件
- CTEXT: 文本居中的靜態控件
- PUSHBUTTON: 按鈕
- DEFPUSHBUTTON: 默認按鈕
- RADIOBUTTON: 單選按鈕
- EDIT: 編輯框
- RTEXT: 文本右對齊的靜態控件
- GROUPBOX: 組框
- SCROLLBAR: 滾動條
- ICON: 圖標
模態對話框
步驟:
- 創建模態對話框: DialogBox
- 對話框回調函數設計
- 結束時銷毀對話框: EndDialog
流程圖如下圖所示:
回調函數設計模型:
//設計對話框回調函數 //回調函數模型 BOOL CALLBACK DialogProc( HWND hwndDlg, // handle to dialog box該對話框句柄 UINT uMsg, // message WPARAM wParam,// first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_INITDIALOG: ……; break; case WM_COMMAND switch(LOWORD(wParam)) { case ……: …… ; break; case ……: …… ; break; …… ; } break; } Return 0; }
與窗口的區別:
窗口(Windows) 對話框(Dialog)
函數返回值 返回LRESULT值 返回BOOL
消息處理 不處理WM_CREAT,WM_DESTORY,WM_PAINT
不處理消息的處理 調用DefWindowProc處理程序不處理的消息 對話框直接返回FALSE(return 0)
對話框處理的主要消息:
- WM_INITDIALOG消息 對話框初始化時候做的一些處理操作
- WM_COMMAND消息 響應對話框上得控件的一些處理操作
代碼樣例:
對話框 .rc 資源:
IDD_DIALOG1 DIALOGEX 0, 0, 187, 96 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "對話框" FONT 10, "System", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "確定",IDOK,77,75,50,14 PUSHBUTTON "取消",IDCANCEL,130,75,50,14 EDITTEXT IDC_EDIT1,7,22,173,30,ES_AUTOHSCROLL END
創建對話框:
//創建對話框 DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,dialogFunc); 回調函數設計: switch(msg) { //初始對話框 case WM_INITDIALOG: break; //控件處理 case WM_COMMAND: switch(LOWORD(wParam)) { //按下確定按鈕處理 case IDOK: EndDialog(hwndDlg,1); return 0; break; //按下取消按鈕處理 case IDCANCEL: EndDialog(hwndDlg,1); return 0; break; } break; //關閉按鈕處理 case WM_CLOSE: EndDialog(hwndDlg,1); }
程序源碼:

#include<windows.h> #include"resource.h" BOOL CALLBACK dialogFunc( HWND hwndDlg, // handle to dialog box UINT msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window ) { DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,dialogFunc); return 0; } BOOL CALLBACK dialogFunc( HWND hwndDlg, // handle to dialog box UINT msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(msg) { //初始對話框 case WM_INITDIALOG: break; //控件處理 case WM_COMMAND: switch(LOWORD(wParam)) { //按下確定按鈕處理 case IDOK: EndDialog(hwndDlg,1); return 0; break; //按下取消按鈕處理 case IDCANCEL: EndDialog(hwndDlg,1); return 0; break; } break; //關閉按鈕處理 case WM_CLOSE: EndDialog(hwndDlg,1); } return 0; }
運行結果:
非模態對話框
步驟:
- 創建對話框 CreateDialog (但是對話框並不會顯示)
- 對話框回調函數設計
- 顯示與更新對話框窗口(顯示對話框窗口 ShowWindow,更新對話框窗口 UpdateWindow)
- 更改父窗口的消息循環(在消息轉換 TranslateMessage 前,先把消息進行判斷是否是對話框消息 IsDialogMessage)
- 結束時銷毀對話框 DestroyWindow
流程圖如下:
回調函數設計與模態回調函數設計類似
模態對話框和非模態對話框的區別:
- 模態對話框創建后一定要在用戶關閉對話框后,其父窗口才能響應用戶操作否則父窗口便無法響應任何用戶操作.
- 非模態對話框則是創建完后其父窗口不需要像模態窗口那樣等到對話框關閉才能響應用戶操作,一樣可以在對話框未關閉前響應用戶操作
代碼示例:
對話框 .rc 資源:
IDD_DIALOG1 DIALOGEX 0, 0, 187, 96 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "對話框" FONT 10, "System", 0, 0, 0x0 BEGIN DEFPUSHBUTTON "確定",IDOK,77,75,50,14 PUSHBUTTON "取消",IDCANCEL,130,75,50,14 EDITTEXT IDC_EDIT1,7,22,173,30,ES_AUTOHSCROLL END
創建對話框:
hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)dialogFunc);
顯示更新對話框:
//顯示對話框 ShowWindow(hdlg,nCmdShow); //更新對話框 UpdateWindow(hdlg);
更改父窗口消息循環:
while(GetMessage(&msg,NULL,0,0)) { //判斷是否是為對話框消息 if(!IsDialogMessage(hdlg,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
回調函數設計(同模態對話框一樣)
程序源碼:

#include<windows.h> #include"resource.h" LRESULT CALLBACK textprom( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); BOOL CALLBACK dialogFunc( HWND hwndDlg, // handle to dialog box UINT msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window ) { WNDCLASS wndclass; MSG msg; HWND hwnd,hdlg; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hIcon=LoadIcon(NULL,IDI_ERROR); wndclass.hInstance=hInstance; wndclass.lpfnWndProc=textprom; wndclass.lpszClassName="text"; wndclass.lpszMenuName=NULL; wndclass.style=CS_HREDRAW | CS_VREDRAW; if(!RegisterClass(&wndclass)) { MessageBox(NULL,"create windows error!","error",MB_OK | MB_ICONSTOP); } hwnd = CreateWindow("text","hellow world",WS_DLGFRAME | WS_MINIMIZEBOX | WS_SYSMENU,0,0, 500,300,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); //創建對話框 hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)dialogFunc); //顯示更新對話框 ShowWindow(hdlg,nCmdShow); UpdateWindow(hdlg); while(GetMessage(&msg,NULL,0,0)) { if(!IsDialogMessage(hdlg,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } LRESULT CALLBACK textprom( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } } BOOL CALLBACK dialogFunc( HWND hwndDlg, // handle to dialog box UINT msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(msg) { case WM_INITDIALOG: break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: DestroyWindow(hwndDlg); return 0; case IDCANCEL: DestroyWindow(hwndDlg); return 0; } break; case WM_CLOSE: DestroyWindow(hwndDlg); } return 0; }
運行結果:
MessageBox
函數說明: Windows消息對話框是模態對話框的一種特殊形式,應用程序可以通過調用函數MessageBox來快捷生成一些簡單又常用的Windows消息框.
函數原型:
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
uType說明:
指定一組位標志,來確定對話框的內容和行為.
- 用於指定對話框的按鈕樣式:
Flag Meaning MB_ABORTRETRYIGNORE 三個按鈕: 終止, 重試, 忽略. MB_OK 一個按鈕: 確定. MB_OKCANCEL 兩個按鈕: 確定,取消. MB_RETRYCANCEL 兩個按鈕: 重試,取消. MB_YESNO 兩個按鈕: 是,否. MB_YESNOCANCEL 三個按鈕: 是, 否, 取消. - 用於指定對話框中的圖標樣式:
Flag Meaning MB_ICONEXCLAMATION
MB_ICONWARNINGMB_ICONINFORMATION
MB_ICONASTERISKMB_ICONQUESTION MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND - 用於指定默認缺省按鈕:
Flag Meaning MB_DEFBUTTON1 缺省按鈕為第一個按鈕 MB_DEFBUTTON2 缺省按鈕為第二個按鈕 MB_DEFBUTTON3 缺省按鈕為第三個按鈕 MB_DEFBUTTON4 缺省按鈕為第四個按鈕 - 用於指定對話框的形態:
Flag Meaning MB_APPLMODAL 引用程序對話框(創建的是非模態的對話框) MB_SYSTEMMODAL 系統對話框(對話框會保持於窗體 z_order 的頂層) MB_TASKMODAL 任務對話框(創建的是模態的對話框)
代碼樣例:
創建具有是否按鈕和問好圖標的消息框,並且消息框為模態對話框:
MessageBox(NULL,"hello","test",MB_YESNO|MB_ICONQUESTION|MB_TASKMODAL);
程序結果: