对话框(VC_Win32)
资源描述表中对话框定义
格式:
- 对话框名 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);
}

程序源码:

ViewCode
#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);
}
}

回调函数设计(同模态对话框一样)
程序源码:

ViewCode

#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_ICONWARNING
MB_ICONINFORMATION
MB_ICONASTERISK
MB_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);
程序结果:

转自:http://www.cnblogs.com/kzang/archive/2012/11/01/2750213.html
对话框(VC_Win32)的更多相关文章
- 一步步开发自己的博客 .NET版(10、前端对话框和消息框的实现)
关于前端对话框.消息框的优秀插件多不胜数.造轮子是为了更好的使用轮子,并不是说自己造的轮子肯定好.所以,这个博客系统基本上都是自己实现的,包括日志记录.响应式布局.评论功能等等一些本可以使用插件的.好 ...
- jQuery遮罩层登录对话框
用户登录是许多网站必备的功能.有一种方式就是不管在网站的哪个页面,点击登录按钮就会弹出一个遮罩层,显示用户登录的对话框.这用方式比较灵活方便.而现在扫描二维码登录的方式也是很常见,例如QQ.微信.百度 ...
- Android系统默认对话框添加图片
开发工具Android Studio 今天公司UI要求软件对话框改成加图片的,以前没有做过,所以就学习了一下,废话不多说, 看效果: 创建XML文件dialog_lsit_item.xml <L ...
- Android—关于自定义对话框的工具类
开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...
- 使用CSS3的box-shadow实现双透明遮罩层对话框
box-shadow介绍 在我之前的一篇文章<从天猫和支付宝身上学习opcity与rgba>中,介绍了实现双透明遮罩层效果的两种方法,分别是opacity和rgba.他们需要分别依赖于不同 ...
- 10.JAVA之GUI编程弹出对话框Dialog
在上节基础上添加对话框显示错误信息. 代码如下: /*弹出对话框显示错误信息,对话框一般不单独出现,一般依赖于窗体.*/ /*练习-列出指定目录内容*/ import java.awt.Button; ...
- C#WebBrowrse拦截下载对话框
为了实现这个功能,可算是折腾不少时间,网上搜素出来的结果基本都是如何屏蔽警告对话框.后来请教一个技术大牛(程序员之窗的主要作者Starts_2000),他用C++实现了,他尝试了下C#也没有解决,就忙 ...
- 实现对gridview删除行时弹出确认对话框的一种简单方法
在VS2008提供的GridView中我们可以直接添加一个CommandField删除列:<asp:CommandField ShowDeleteButton="True" ...
- 炫酷的jQuery对话框插gDialog
js有alert,prompt和confirm对话框,不过不是很美体验也不是很好,用jQuery也能实现, 体验效果:http://hovertree.com/texiao/jquery/34/ 代码 ...
随机推荐
- ASIHTTPRequest类库简介和使用说明(转)
ASIHTTPRequest类库简介和使用说明 官方网站: http://allseeing-i.com/ASIHTTPRequest/ .可以从上面下载到最新源码,以及获取到相关的资料. 使用iOS ...
- NBUT 1223 Friends number 2010辽宁省赛
Time limit 1000 ms Memory limit 131072 kB Paula and Tai are couple. There are many stories betwee ...
- Windows 下python的tab自动补全
方法一:安装一个ipython就OK啦,而且关键字还能高亮显示呢 一.打开cmd,输入pip3 install ipython联网安装 二.安装成功后,cmd里运行ipython,成功啦. 方法二:写 ...
- java.lang.IndexOutOfBoundsException: setSpan (35 ... 35) ends beyond length 28
/************************************************************************************* * java.lang.I ...
- vim configures for normal work
" " 主要用于保留一些常用的vim配置,省得每次都另外写,效率太低. " " 2015-09-18 深圳 南山平山村 曾剑锋 " set nocom ...
- LG4454 【[CQOI2018]破解D-H协议】
先谈一下BSGS算法(传送门) 但是上面这位的程序实现比较繁琐,看下面这位的. clover_hxy这样说 bsgs算法,又称大小步算法(某大神称拔山盖世算法). 主要用来解决 A^x=B(mod C ...
- 【转】python3中bytes和string之间的互相转换
问题: 比对算法测试脚本在python2.7上跑的没问题,在python3上报错,将base64转码之后的串打印出来发现,2.7版本和3是不一样的:2.7就是字符串类型的,但是3是bytes类型的,形 ...
- ansible copy file
ansible xxxip -m copy -a 'src=/localdir/file dest=/sss/xxx/basic_search/bin/'
- ory Oathkeeper docker-compose 安装运行
Oathkeeper 相关介绍可以参考官方文档,主要就是cloud native 身份以及访问代理 运行环境使用docker 安装(api proxy ) Dockerfile api: docker ...
- 转 update关联更新在sqlserver和oracle中的实现
sqlserver和oracle中实现update关联更新的语法不同,都可以通过inline view(内嵌视图)来实现,总的来说sqlserver更简单些. 测试例子如下: create table ...