> 在多显示器系统上 , 它会将对话框放在主显示器上 , 即使你的程序正在辅助显示器上运行 。
> 用户可能将他们的任务栏停靠在屏幕的顶部或左侧边缘 , 这将覆盖你的对话框 。
> 即使在单显示器系统上 , 你的程序也可能在屏幕的右下角运行 。将对话放在左上角不会在两者之间建立有意义的联系 。
> 如果你的程序的两个副本正在运行 , 它们的对话框将精确地相互覆盖 。我们在之前的文章中看到了这种情况的危险 。
故事的寓意:始终传递一个hwndParent窗口 , 以便对话框出现在相对于程序的其余部分有意义的位置 。(也不要只抓住 GetDesktopWindow!)
好的 , 我们现在已经准备好创建对话框:我们有它的类、它的字体、它的菜单、它的大小和位置等 。
哦等等 , 我们必须处理前面讨论过的对话框创建的微妙之处:对话框总是在最初隐藏创建的 。
BOOL fWasVisible = dwStyle & WS_VISIBLE;
dwStyle &= ~WS_VISIBLE;
对话框类和标题来自模板 。几乎每个人都只使用默认对话框类 , 尽管我在之前的文章中解释了如何使用自定义对话框类 。
好的 , 现在我们有了创建窗口所需的信息 。
HWND hdlg = CreateWindowEx(dwExStyle pszClass
pszCaption dwStyle & 0xFFFF0000 pt.x pt.y
cxDlg cyDlg hwndParent hmenu hinst NULL);
请注意 , 我们过滤掉了所有低样式位(每个类) , 因为我们已经将 DS_* 样式转换为“真实”样式 。
这就是为什么你的对话过程没有得到像 WM_CREATE 这样的窗口创建消息的原因 。在创建框架时 , 对话过程还没有进入画面 。只有在框架创建之后 , 对话管理器才能附加对话过程 。
// Set the dialog procedure
SetWindowLongPtr(hdlg DWLP_DLGPROC (LPARAM)lpDlgProc);
对话框管理器在这一点上做了更多的摆弄 , 基于对话框模板样式 。模板可能要求提供窗口上下文帮助 ID 。如果模板没有指定允许调整大小、最大化或最小化的窗口样式 , 则相关的菜单项将从对话框的系统菜单中删除 。
接下来是设置字体:
SetWindowFont(hdlg hf FALSE);
这就是为什么你的对话过程收到的第一条消息恰好是 WM_SETFONT:它是在设置 DWLP_DLGPROC 之后发送的第一条消息 。当然 , 这种行为将来可能会改变; 你不应该依赖消息排序 。
好的 , 对话框架现在已经创建完成了 。下一步:创建控件 。
总结拖拖控件它确实简单 , 但是操作系统实现它的底层原理还真是不那么简单 。
你可以:
> 忽略这些复杂的 , 繁琐的东西 , 继续”接着奏乐接着舞” 。
> 苦其心志 , 深入研究这些细枝末节的东西 。
好了 , 选择权给到你这边了 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《The dialog manager part 2: Creating the frame window》
【算法|对话框管理器第二章:创建框架窗口】
相关经验推荐
- 高通骁龙|手机像素越高越好?算法优化更加重要
- 算法|格力空调哪个系列好,性价比最高?解密真实现象
- 算法|价格上差距不是很大,两台手机表面看似一样,实际却区别很明显
- 算法|手机拍照是否达到摄影水平,至少这3点是可以肯定的
- 算法|昼夜都能拍!全价位段这些拍摄利器不容错过
- Windows|2022年一款现代化的文件管理器,感觉来试试吧!
- 算法|学校将5800元天价平板强行卖给学生,拆开一看,硬件配置犹如百元电子垃圾
- 算法|耗时6年 美国公布4种新的加密算法:量子计算机也无法破解
- 算法|不服本土手机品牌溃败,印度目光看向中国,突袭全国44处中资企业
- 算法|未来已到来!五年前的iPhone X绝非一台普通手机,而是预示着未来
