当前位置:网站首页>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"

边栏推荐
猜你喜欢

PyTorch installation - error when building a virtual environment in conda before installing PyTorch

银微转债,洁特转债上市价格预测

正则表达式与绕过案例

【STM32】入门(三):按键使用-GPIO端口输出控制

(2022杭电多校五)1010-Bragging Dice (思维)

数商云供应链集成系统开发方案:多行业集成平台管理自动化

DC-4靶场搭建及渗透实战详细过程(DC靶场系列)

Chapter 8 Character Input Output and Input Validation

voliate关键字

log4j设置日志的时区
随机推荐
程序包简单解释
浅谈用KUSTO查询语言(KQL)在Azure Synapse Analytics(Azure SQL DW)审计某DB账号的操作记录
GD32学习笔记(3)NAND Flash管理
第三方支付--分账对接
OneNote 教程,如何在 OneNote 中设置笔记格式?
【STM32】入门(三):按键使用-GPIO端口输出控制
【无标题】2022-7-24
数字3d虚拟交互展厅顺应时代发展需求和趋势
Domino服务器SSL证书安装指南
第3周 用1层隐藏层的神经网络分类二维数据
谷粒商城一些疑问总结
Shell编程的条件语句
Auto.js Pro 计算脚本运行时间
lc marathon 8.2
DOM破环和两个实验的复现
ESP8266-Arduino编程实例-MAX6675冷端补偿K热电偶数字转换器驱动
22 ES6 knowledge points
肖sir___面试就业课程____性能测试
多线程使用哈希表
数据库性能系列之索引(中)