首页

对话框管理器第六章:消息循环中的细节  

在上一篇文章中,我留下了一道课后作业:找到EndManualModalDialog和模态对话框消息循环之间的细微Bug。 微妙之处在于:EndManualModalDialog会在内部设置了一些标志,但没有强制消息循环注意到该标志已实际设置。回想一下,GetMessage函数在投递性消息(Posted Message)到达消息队列之前不会返回。 如果传入的已发送消息到达,则将它们传递到相应的窗口过...

对话框管理器第五章:将非模态对话框转为模态  

今天,让我们应用上次学到的知识,将一个非模态对话框转换为模态对话框。 与往常一样,还是在我们的基础例子代码上添加如下内容: 上面的代码没有新意,你可能觉着没什么大不了的。它只是显示了一个对话框并根据用户点击的按钮来返回对应的值。我们对DoModal的调用,系统会调用底层的DialogBox来做实际的工作。 现在,让我们将DoModal转换一下,来实现一个模态对话框消息循环。但是且慢,为什么要这样...

对话框管理器第四章:对话框消息循环  

对话框消息循环,其实也不复杂,其核心实现代码,也就下面几行代码: while (<dialog still active> && GetMessage(&msg, NULL, 0, 0, 0)) { if (!IsDialogMessage(hdlg, &msg)) { TranslateMessage(&msg); ...

Visual Studio新功能出炉:低优先级构建  

近日,C++开发团队很高兴地宣布,一项C++社区高呼的功能:低优先级构建,已经成功开发完成。借助我们合作伙伴团队的反馈和协作,你现在可以在 Visual Studio 中启动低优先级构建。 这将确保MSBuild节点以较低优先级生成,从而影响所有编译和链接进程。 如果在你的日常工作中,发现VS在构建的时候影响了整机的交互响应,则这个是非常适合你的功能! 在内部,VS像服务一样与MSBuild交互。...

对话框管理器第三章:创建控件  

和上一篇创建框架窗口相比,创建控件的工作要轻松很多,信不信由你。 在对话框模板中定义的每一个控件,其对应的子窗口将会被创建。控件的大小和位置在模板中是以DLU为单位来描述的,所以,理所当然的,我们需要将它们转换为以像素单位,代码如下: int x = XDLU2Pix(ItemTemplate.x); int y = YDLU2Pix(ItemTemplate.y); int cx = XDLU2...

2022-07-26

以前不明白,为什么英国人聊天的时候要聊天气。 现在和同事吃饭,第一句话总是:今儿天气不错哈。 看来,我还是个弟弟啊。
  • 阅读全文 |
  • 分类:流逝 |
  • 发表于:07月26日 |
  • 浏览:34 |
  • 评论已关闭 条评论

对话框管理器第二章:创建框架窗口  

对话框模板包含了对话框外观的描述,所以对话框管理器只是简单地遍历模板并按照模板的描述来创建对话框。这个过程十分简单和直接,对话框管理器没有太多自己的决策空间,它只是按照模板说的做而已。 为了简单起见,我会假设这里说的对话框管理器是一个扩展版本的对话框模板。它是经典的DLGTEMPLATE的超集,所以我讲述起来就比较通用。 另外,我还会跳过一些比较特殊的部分(例如WM_ENTERIDLE消息),因为...

对话框管理器第一章:先热热身  

我认为大家关于对话框管理器的很多困惑,来自于没有真正地理解它的底层工作原理。这其实也没那么糟。在接下来的几篇文章中,我将首先描述对话框是如何创建的,然后我会讲解对话框消息循环,最后,我会再介绍一些有关导航相关的主题。 这一系列将会包含九篇文章,请做好,扶稳了。 对话框管理器的第一个主要部分,是它负责读取对话框模板并基于此模板创建一个对话框。 你会看到一些形如CreateDialogXxx的函数,它...

为什么调试器会显示错误的函数  

有时候在解决一些问题的时候需要使用到调试,这个场景很常见,我们在代码的某个地方设置一个断点,然后步进到一个函数内部单步调试,但是你会发现,调试器会显示你在另外一个函数中。这是咋回事儿?我们先来看看下面的一段代码。 当你步进到调用p->GetValue()的地方时,你会发现调试器显示当前在Class1::GetQ中。那么,发生了什么呢? 这是因为,从链接器的视角来看,在代码生成阶段,链接器合...

Visual Studio新功能:针对Linux平台的新版SSH终端  

在最新版本的Visual Studio 2022 预览版里,用户可以通过一项新的集成化的终端来从Windows中访问目标开发平台。这次更新的终端还包含了一个交互式的SSH外壳。用户可以通过Visual Studio中的[视图 -> 终端]来打开它,如下图所示: 现在,你无需在 PowerShell 或 WSL 中启动 SSH 会话并重新进行身份验证,而是只需单击一下即可选择现有连接之一。集...