我是靠谱客的博主 碧蓝导师,这篇文章主要介绍跟我一起学Windows界面封装(六) 之 模态对话框原理,现在分享给大家,希望可以做个参考。

         在做界面程序的过程中,我们经常会遇到模态对话框(这个名词没必要在解释了吧,不懂就别看这篇文章了)。因此这点还是很有必要拿出来说明下的,不然不知道怎么实现,说不清其原理还是挺可悲的。

         在windows中,使用DialogBoxParam显示的对话框就是模态的,ATL中也用了该函数进行了封装。虽然模态对话框在windows中很普遍,但是并没有SDK级别的API,可以将一个窗口变为模态显示。

    我们知道windows系统是依靠windows消息分发与响应来驱动UI交互的。有一种想法就是能够让代码停留在Domodal()中,同时不相关的窗口消息也不会被阻塞,这样就能简易的实现模态了。有什么方法可以实现上面的方案呢?答案就是接管默认的消息循环。即在DoModal()内部实现一个自己的GetMessage循环,这样直到模态框退出了才能够进入默认的消息循环继续分发消息。另外还要注意一点,弹出的模态窗口的父窗口hParent也需要对应设置。

下面就按照我们上面的阻塞的思路给出一种实现。

复制代码
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class ModelWindow : public XWindowImpl<ModelWindow> { XButton m_btn; bool m_bClose; public: DECLARE_XWNDCLASS(L"ModelWindow") public: ModelWindow() { m_bClose = false; } public: LRESULT ProcessXWndMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CLOSE: DestroyWindow(); m_bClose = true; break; default: return ::DefWindowProc(this->m_hWnd, uMsg, wParam, lParam); } return 0; } public: void DoModal(HWND hParent) { ShowWindow(SW_SHOW); UpdateWindow(); // disable掉父窗口,让其不再接受消息 HWND hParentWnd = hParent; while(hParentWnd != NULL) { EnableWindow(hParentWnd, FALSE); hParentWnd = GetParent(hParentWnd); } // 主消息循环: MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (m_bClose) { break; } TranslateMessage(&msg); DispatchMessage(&msg); } // 恢复父窗口enable状态 hParentWnd = hParent; while(hParentWnd != NULL) { EnableWindow(hParentWnd, TRUE); hParentWnd = GetParent(hParentWnd); } } };

SimpleWindow窗口按钮响应的地方可以创建一个模态窗口:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
case WM_COMMAND: if (wParam == 2013) { ModelWindow simWnd2; simWnd2.Create(L"模态窗口",&rc, m_hWnd); simWnd2.DoModal(m_hWnd); HDC dc = ::GetDC(m_hWnd); CString strInfo(L"You have pushed the button"); TextOut(dc,20,100,strInfo, strInfo.GetLength()); }

运行结果发现基本上满足了我们的需求。


最后

以上就是碧蓝导师最近收集整理的关于跟我一起学Windows界面封装(六) 之 模态对话框原理的全部内容,更多相关跟我一起学Windows界面封装(六)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部