窗口子类就是利用 SetWindowLong 函数 使用 GWL_WNDPROC 标志 将窗口绑定的窗口类的回调函数进行改变 (WNDCLASS -> lpfnWndProc ),实际上就是函数指针 它所指向 (存储) 的函数地址 被改变了。
上调用代码:
图中划红线的部分就是传递 LRESULT CALLBACK 类型的回调函数的地址 是不是感觉有点疑问,为什么不直接写这个类里的函数呢?
一开始我也是直接写进去,类型一值是无效转换,没办法了我才这样变相的传递过来。(实际上是有方法的我后面会说到)
但是后面我遇到了多窗口,每个窗口都有不一样的实现,这就意味着我要写很多个消息回调函数,但是窗口类我用的就是一个啊,这就意味着他们一定要过一个消息回调函数,我必须得采用窗口子类或者改变他们的回调函数。
为每一个窗口都创建一个窗口类?自然不太现实,毕竟写得多,回调函数都写得头大,还要写着玩意 bug率会极度上升。
解决方案来了:
为函数加上 static 关键字就可以了。
之前也是脑子抽了,想了很多,没想到这,我一直想都是地址,你讲个无效转换? 赶紧转换》》》
应该是类对象需要实例化才会分配内存,而 static 是编译完成时 启动项目时就直接有了一个固定内存且 与项目同生共死( 不消毁) 符合操作系统回调什么的 瞎猜的