首页
社区
课程
招聘
找出win32窗口类的真相
发表于: 2013-11-18 16:31 8659

找出win32窗口类的真相

2013-11-18 16:31
8659
win32的窗口类就是面向对象思想所指的类吗?

typedef struct {
        UINT cbSize;
        UINT style;
        WNDPROC lpfnWndProc;
        int cbClsExtra;
        int cbWndExtra;
        HINSTANCE hInstance;
        HICON hIcon;
        HCURSOR hCursor;
        HBRUSH hbrBackground;
        LPCTSTR lpszMenuName;
        LPCTSTR lpszClassName;
        HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

第一,MFC并没有什么深奥的改动,费什么力气,只是表面的一层封装,就把windows编程变成语言支持的面向对象,这能说明其灵魂就是面向对象吗?

第二,lpfnWndProc像不像虚函数? DefWindowProc是基类默认的接口?WindowProc用户自定义实现接口?这是多态吗?

第三,cbWndExtra由MSDN给出的解释:Specifies the number of extra bytes to allocate following the window instance.
在实例尾部开辟空间?我们都知道在内存中,子类内容就是存放在父类尾部的,这是继承吗?

第四,有了多态和继承,再看看封装,拿C++为例每个对象的成员方法都有一个隐藏的参数this,指向实例的内存位置.
那么win32的窗口类呢?可以猜测所有第一参数为HWND的函数都是其成员方法,以下由伪代码说明:




ATOM RegisterClassEx(CONST WNDCLASSEX *lpwcex)
{
	PWNDCLASSEX pwcex = LocalAlloc(LPTR,lpwcex->cbSize + lpwcex->cbClsExtra);
	
	
	memccpy(pwcex,lpwcex);	//系统保存用户对窗口类成员的初始化。
	

	return container.Insert(pwcex);	//再把指针存放到系统某个容器中,并返回其索引。
}



HWND CreateWindow(ATOM uClassName,HINSTANCE hInstance)
{
	WNDCLASSEX wcex;



	GetClassInfoEx(hInstance,uClassName,&wcex);		//通过RegisterClassEx返回的索引,找到用户的初始化内容。



	CWindow * pcw = LocalAlloc(LPTR,sizeof(CWindow) + lpwcex->cbClsExtra);  

	/*
	CWindow为假想类,继承自WNDCLASSEX。
	然后为其申请内存并做一些构造函数的工作来实例化对象。
	*/

	return container.Insert(pcw);	//同样将对象指针保存到系统某个容器(句柄表)中,并返回其索引
}



LONG_PTR GetWindowLongPtr(HWND hWnd,int nIndex)
{
	/*
	通过窗口句柄作为索引,在系统内部容器中查找对象的实例指针(this)。
	*/

	return this->member(nIndex)
}






cbClsExtra和cbWndExtra都是为子类化服务的,如果同时不为0,则代表此时窗口类的层次结构为3层。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
重新整理更新...
2013-11-19 09:13
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
重新整理更新...
2013-11-19 14:08
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
重新整理更新...
2013-11-19 18:23
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
虽然很恶心你连续发了3个回复顶贴,但我还是说一说好了
一个是对应派生类,一个是对应实例
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633579(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633581(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633585(v=vs.85).aspx
这几个多看一看吧
2013-11-20 06:19
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
重新整理更新...
2013-11-20 13:48
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
class Class : public WNDCLASSEX
{
        public:
        ClsExtra = some_defined_data
        WndExtra = new byte [cbWndExtra]
}
hwnd = new Class
2013-11-21 04:58
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
重新整理更新...
2013-11-21 10:28
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
一个是和类相关的数据,在RegisterClass的时候传入
一个是和窗口相关的数据,在CreateWindow的时候开辟空间

比如说你写一个网页浏览器,你就可以把获取HTTP请求的函数地址放在ClsExtra里面,把用户的网址放在WndExtra
而你如果要写一个FTP浏览器,你就可以只把ClsExtra里面的函数换成发送FTP请求的
大概就是这个意思
2013-11-21 12:19
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
重新整理更新...
2013-11-21 12:46
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
重新整理更新...
2013-11-21 13:12
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我教不会你了,再见
2013-11-22 02:57
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
重新整理更新...
2013-11-25 11:59
0
雪    币: 248
活跃值: (1106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
多少年来,这些事已渐渐司空见惯,典型的价值体系的颠倒:债主比债权人还拽。比如:中国是美国的最大债权人吧,但我们领导人却低三下四地乞求:“离婚就免了吧,俺们当你的小老婆总可以吧?”
2013-11-25 12:39
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
重新整理更新...
2013-11-25 13:06
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
重新整理更新...
2013-11-25 13:08
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
晚了一步,他都说了啥?
2013-11-25 22:27
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
子曰思而不学则怠
陶渊明亦言好读书不求甚解
2013-11-25 23:15
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我感觉你想多了,用C语言面向过程的思路去看待吧,不要强加到面向对象上。只是WNDCLASS的名字用了“CLASS”字样而已,如果他本来就叫WNDSTRUCT呢?

第一,mfc深奥与否,要看观测者的层次。我认为MFC不“只是表面的一层封装”。

第二,略微靠得上多态的意思,不过我认为它多不多态不重要。

第三,也略为靠的上继承吧,不过这个“继承”看起来只能有一层。

第四,看起来像在封装framework,随意吧。。。
2013-11-26 08:57
0
游客
登录 | 注册 方可回帖
返回
//