本文根据网络课程学习笔记整理,内容为建立了一个win32模态对话框,并拖入两个按钮后对按钮消息进行处理,程序在VS2019上运行通过。对代码做了详细注释。
一、视窗部分:
1. 右键方案名(解决方案资源管理器中的方案名)->添加->资源->Dialog->创建
* 创建方案时选择创建空C++ Windows项目
* 这个Dialog就是下一步编程的模板
* 此时系统自动生成的***.rc文件(不要改动)
* 选中Dialog后点击右键 ,可以设置对话框的各种属性
2. 向Dialog中加入各种控件
* 工具箱:视图->工具箱->对话框编辑器(按住拖进对话框)(此处,拖入按钮两个)
* 右上方的几个按钮可以调整控件位置等,用Ctrl键选中数个按钮后,按四个朝外箭头,可让按钮外形一边大,
四个箭头附近都是调整位置和外形的
二、代码部分
//一. 需要的头文件
#include<windows.h>
#include<tchar.h> //使用TCHAR类型所需的头文件,如TEXT()函数
#include<commctrl.h> //控件头文件
#include"resource.h" //拖入对话框后自动生成的头文件,如不包含无法运行
#pragma warning(disable:28251) //因编译器报C28251错,予以排除
//二. 对话框消息处理函数的声明
INT_PTR WINAPI dProc( HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
//三. 程序主函数
int WINAPI WinMain ( //入口主函数名称及参数与win32入口函数形同
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{ //入口主函数内容与WIN32窗口函数大为不同,比win32窗口简单很多,没有窗口类注册、
//创建、显示等步骤。仅需一个对话框的声明,如下:
DialogBox( //从一个对话框资源中创建一个模态对话框
hInstance, //标识模块实例(默认传WinMain中的Instance句柄)
MAKEINTRESOURCE(IDD_DIALOG1), //把一个"数字形ID",转化为"字符串".但是执行前后,输入的数据的内
// 容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.
//这里的IDD_DIALOG1是拖入的对话框的ID号
NULL, //指定拥有对话框的父窗口(这里没有,用NULL)
dProc); //对话框消息处理函数的名字,这里作为参数传递进去
return TRUE;
}
//四. 对话框消息处理函数
INT_PTR WINAPI dProc( //讲授者在此处没有用CALLBACK声明,而是用WINAPI声明,试着用CALLBACK声明,
//编译也能通过,运行正常。函数是作为参数被主函数中的DialogBox函数调用。
HWND Dlg, //声明对话框窗口句柄
UINT uMsg, //声明接受主函数及系统发出的消息变量
WPARAM wParam, //声明消息参数,具体内容与消息类别相关,不固定
LPARAM lParam) //声明详细参数,(同上)
{
switch (uMsg)
{
case WM_INITDIALOG: //对初始化消息的处理
//处理初始化消息:WM_INITDIALOG消息是只有对话框才能收到的消息;收到该消息表明对话框及其
//所有子控件都创建完毕了。与WM_CREATE消息对比:
//WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕,可以在上面上面画控件了。在
//响应WM_CREATE消息的时候,对话框及子控件还未创建完成,只是通知系统说要开始创建窗口啦,
//这个消息响应完之后,对话框和子控件才开始创建。因此在此消息响应函数中无法对控件进行修改和初
//始化。
MessageBox(Dlg, _T("对话框窗口初始化完成!!!"), _T("对话框"),MB_OK);
break;
case WM_COMMAND:
UINT nCtrlID = LOWORD(wParam); //wParam低位中存有控件ID(在控件属性表中可以看到)
UINT nCode = HIWORD(wParam); //wParam高位中存有鼠标信息
if (nCode == BN_CLICKED) //BN_CLICKED消息(按钮控件被点击了)
{
if (nCtrlID == IDC_BUTTON1)
{
MessageBox(Dlg, L"按钮一被点击", L"按钮", MB_OK);
}
else if (nCtrlID == IDC_BUTTON2)
{
MessageBox(Dlg, L"按钮二被点击", L"按钮", MB_OK);
}
else if (nCtrlID == IDCANCEL||nCtrlID==IDOK) //按对话框默认的确认或取消退出
{
EndDialog(Dlg,true);
}
return TRUE;//正常情况应返回TRUE
}
}
return false;
}