杭州|对话框管理器第二章:创建框架窗口( 二 )


哦等等 , 我们必须处理前面讨论过的对话框创建的微妙之处:对话框总是在最初隐藏创建的 。
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》