1.概念
1.特殊的主窗口
2.主窗口只关注与用户的交互――向用户提供输出信息,但更多的是用于用户输入
3.用户可以使用 TAB 键遍历控件、可以利用 ENTER 键表示默认输入
2.对话框模板类图
3.模态对话框和非模态对话框
模态对话框:就是显示之后,用户不能再切换到其他主窗口进行工作的对话框,而只能在关闭之后,才能使用其他的主窗口
非模态对话框:与模态对话框不同,当用户打开非模态对话框时,依然可以操作其他窗口
3.代码示例
模态对话框
static DLGTEMPLATE DlgInitProgress = //模态对话框的参数
{
WS_BORDER | WS_CAPTION, //风格 有边框 有菜单
WS_EX_NONE, //无扩展风格
120, 150, 400, 130,
"VAM-CNC 正在进行初始化",
0, 0,
3, NULL, //控件个数3
0
};
static CTRLDATA CtrlInitProgress [] =
{
{
"static", //静态框
WS_VISIBLE | SS_SIMPLE,
10, 10, 380, 16,
IDC_PROMPTINFO, //控件id
"正在...",
0
},
{
"progressbar", //进度条
WS_VISIBLE,
10, 40, 380, 20,
IDC_PROGRESS, //控件id
NULL,
0
},
{
"button", //按钮
WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
170, 70, 60, 25,
IDOK, //控件id
"确定",
0
}
};
static int InitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_INITDIALOG: //初始化 对话框创建成功会调用
return 1;
case MSG_COMMAND:
switch (wParam) {
case IDOK: //确定
case IDCANCEL: //取消
EndDialog (hDlg, wParam); //销毁模态对话框
break;
}
break;
}
return DefaultDialogProc (hDlg, message, wParam, lParam); //默认的系统对话框处理函数
}
static void InitDialogBox (HWND hWnd)
{
/* 将对话框模板结构和控件结构数组关联起来 */
DlgInitProgress.controls = CtrlInitProgress; //控件组赋值给控件
DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L); //创建模态对话框
}
非模态对话框
static int InitWindowProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case MSG_COMMAND:
switch (wParam) {
case IDOK:
case IDCANCEL:
DestroyMainWindowIndirect (hWnd); //销毁模态对话框
break;
}
break;
}
return DefaultWindowProc (hDlg, message, wParam, lParam);
}
...
{
HWND hwnd;
MSG Msg;
/* 将对话框模板和控件数组关联起来 */
DlgInitProgress.controls = CtrlInitProgress;
/* 建立主窗口 */ //创建非模态对话框
hwnd = CreateMianWindowIndirect (&DlgInitProgress, HWND_DESKTOP, InitWindowProc);
if (hwnd == HWND_INVALID)
return -1;
while (GetMessage (&Msg, hwnd))
{
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
}
创建和销毁对话框函数
//模态对话框
int GUIAPI DialogBoxIndirectParamEx (PDLGTEMPLATE pDlgTemplate,HWND hOwner, WNDPROC DlgProc, LPARAM lParam,const char* werdr_name, WINDOW_ELEMENT_ATTR* we_attrs,const char* window_name, const char* layer_name);
@pDlgTemplate: 对话框模板,指针值
@hOwner: 托管窗口
@DlgProc:对话框处理函数
@lParam:消息的lParam值 MSG_INITDIALOG会收到这个值
@werdr_name:渲染器名称
@we_attrs:窗口元素属性表
@window_name:窗口的字符串名称,目标保留不使用;应传递 NULL
@layer_name:窗口所在的图形层名称,目前保留不使用;应传递 NULL
static inline int GUIAPI DialogBoxIndirectParam (PDLGTEMPLATE pDlgTemplate,HWND hOwner, WNDPROC DlgProc, LPARAM lParam)
{
return DialogBoxIndirectParamEx (pDlgTemplate, hOwner, DlgProc, lParam,NULL, NULL, NULL, NULL);
}
//结束对话框过程
BOOL GUIAPI EndDialog (HWND hDlg, int endCode);
MG_EXPORT HWND GUIAPI CreateMainWindowIndirectParamEx (PDLGTEMPLATE pDlgTemplate,HWND hOwner, WNDPROC WndProc, LPARAM lParam,const char* werdr_name, WINDOW_ELEMENT_ATTR* we_attrs,const char* window_name, const char* layer_name);
@pDlgTemplate: 对话框模板,指针值
@hOwner: 托管窗口
@DlgProc:对话框处理函数
@lParam:消息的lParam值 MSG_INITDIALOG会收到这个值
@werdr_name:渲染器名称
@we_attrs:窗口元素属性表
@window_name:窗口的字符串名称,目标保留不使用;应传递 NULL
@layer_name:窗口所在的图形层名称,目前保留不使用;应传递 NULL
static inline HWND GUIAPI CreateMainWindowIndirectParam (PDLGTEMPLATE pDlgTemplate,
HWND hOwner, WNDPROC WndProc, LPARAM lParam)
{
return CreateMainWindowIndirectParamEx (pDlgTemplate, hOwner,
WndProc, lParam, NULL, NULL, NULL, NULL);
}
#define CreateMainWindowIndirect(pDlgTemplate, hOwner, WndProc) \
CreateMainWindowIndirectParam(pDlgTemplate, hOwner, WndProc, 0)
//销毁非模态对话框
BOOL GUIAPI DestroyMainWindowIndirect (HWND hMainWin);
注:CreateMainWindowIndirect 函数在利用对话框模板中的数据建立主窗口之后,会立即返回,而不会
像 DialogBoxIndirectParam 函数一样建立进入一个新的消息循环
4.对话框常用API
函数 | 功能 |
---|---|
DestroyAllControls | 销毁所有子窗口 |
GetDlgCtrlID | 根据控件句柄获取控件标识符 |
GetDlgItem | 根据控件标识符获取控件句柄 |
GetDlgItemInt | 获取控件文本并转换为整数值 |
SetDlgItemInt | 根据整数值设置控件文本 |
GetDlgItemText | 获取子控件文本 |
GetDlgItemText2 | 获取子控件文本 根据文本长度自动分配内存,应用程序负责释放该内存 |
SetDlgItemText | 设置子控件文本 功能同 SetWindowText |
GetNextDlgGroupItem | 获取下一个同组子控件 用于遍历同组控件,参阅 WS_GROUP 风格 |
版权声明:本文为qq_43601873原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。