关于Windows窗口框架

我们知道Windows的窗口消息处理函数是C方式, 面向过程的, 所以窗口框架的基本任务就是将它转成面向对象的方式, 确切的说如何将消息处理函数第一参数HWND转成对象指针。
 

关于这个问题, 其实网上大家已经说滥了,  这里只是简单记录一下。
 

Map方式:MFC就是采用这种方式, 就是建立一张从HWND到CWindow*的映射表, 每次收到消息都从Map中根据HWND找到CWindow*, 再进行调用
 

UserData的方式:CreateWindow时将最后一个附加数据设置为对象CWindow* 指针, 当收到第一个消息WM_NCCREATE时, 取出传过来的附加数据指针, 将该指针设置成窗口的UserData,  SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast(pThis)), 后面收到任何消息就可以直接调用GetWindowLongPtr(hWnd, GWLP_USERDATA)取出窗口指针, 进行面向对象方式的调用。

 

Thunk方式:这是ATL采用的方式,通过汇编代码,直接将窗口消息处理函数的第一个参数HWND改写成CWindow*, 然后进行面向对象方式的调用, 原理可以见我以前写的 理解ATL中的一些汇编代码
 

这里也有一篇文章总结了这些封装方式: MFC、ATL窗口消息封装机制对比分析
 

最近工作中要写一些简单窗口相关的代码, 考虑用什么方式封装窗口过程:

MFC肯定不引入, map方式也不考虑。

UserData方式太低效 ,而且窗口的UserData让框架用了,我们其他地方可能还要用呢。

ATL的Thunk方式不错, 但是我们不想引入COM, 也不想用ATL的库和代码。

原始的 C API方式, 依赖性和效率都最佳, 可惜就是不是面向对象的。
 

各有优缺,怎样才能熊掌和鱼翅兼得? 

最后决定把ATL中窗口Thunk相关的核心代码剥离出来, 做一个完全独立的最基本窗口框架。我们框架的基本目标是可以让我们方便的开发一些简单的窗口, 所以去掉了ATL窗口中一些不常用或是可替代的东西, 只留下必须和最有用的。简单说来,把ATL中的CWindow给去掉了,它只是窗口API的封装, 我们可以直接调用API来实现;把CWinTraits给去掉了,因为它只是窗口风格的封装; 把SubClass和SuperClass也去掉了, 我们的简单窗口用不到这个特性; 把Dialog, Container和COM相关的都去掉了, 这些都不是窗口的核心部分。最后只留下,窗口注册创建, thunk和消息映射相关的代码。

 

测试了下,这个窗口框架基本上只有2个核心文件,完全独立, 可以直接放到任何现有框架中使用(ATL/WTL中使用可能要改下内部一些类名, 但是用了ATL/WTL肯定就不用这个框架了)。


测试代码: CAltWinTest.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows窗口编程是指在Windows操作系统上进行图形界面编程的技术。它使用Windows API(应用程序编程接口)来创建和管理窗口、对话框、控件等,使程序能够在Windows桌面上以图形化的方式展示。 在Windows窗口编程中,首先需要创建一个主窗口。使用Windows API的相关函数,我们可以指定主窗口的位置、大小、样式等属性。之后,可以向主窗口中添加各种控件,如按钮、文本框、标签等,以实现与用户的交互。每个控件都有自己的属性和事件,可以通过处理这些事件来实现相应的功能。 在编写程序时,可以使用C++、C#、VB.NET等编程语言来进行Windows窗口编程。其中,使用MFC(Microsoft Foundation Classes)和WinForms等框架可以极大地简化窗口和控件的创建和管理过程。同时,还可以利用一些第三方UI库,如Qt、WPF等,来快速创建复杂的Windows应用程序。 通过Windows窗口编程,我们可以创建各种类型的应用程序,如文本编辑器、图形界面工具、媒体播放器等。同时,还可以利用Windows窗口编程实现一些专业化的应用,如科学计算、数据可视化等。 总之,Windows窗口编程是一种强大的技术,它使得开发者能够创建功能丰富、用户友好的Windows应用程序。随着Windows操作系统的不断更新和发展,Windows窗口编程也在不断演进,为开发者带来更多的可能性和便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值