Win32编程之对话框(五)

一、对话框原理

(1).对话框的分类

  • 模式对话框:当对话框显示时,会禁止其他窗口和用户交互操作
  • 无模式对话框:在对话框显示后,其他窗口仍然可以和用户交互操作

(2).对话框基本使用

  • 对话框窗口处理函数
  • 注册窗口类(不使用)
  • 创建对话框
  • 对话框的关闭

对话框窗口处理函数(并非真正的对话框窗口处理函数)

1
2
3
4
5
6
7
8
9
INT CALLBACK DialogProc(
    HWND hwndDlg, //窗口句柄
    UINT uMsg, //窗口句柄
    WPARAM wParam, //消息参数
    LPARAM lParam //消息参数
);
返回TRUE:缺省处理函数不需要处理
返回FALSE:交给缺省处理函数处理
不需要调用缺省对话框窗口处理函数

二、模式对话框

(1).创建对话框

1
2
3
4
5
6
7
8
INT DialogBox(
    HINSTANCE hInstance, //应用程序实例句柄
    LPCTSTR lpTemplate, //对话框资源ID
    HWND hWndParent, //对话框父窗口
    DLGPROC lpDialogFunc //自定义函数
);
DialogBox是一个阻塞函数,只有当对话框关闭后,才会继续,继续执行
后续代码。返回值是通过EndDialog设置

(2).对话框的关闭

1
2
3
4
5
6
BOOL EndDialog(
    HWND hDlg, //关闭的对话框窗口句柄
    INT_PTR nResult //关闭的返回值
);
关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow函数
nResult是DialogBox函数退出的返回值

(3).对话框的消息

WM_INITDIALOG:对话框创建之后显示之前,通知对话框窗口处理函数,可以完成自己的初始化相关的操作  

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
    switch (msgID) {
    case WM_INITDIALOG: {
        MessageBox(hwndlg, TEXT("WM_INITDIALOG"), TEXT("提示"), MB_OK);      
        break;
    }
    case WM_SYSCOMMAND: {
        if (wParam == SC_CLOSE) {
            //销毁模式对话框
            EndDialog(hwndlg, 100);
        }
        break;
    }
    default:
        break;
    }
 
    //将消息交给真正的对话框窗口处理函数的后续代码帮我们处理
    return FALSE;
}
 
void OnCommand(HWND hWnd, WPARAM wParam) {
    switch (LOWORD(wParam)) {
    case ID_MODEL: {
        int nRet = DialogBox(g_hIns, (LPCTSTR)IDD_DIALOG1, hWnd, DlgProc);
        if (nRet == 100) {
            MessageBox(hWnd, TEXT("successfuly"), TEXT("提示"), MB_OK);
        }
         
        break;
    }
    default:
        break;
    }
}
 
//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WindProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {
    switch (msgID) {
    case WM_COMMAND: {
        OnCommand(hWnd, wParam);
        break;
    }
    default:
        break;
    }
 
    return DefWindowProc(hWnd, msgID, wParam, lParam);
}

 三、无模式对话框 

(1).创建对话框

1
2
3
4
5
6
7
HWND CreateDialog(
    HINSTANCE hInstance, //应用程序实例句柄
    LPCTSTR lpTemplate, //模板资源ID
    HWND hWndParent, //父窗口
    DLGPROC lpDialogFunc //自定义函数
);
非阻塞函数,创建成功后返回窗口句柄,需要使用ShowWindow函数显示对话框

(2).对话框的关闭 

关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
INT CALLBACK DlgProc(HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam) {
    switch (msgID) {
    case WM_INITDIALOG: {
        MessageBox(hwndlg, TEXT("WM_INITDIALOG"), TEXT("提示"), MB_OK);      
        break;
    }
    case WM_SYSCOMMAND: {
        if (wParam == SC_CLOSE) {
            //销毁非模式对话框
            DestroyWindow(hwndlg);
        }
        break;
    }
    default:
        break;
    }
 
    //将消息交给真正的对话框窗口处理函数的后续代码帮我们处理
    return FALSE;
}
 
void OnCommand(HWND hWnd, WPARAM wParam) {
    switch (LOWORD(wParam)) {
    case ID_MODEL: {
         HWND hDialog = CreateDialog(g_hIns, (LPCTSTR)IDD_DIALOG1, hWnd, DlgProc);
         ShowWindow(hDialog, SW_SHOW);
         
        break;
    }
    default:
        break;
    }
}

 

posted @   TechNomad  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示