minigui[基础篇][4]——对话框

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 风格
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值