DirectUI代码分析1:

今天学习了DirectUI最初的版本http://www.viksoe.dk/code/windowless1.htm,尝试着自己把它提取出来,写成一个更简单的DEMO,所以做一个小笔记:

主程序是基于CFrameWindowWnd创建的

1.CWindowWnd:是所有窗口的基类,

它包含了RegisterWindowClass用于注册窗口,在注册中设置窗口过程函数__WndProc

Create中调用CreateWindowExCreateWindowEx最后一个参数传入this,

CFrameWindowWnd基于CWindowWnd注册创建,

下面具体说下这个窗口的实现:

1.RegisterWindowClass用于注册窗口,在注册中设置窗口过程函数__WndProc

2.在Create中调用CreateWindowExCreateWindowEx最后一个参数传入this,根据MSDN,可以知道,

this被存入the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message

3.在__WndProc中处理消息,其中包括:

3.1.在WM_NCCREATE消息中得到CreateWindowEx传入的this指针(CREATESTRUCT ::lpCreateParams ),通过this指针就可以从CWindowWnd

指向特定的子类对象CFrameWindowWnd,同时为了以后处理消息能被调用到,将其通过SetWindowLongPtr的GWLP_USERDATA存入,这样就

可以每次消息时都取出this(通过GetWindowLongPtr).

3.2.在3.1基础上,this调用HandleMessage(虚函数)处理它自身消息,如this指针取出为空,调用默认DefWindowProc

我们可以看到,通过注册窗口,创建窗口,传递自身指针,CFrameWindowWnd最终实现了在它自身的

HandleMessage函数中处理它自身的窗口过程消息,相当于实现了子类化.

4.在HandleMessage的WM_CREATE开始创建它的子窗口page_start

page_start和CFrameWindowWnd类似创建,同样注册窗口,创建窗口,传递自身指针,

最终实现了在它自身的HandleMessage函数中处理它自身的所有消息,但子窗口加入了绘制类CPaintManagerUI对象

 

extern:

下面说说绘制类CPaintManagerUI

1.在Main()中调用MessageLoop函数,MessageLoop实现了过滤当前线程的所有消息

也就是一个GetMessage.

2.通过SetResourceInstance把hInstance保存

3.通过MessageHandler处理窗口消息.

 

5.接上面的,子窗口的HandleMessage中加入了绘制类CPaintManagerUI的MessageHandler处理窗口消息.

 

所以很清楚了,最终所有的窗口都通过HandleMessage来代替原有的系统窗口过程函数处理消息

子窗口同时通过CPaintManagerUI绘制类的MessageHandler处理窗口消息.同时CPaintManagerUI绘制类

还通过MessageLoop实现了过滤处理当前线程的所有消息

 

 

 

 

转载于:https://www.cnblogs.com/hgy413/archive/2011/12/13/3693567.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值