用户输入(缩小了用户的输入范围,或者提示用户的操作)
一般情况下可以在窗口上显示,一般不会在主窗口上进行显示。
需要对话框来进行承载。
对话框:是一个特殊的窗口,主要是用于用户的输入和布局控件。
对话框分两类:模态和非模态
-
模态对话框:阻塞(同步)模式,对这个对话框之外的应用程序窗口来进行操作,必须要先操作完当前对话框
-
非模态对话框:非阻塞(异步)模式,对这个对话框之外的应用程序窗口来进行操作,可以直接操作
对话框创建步骤
- 添加对话框资源
- 调用一个函数去创建一个对话框(模态:DialogBox,非模态:CreateDialog)
- 创建一个对话框的的窗口处理函数
- 销毁对话框(模态:EndDialog,非模态:DestroyWindow)
模态对话框
阻塞(同步)模式,对这个对话框之外的应用程序窗口来进行操作,必须要先操作完当前对话框
//模态对话框
int DialogBox(HINSTANCE hInstance, //应用程序实例句柄
LPCTSTR lpTemplate, //对话框模板
HWND hWndParent, //标识拥有对话框的窗口。
DLGPROC lpDialogFunc);//对话框回调函数
//销毁对话框
BOOL EndDialog(HWND hDlg, //表示要被清除的对话框窗口
int nResult); //指定从创建对话框函数返回到应用程序的值
代码示例
//WndProc消息处理函数中
switch (message)
{
//鼠标的左键按下
case WM_LBUTTONDOWN:
{
DialogBox(hInst,//哪个实例需要对话框
MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字
hWnd, //父窗口句柄
DlgProc);//对话框回调函数
}
break;
}
//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
switch(wParam)
{
//点击按钮做相应的操作
case IDC_BUTTON1:
//todo
MessageBox(0,0,0,0);
break;
//点击OK结束对话框
case IDOK:
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
break;
case IDCANCEL:
break;
}
}
}
return (INT_PTR)FALSE;
}
非模态对话框
非阻塞(异步)模式,对这个对话框之外的应用程序窗口来进行操作,可以直接操作
//创建
HWND CreateDialog(HINSTANCE hlnstance, //应用程序实例句柄
LPCTSTR lpTemplate, //对话框模板
HWND hWndParent, //标识拥有对话框的窗口。
DLGPROC IpDialogFunc);//对话框回调函数
//显示
BOOL ShowWindow(HWND hWnd, //指定窗口句柄
int nCmdShow);//指定窗口如何显示
显示窗口nCmdShow的值
值 | 说明 |
---|---|
SW_FORCEMINIMIZE | 在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。nCmdShow=11。 |
SW_HIDE | 隐藏窗口并激活其他窗口。nCmdShow=0。 |
SW_MAXIMIZE | 最大化指定的窗口。nCmdShow=3。 |
SW_MINIMIZE | 最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。 |
SW_RESTORE | 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。 |
SW_SHOW | 在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。 |
SW_SHOWDEFAULT | 依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。 |
SW_SHOWMAXIMIZED | 激活窗口并将其最大化。nCmdShow=3。 |
SW_SHOWMINIMIZED | 激活窗口并将其最小化。nCmdShow=2。 |
SW_SHOWMINNOACTIVE | 窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。 |
SW_SHOWNA | 以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。 |
SW_SHOWNOACTIVATE | 以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。 |
SW_SHOWNORMAL | 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。 |
代码演示
//全局窗口句柄,用于非模态对话框窗口句柄(模态不需要原因为:模态对话框操作完之前,不能操作其他窗口)
HWND g_hDlgWnd;
//WndProc消息处理函数中
switch (message)
{
//鼠标的左键按下
case WM_LBUTTONDOWN:
{
//非模态对话框
g_hDlgWnd = CreateDialog(hInst, //哪个实例需要对话框
MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字,资源
hWnd, //父窗口句柄
DlgProc);//对话框回调函数
//显示非模态对话框(窗口创建完需要显示一下)
ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);
}
break;
}
//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
//初始化对话框消息(参照WM_CREATE来理解)
case WM_INITDIALOG:
//这里中控件的动态添加
return (INT_PTR)TRUE;
case WM_COMMAND:
{
switch(wParam)
{
//点击按钮做相应的操作
case IDC_BUTTON1:
//todo
MessageBox(0,0,0,0);
break;
//点击OK结束对话框
case IDOK:
//销毁非模态对话框
DestroyWindow(g_hDlgWnd);
return (INT_PTR)TRUE;
break;
case IDCANCEL:
break;
}
}
}
return (INT_PTR)FALSE;
}
控件
也是一个特殊的子窗口
- 控件是窗口,只要是窗口就会有消息
- 是一个子窗口,必须要有一个父窗口
- 特殊的子窗口,子窗口类型在window中已经定义好
- 系统是通过小写的标识符来定义控件的窗口类名
注:控件是不需要菜单的,那么菜单这个参数会在空间中用来保存ID号,来标记对应的控件
HWND CreateWindow(LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hlnstance,
LPVOID lpParam);
参数说明
lpClassName
指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。
如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。请看说明部分的列表。
LPWindowName
指向一个指定窗口名的空结束的字符串指针。
如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。
dwStyle
指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格意义:
值 | 说明 |
---|---|
WS_BORDER | 创建一个带边框的窗口。 |
WS_CAPTION | 创建一个有标题框的窗口(包括WS_BORDER风格)。 |
WS_CHILD | 创建一个子窗口。这个风格不能与WS_POPUP风格合用。 |
WS_CHILDWINDOW | 与WS_CHILD相同。 |
WS_CLIPCHILDREN | 当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。 |
WS_CLIPSIBLINGS | 排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。 |
WS_DISABLED | 创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。 |
WS_DLGFRAME | 创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。 |
WS_GROUP | 指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有WS_GROUP风格,每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。 |
WS_HSCROLL | 创建一个有水平滚动条的窗口。 |
WS_ICONIC | 创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。 |
WS_MAXIMIZE | 创建一个初始状态为最大化状态的窗口。 |
WS_MAXIMIZEBOX | 创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。 |
WS_OVERLAPPED | 产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。 |
WS_OVERLAPPEDWINDOW | 创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。 |
WS_POPUP | 创建一个弹出式窗口。该风格不能与WS_CHILD风格同时使用。 |
WS_POPUPWINDOW | 创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。 |
WS_SIZEBOX | 创建一个可调边框的窗口,与WS_THICKFRAME风格相同。 |
WS_SYSMENU | 创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格。 |
WS_TABSTOP | 创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。 |
WS_THICKFRAME | 创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。 |
WS_TILED | 产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。 |
WS_TILEDWINDOW | 创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风格相同。 |
WS_VISIBLE | 创建一个初始状态为可见的窗口。 |
WS_VSCROLL | 创建一个有垂直滚动条的窗口。 |
X
指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。
Y
指定窗口的初始垂直位置。对一个层叠或弹出式窗口,y参数是屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。
nWidth
以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始Y坐标开始到目标区域的顶部。CW_USEDEFAULT只对层叠窗口有效;如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。
nHeight
以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。
hWndParent
指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的。Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄。
hMenu
菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。
hlnstance
与窗口相关联的模块实例的句柄。
lpParam
指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。
返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
按钮button
按钮代码演示
//全局窗口句柄,用于非模态对话框窗口句柄(模态不需要原因为:模态对话框操作完之前,不能操作其他窗口)
HWND g_hDlgWnd;
//WndProc消息处理函数中
switch (message)
{
//鼠标的左键按下
case WM_LBUTTONDOWN:
{
//非模态对话框
g_hDlgWnd = CreateDialog(hInst, //哪个实例需要对话框
MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字,资源
hWnd, //父窗口句柄
DlgProc);//对话框回调函数
//显示非模态对话框(窗口创建完需要显示一下)
ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);
}
break;
}
//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
//初始化对话框消息(参照WM_CREATE来理解)
case WM_INITDIALOG:
//这里中控件的动态添加,button是类名,按钮类,包含很多派生类
CreateWindow(_T("button"),
_T("这是按钮"), //按钮的名字(窗口名字)
//WS_CHILD 子窗口,必须给,WS_VISIBLE 可见,BS_PUSHBUTTON下压式按钮
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, //按钮风格,通过风格来决定使用的是哪一种按钮
100, //按钮显示位置的左上角X坐标
100, //按钮显示位置的左上角Y坐标
200, //按钮的宽度
50, //按钮的高度
g_hDlgWnd, //按钮显示的窗口(对话框)
(HMENU)5001,//按钮菜单,没有,通过菜单来表示控件ID号
hInst, //窗口实例
nullptr); //
return (INT_PTR)TRUE;
//命令消息
case WM_COMMAND:
{
switch(wParam)
{
//响应5001的按钮消息
case 5001:
MessageBox(hWnd,_T("这是按钮"),_T("按钮"),IDOK);
break;
//点击按钮做相应的操作
case IDC_BUTTON1:
//todo
MessageBox(0,0,0,0);
break;
//点击OK结束对话框
case IDOK:
//销毁非模态对话框
DestroyWindow(g_hDlgWnd);
return (INT_PTR)TRUE;
break;
case IDCANCEL:
break;
}
}
}
return (INT_PTR)FALSE;
}
组合框BS_GROUPBOX
//组合框BS_GROUPBOX表示组合框
CreateWindow(_T("button"),
_T("这是组合框"), //组合框的名字(窗口名字)
WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
100, //组合框显示位置的左上角X坐标
80, //组合框显示位置的左上角Y坐标
400, //组合框的宽度
350, //组合框的高度
g_hDlgWnd, //按钮显示的窗口(对话框)
(HMENU)5002,//组合框菜单,没有,通过菜单来表示控件ID号
hInst, //窗口实例
nullptr); //
//静态文本static
CreateWindow(_T("static"),_T("这是一个调查问卷"),WS_CHILD|WS_VISIBLE,120,100,200,30,g_hDlgWnd,(HMENU)5003, hInst,nullptr);
//单选框 如有没有选择一个风格,那么所有的单选都默认为一组
//WS_GROUP 表示单选的分组,直到下一个WS_GROUP宏都作为一组,或者都加上WS_GROUP没有单选
CreateWindow(_T("button"),_T("男"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,120,120,100,30,g_hDlgWnd,(HMENU)6004, hInst,nullptr);
CreateWindow(_T("button"),_T("女"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,120,140,100,30,g_hDlgWnd,(HMENU)6005, hInst,nullptr);
//静态文本static
CreateWindow(_T("static"),_T("职业"),WS_CHILD|WS_VISIBLE,120,160,200,30,g_hDlgWnd,(HMENU)5004, hInst,nullptr);
//单选框 如有没有选择一个风格,那么所有的单选都默认为一组
CreateWindow(_T("button"),_T("老板"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,120,180,100,30,g_hDlgWnd,(HMENU)6006, hInst,nullptr);
CreateWindow(_T("button"),_T("员工"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,120,200,100,30,g_hDlgWnd,(HMENU)6007, hInst,nullptr);
//静态文本static
CreateWindow(_T("static"),_T("爱好"),WS_CHILD|WS_VISIBLE,120,220,220,30,g_hDlgWnd,(HMENU)5005, hInst,nullptr);
//复选框BS_AUTPCHECKBOX
CreateWindow(_T("button"),_T("踢球"),WS_CHILD|WS_VISIBLE|BS_AUTPCHECKBOX,120,240,100,30,g_hDlgWnd,(HMENU)6008, hInst,nullptr);
CreateWindow(_T("button"),_T("吃饭"),WS_CHILD|WS_VISIBLE|BS_AUTPCHECKBOX,120,260,100,30,g_hDlgWnd,(HMENU)6009, hInst,nullptr);
编辑框edit
//编辑框
CreateWindow(_T("edit"),_T("请输入:"),WS_CHILD|WS_VISIBLE,120,280,100,100,g_hDlgWnd,(HMENU)6005, hInst,nullptr);
下拉框combobox
分为3类CBS_SIMPLE 简单 CBS_DROPDOWN 下拉式 CBS_DROPDOWNLIST 下拉式列表
下拉框有两个区域:第一个为显示区域,组合框要显示什么字符串,第二个为源区域,组合框提供了哪些字符串可以选择
通过SetDlgltemText只能设置显示区域的内容,要通过SendMessage的方式来设置源区域
//静态文本static
CreateWindow(_T("static"),_T("爱好"),WS_CHILD|WS_VISIBLE,100,100,100,30,g_hDlgWnd,(HMENU)5001, hInst,nullptr);
//编辑框 WS_BORDER在控件外加边框
CreateWindow(_T("edit"),_T(""),WS_CHILD|WS_VISIBLE|WS_BORDER,120,120,100,100,g_hDlgWnd,(HMENU)6001, hInst,nullptr);
//按钮
CreateWindow(_T("button"),_T("添加数据"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,220,100,100,30,g_hDlgWnd,(HMENU)7001,hInst,nullptr);
CreateWindow(_T("button"),_T("删除数据"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,340,100,100,30,g_hDlgWnd,(HMENU)7002,hInst,nullptr);
//下拉框
CreateWindow(_T("combobox"),_T(""),WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_BORDER,160,120,100,210,g_hDlgWnd,(HMENU)8001,hInst,nullptr);
//在使用下拉框时,尺寸的高度需要额外注意,一定要留出足够的高度,否则组合框的内容会无法完全显示,这只是预留高度,并不代表只有一行字符串的时候,也是这个高度
下拉框的操作函数
TCHAR strArr[1024] = {};
//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
//初始化对话框消息(参照WM_CREATE来理解)
case WM_INITDIALOG:
return (INT_PTR)TRUE;
//命令消息
case WM_COMMAND:
{
switch(wParam)
{
//响应7001的按钮消息
case 7001:
{
//获取编辑框的内容
GetDlgItemText(g_hDlgWnd,6001,strArr,1023);
//设置下拉框显示区域的内容
SetDlgltemText(g_hDlgWnd,8001,strArr);
//通过发消息的方式来把字符串添加都源区域
//应用程序层级的发送消息,这里发的是一个组合框的控件消息(CB_ADDSTRING,追加字符串消息),把添加的字符串通过lPrarm来传递,WPARAM保存的是插入的下标
SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_ADDSTRING,0,(LPARAM)strArr);//尾部追加
SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_INSERTSTRING,0,(LPARAM)strArr);//头部插入
}
break;
//响应7002的按钮消息
case 7002:
{
//删除数据,CB_DELETESTRING 从头部开始删除,WPARAM参数保存的是删除的下标
SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_DELETESTRING,2,0);
//重置所有的数据CB_RESETCONTENT
SendMessage(GetDlgItem(g_hDlgWnd,8001),CB_RESETCONTENT,0,0);
}
break;
//点击OK结束对话框
case IDOK:
//销毁非模态对话框
DestroyWindow(g_hDlgWnd);
return (INT_PTR)TRUE;
break;
case IDCANCEL:
break;
}
}
}
return (INT_PTR)FALSE;
}
得到对话框元素
GetDlgItem()
//获得对话框元素
HWND GetDlgItem(
_In_opt_ HWND hDlg, //标识含有控件的对话框
_In_ int nIDDlgItem); //指定将被检索的控件标识符,即ID
代码演示
//发送消息
//BM_SETCHECK设置选择。 wPrarm 1 表示选中,0表示未选中
SendMessage(GetDlgItem(g_hDlgWnd,6004),BM_SETCHECK,1,0);
SendMessage(GetDlgItem(g_hDlgWnd,6008),BM_SETCHECK,1,0);
设置对话框元素
SetDlgItemInt
SetDlgItemText 设置对话框元素文本
atoi -> ascii to int 字符串转int
itoa -> int to ascii int转字符串
//该函数将uValue的值设为对话框控件的文本。
BOOL SetDlgItemInt(HWND hDlg, //指向对话框窗口的句柄
int nIDDlgItem,//要改变其文本的控件ID
UINT uValue, //指向要设置的值
BOOL bSigned); //指定uValue是否为一个有符号的值
//该函数设置对话框中控件的文本和标题。
BOOL SetDlgltemText(HWND hDlg, //指向对话框窗口的句柄
int nlDDlgltem, //标识带有将被设置的标题和文本的控件ID
LPCTSTR IpString); //指向一个以NULL结尾的字符串指针,该字符串指针包含了将被复制到控件的文本
//返回值:如果函数调用成功,则返回值为非零值。如果函数调用失败,则返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
代码示例
//全局窗口句柄,用于非模态对话框窗口句柄(模态不需要原因为:模态对话框操作完之前,不能操作其他窗口)
HWND g_hDlgWnd;
//WndProc消息处理函数中
switch (message)
{
//鼠标的左键按下
case WM_LBUTTONDOWN:
{
//非模态对话框
g_hDlgWnd = CreateDialog(hInst, //哪个实例需要对话框
MAKEINTRESOURCEW(IDD_DIALOG1),//对话框名字,资源
hWnd, //父窗口句柄
DlgProc);//对话框回调函数
//显示非模态对话框(窗口创建完需要显示一下)
ShowWindow(g_hDlgWnd,SW_SHOWNORMAL);
}
break;
}
//对话框回调函数
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
//初始化对话框消息(参照WM_CREATE来理解)
case WM_INITDIALOG:
//这里中控件的动态添加,button是类名,按钮类,包含很多派生类
CreateWindow(_T("button"),_T("这是按钮"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,100,100,200,50,g_hDlgWnd,(HMENU)5001,hInst,nullptr);
return (INT_PTR)TRUE;
//命令消息
case WM_COMMAND:
{
switch(wParam)
{
//响应5001的按钮消息
case 5001:
//设置ID为6005的控件文本为你好
SetDlgltemText(g_hDlgWnd,6005,_T("你好!"));
break;
//点击按钮做相应的操作
case IDC_BUTTON1:
//todo
MessageBox(0,0,0,0);
break;
//点击OK结束对话框
case IDOK:
//销毁非模态对话框
DestroyWindow(g_hDlgWnd);
return (INT_PTR)TRUE;
break;
case IDCANCEL:
break;
}
}
}
//这里必须返回为False
return (INT_PTR)FALSE;
}
得到对话框文本元素
GetDlgItemText
GetDlgItemInt
//用GetDlgItemInt函数获取hwndDlg窗口中的IDC_a控件中输入的数值并赋给变量a。
UINT GetDlgItemInt(HWND hDlg, //控件所在窗口句柄
int nIDDlgItem, //控件标识符(名称)ID
BOOL *lpTranslated, //布尔变量的指针
BOOLbSigned); //有符号或无符号值
//函数以获得与对话框中的控件相关的标题或文本
int GetDlgItemText(HWND hDlg, //控件所在窗口句柄
int nID, //控件标识符(名称)ID
LPTSTR lpStr, //指向要接收控件的标题或文本的缓冲区
int nMaxCount);//指定了要拷贝到lpStr的字符串的最大长度
//如果字符串的长度大于缓冲区的长度,则会被截断,并以空字符结束。
代码示例
//将得到的文本存放到数组srtARR中
TCHAR srtARR[1024]={};
GetDlgItemText(g_hDlgWnd,6005,srtARR,1023);
按钮是否被选中
IsDlgButtonChecked()
//该函数可以确定某个按钮控件是否有选中标志,或者三态按钮控制是否为灰色的、选中的、或两者都不是。
UINT IsDlgButtonChecked(HWND hDlg, //控件所在窗口句柄
Int nlDBUtton); //指定按钮控制的整型标识符(名称)ID
返回值
使用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTION或BS_3STATE样式创建的按钮的返回值可以是如下值之一:
值 | 说明 |
---|---|
BST_CHECKED | 表示按钮被选中。 |
BST_INDETERMINATE | 表示按钮是灰色的,即为不确定状态(只有具有BS_3STATE或BS_AUTO3STATE样式的按钮才使用该值)。 |
BST_UNCHECKED | 表示该按钮未选中(unckecked)。如果该按钮用其他任何样式,那么返回值为零。 |
代码演示
//命令消息
case WM_COMMAND:
{
switch(wParam)
{
//响应5001的按钮消息
case 5001:
//判断按钮是否被选中,选中了弹出一个MessageBox
if(IsDlgButtonChecked(g_hDlgWnd,6003))
{
MessageBox(0,0,0,0);
}
break;
//点击按钮做相应的操作
case IDC_BUTTON1:
//todo
MessageBox(0,0,0,0);
break;
//点击OK结束对话框
case IDOK:
//销毁非模态对话框
DestroyWindow(g_hDlgWnd);
return (INT_PTR)TRUE;
break;
case IDCANCEL:
break;
}
}