格公式:
- 对话框名称 DIALOG[负载特性] X,Y,Width,Height[设置选项]
{
对话框控件定义;
}
说明:
- 对话框名称: 标识对话框资源,可为一个字符串也能够为1~65535之间的不论什么数
- DIALOG: keyword
- 加载特性: 对话框资源的加载特性选项与菜单资源同样
- 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: button
- DEFPUSHBUTTON: 默认button
- RADIOBUTTON: 单选button
- 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)) { //按下确定button处理 case IDOK: EndDialog(hwndDlg,1); return 0; break; //按下取消button处理 case IDCANCEL: EndDialog(hwndDlg,1); return 0; break; } break; //关闭button处理 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)) { //按下确定button处理 case IDOK: EndDialog(hwndDlg,1); return 0; break; //按下取消button处理 case IDCANCEL: EndDialog(hwndDlg,1); return 0; break; } break; //关闭button处理 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说明:
指定一组位标志,来确定对话框的内容和行为.
- 用于指定对话框的button样式:
Flag Meaning MB_ABORTRETRYIGNORE 三个button: 终止, 重试, 忽略.
MB_OK 一个button: 确定.
MB_OKCANCEL 两个button: 确定,取消.
MB_RETRYCANCEL 两个button: 重试,取消.
MB_YESNO 两个button: 是,否.
MB_YESNOCANCEL 三个button: 是, 否, 取消.
- 用于指定对话框中的图标样式:
Flag Meaning MB_ICONEXCLAMATION
MB_ICONWARNINGMB_ICONINFORMATION
MB_ICONASTERISKMB_ICONQUESTION MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND - 用于指定默认缺省button:
Flag Meaning MB_DEFBUTTON1 缺省button为第一个button MB_DEFBUTTON2 缺省button为第二个button MB_DEFBUTTON3 缺省button为第三个button MB_DEFBUTTON4 缺省button为第四个button - 用于指定对话框的形态:
Flag Meaning MB_APPLMODAL 引用程序对话框(创建的是非模态的对话框) MB_SYSTEMMODAL 系统对话框(对话框会保持于窗口 z_order 的顶层) MB_TASKMODAL 任务对话框(创建的是模态的对话框)
代码例子:
创建具有是否button和问好图标的消息框,而且消息框为模态对话框:
MessageBox(NULL,"hello","test",MB_YESNO|MB_ICONQUESTION|MB_TASKMODAL);
程序结果:
转自:http://www.cnblogs.com/kzang/archive/2012/11/01/2750213.html