太长不看

SetWindowSubClass,然后 return DefSubclassProc(hWnd, uMsg, wParam, lParam);,不要有 WS_CHILD 这个 Style。

缘起

翻 ControlSpy 的时候发现了 BS_GROUPBOX Style,结合脑补觉得这是类似 Frame 的东西,安排了一个还真是。

ControlSpy 截图,无 HiDPI 支持

那么既然控件要放在 Frame 里,而 Frame 是一种 Button,那么就会存在按钮嵌套“按钮”的情况发生,所以 BS_PUSHBUTTON 应该也是可以嵌套 BS_PUSHBUTTON 的,甚至可能可以嵌套 Static


测试程序,开了 HiDPI 支持,所以高清一些

然后测试事件绑定的时候就发现了问题,WndProc 里面没有收到消息,然后简单翻了一下发现会传 WM_PARENTNOTIFY,然后在 WndProc 的回调里面加上了这个 case,的确收到了,但是根据文档来看这个东西给出的事件和信息都很有限,甚至后期测文本框的时候文本框的 CHANGE 事件都收不到,所以就锅++了。

Day 1

搜了一个小时,并没有搜出来什么东西,于是就去 StackOverflow 上面问了。当时问的时候给的图是按钮套按钮的,看上去很怪异,而且并不会有人去这样用控件,而且可能描述上也存在一些问题,导致评论区负面评价比较多,也没获得啥有用信息。


当时查了挺多的东西,翻这些网页流量都 300 多 M(宽带),可见有多猛。。看了许多相关不相关的东西,啥 MFC 的、GetMenu 什么的都有看过,虽然开的时候就知道这种东西不太相关但是还是看了看。

因为前一天太猛,第二天累到爆炸,咕了一天。

Day 3

首先是简单整理了一下原来建 TextBox 的代码,然后依然是从 WM_PARENTNOTIFY 开始找起,看到了 WM_NOTIFY,然后了解了一下 Windows 的消息流程,随着引导看到了 SendAsyncProc,但是对解决问题都没啥用,又抱有一丝希望。花了一段时间去研究为啥收不到 WM_NOTIFY,没啥发现,最后也没收得到,然后看到了 MFC 相关的一些东西,发现这么方便,有一点酸,但是项目架构原因只能用原生。

最后,在这里 Child windows does not receive WM_DESTROY?,看到了真正的答案。既然涉及到了 Child Windows,要手动收到 WM_DESTROY 就说明题主想要在 Destroy 时额外做点什么,而如果能解决,就必定有遍历发消息什么的。其实之前看到了一个提问,只是下面没回答。然后就说到了 SetWindowSubClass,顺理成章地看文档,发现就是要的这个,然后放上去。

放上去之后 F5 开幕雷击,整个窗口算是全白的,之前在新的回调里就是直接调的旧的回调,然后折腾了一下试了几种方案都不行,回去看代码发现在构造的时候 or 了 WS_CHILD,然后既然 SetWindowSubClass 了,就不像是一个 Child,注释掉就好了。

用了这个以后之前注册控件类回调挂掉,错误的注册方法没啥问题的注册函数可以不用要了。

Win32 按钮嵌套收不到消息解决记录的更多相关文章

  1. C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题

    不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有 ...

  2. win32程序之窗口程序,以及消息机制

    win32程序值窗口程序,以及消息机制 一丶简介 通过上一讲.我们了解了窗口其实是绘制出来的.而且是不断绘制的过程. 所以窗口的本质是绘制. 但是我们现在看到的窗口程序.都可以点击关闭按钮. 使用鼠标 ...

  3. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  4. wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法

    原文链接:wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法 最近升级wordpress之后,发现在文章编辑界面的添加新媒体和可视化按钮点击无反应,如下:  然后就在网上找解决办法, ...

  5. PullToRefreshListView中嵌套ViewPager滑动冲突的解决

    PullToRefreshListView中嵌套ViewPager滑动冲突的解决 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部 ...

  6. ie6,ie7,ie8 css bug兼容解决记录

    ie6,ie7,ie8 css bug兼容解决记录 转载自:ie6,ie7,ie8 css bug兼容解决记录 - 前端开发 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面 ...

  7. 解决记录:win10 无法安装VS2017,visual studio installer下载进度始终为0

    问题描述:win10 下无法安装VS2017,visual studio installer下载进度始终为0,点击取消按钮后,也没有反应,visual studio installer也关闭不掉: 具 ...

  8. 错误解决记录------------rhel安装Mysql软件包依赖 mariadb组件

    错误解决记录------------软件包依赖 mariadb组件 错误信息: 错误:软件包:akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda) 需要:maria ...

  9. Apache coredump 问题发现与解决记录

    目录 Apache coredump 问题发现与解决记录 背景 发现问题 解决问题 方法 1 方法 2 总结 Linux 程序编译链接动态库版本问题 ldd 命令 动态库的编译和 soname 线上 ...

随机推荐

  1. 关于jQuery中toggle参数callback函数提前执行问题

    通过 jQuery,您可以使用 toggle() 方法来切换 hide() 和 show() 方法. 显示被隐藏的元素,并隐藏已显示的元素: $(selector).toggle(speed,call ...

  2. logstash nested内嵌字段 field protobuf解码 codec 的解决办法

    logstash nested内嵌字段 field protobuf解码 codec 的解决办法 主要需求 logstash-codec 下https://www.elastic.co/guide/e ...

  3. 吴裕雄--天生自然python学习笔记:python用 Bokeh 模块绘制我国 GDP 数据统计图

    现在我们把我国 1990 年到 2017 年的 GDP 数据抓取出 来,井用 Bokeh 绘 出散点统计图 . 由网页爬取所需数据,并用 Bokeh 绘制散点图 . import requests # ...

  4. OSPF 大实验

    实验拓扑如图所示: 公司A网络如实验拓扑所示,请根据如下需求对网络进行部署: 1) 按照拓扑所示配置OSPF多区域,另外R3与R6,R4与R6间配置RIPv2.R1,R2,R3,R4的环回接口0通告入 ...

  5. [LC] 268. Missing Number

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  6. bootstrap实现多选项及回显

    1.前端 <link rel="stylesheet" href="${ctxStatic}/js/bootstrap-select-1.12.2/dist/css ...

  7. Qt static关键字全局变量

    创建全局变量.h文件 globalvariable.h #ifndef GLOBALVARIABLE_H #define GLOBALVARIABLE_H #include <QImage> ...

  8. NDK开发之<cpu-features.h模块功能>

    今天研究下cpufeatures库,它是一个轻量级的展示CPU特性的模块,调用者在运行时候可以根据这个库提供的简单接口获取到目标机的CPU架构和特性. 一.代码路径: $NDK_ROOT/source ...

  9. LG_3457_[POI2007]POW-The Flood

    题目描述 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方形,地图上已经标注了它的海拔高度以及它是否是该市的一个组成部 ...

  10. 如何为MyEclipse添加XML文档所使用的DTD

    1.打开MyEclipse,找到菜单栏"Window"---->"Preferences(首选项)": 2.在左侧导航菜单栏找到"MyEclip ...