当前位置:网站首页>Dialog manager in the fourth chapter: the dialog message loop
Dialog manager in the fourth chapter: the dialog message loop
2022-08-03 03:52:00 【Topological Mel-Long Development Road】
The dialog message loop is actually not complicated. Its core implementation code is the following lines of code:
while (
However, let's start from the beginning.The story happens when DialogBoxIndirectParam is called. You should remember that we explained before that the system will convert all calls to DialogBoxXX into calls to DialogBoxIndirectParam. The code is as follows:
INT_PTR WINAPI DialogBoxIndirectParam(HINSTANCE hinst,LPCDLGTEMPLATE lpTemplate, HWND hwndParent,DLGPROC lpDlgProc, LPARAM lParam){/** App hack! Some people pass GetDesktopWindow()* as the owner instead of NULL. Fix them so the* desktop doesn't get disabled!*/if (hwndParent == GetDesktopWindow())hwndParent = NULL;
Yes, we did an App Hack in the code.In the previous article, we discussed the issue of passing GetDesktopWindow() as the parent window.A lot of developers made this mistake and we had to build this App Hack into the core OS code.If we don't do this, hundreds of upper layer applications will need to be changed.
Since only top-level windows can be the window owner, we have to start from hwndParent (possibly a child window) and work our way up the window hierarchy until we find a top-level window.
if (hwndParent)hwndParent = GetAncestor(hwndParent, GA_ROOT);
After completing the second App Hack, we started to create our dialog:
HWND hdlg = CreateDialogIndirectParam(hinst,lpTemplate, hwndParent, lpDlgProc,lParam);
Note: As before, I'll ignore error checking and various dialog boxes, as it just distracts from the point of this entry.
Because modal dialogs disable their parent window, implement it here:
BOOL fWasEnabled = EnableWindow(hwndParent, FALSE);
Then we enter the dialog modal message loop:
MSG msg;while (
According to the convention of window exit messages, we redelive any exit message we might receive so that it can be seen by the next outer modal loop.
if (msg.message == WM_QUIT) {PostQuitMessage((int)msg.wParam);}
(Astute readers may have noticed look, there is an uninitialized variable error in the code above: if EndDialog is called during WM_INITDIALOG processing, msg.message is never set. For illustration purposes, I decidedIgnore this error.)
At this point, our dialog has done its job, and we need to clean it up.Remember to enable the owner before destroying the owned dialog.
if (fWasEnabled)EnableWindow(hwndParent, TRUE);DestroyWindow(hdlg);
Finally, return the result:
return ;}
Congratulations, you are now a dialog expert.Tomorrow, we'll see how to make the most of the expertise learned today.
Exercise: Find a way to sneak through the App Hack about the parent window in the two layers of code above to end up with a dialog whose owner is the desktop, and explain the dire consequences of this situation.
Summary
Okay, dialog expert, you see it: there is nothing mysterious under the code, there is cause and effect.
This world is still materialistic.
Last
Raymond Chen's "The Old New Thing" is one of my favorite blogs. It contains a lot of small knowledge about Windows, which is really helpful for the majority of Windows platform developers.
This article is from: "The dialog manager, part 4: The dialog loop"
边栏推荐
猜你喜欢
随机推荐
IDEC和泉触摸屏维修HG2F-SS22V HG4F软件通信分析
程序包简单解释
爆肝22个ES6知识点
mysql8默认密码丢失,如何更改密码详细步骤??
网工知识角|华为网络工程师,华为、华三、思科设备三层交换机如何使用三层接口?命令敲起来
百度超级链:鼓励企业做自己的链
leetcode刷题学习之路
SeleniumWebDriver扩展插件开发
MATLAB(5)绘图
积分商城可设置的四种兑换商品类型
利用索引机制进行绕过
金仓数据库 MySQL 至 KingbaseES 迁移最佳实践(3. MySQL 数据库移植实战)
高等代数_笔记_配方法标准化二次型
电子设备行业智能供应链系统:打破传统供应链壁垒,提升电子设备企业管理效能
synchronized原理
基于flowable的upp(统一流程平台)运行性能优化(2)
怎么用redis限制同一ip重复刷浏览量
Auto. Js scripts run time calculated Pro
LeetCode算法日记:面试题 03.04. 化栈为队
【STM32】入门(四):外部中断-按键通过中断动作