MFC和Win32

一、MFC Object和Windows Object的关系

1、从数据结构上比较

     MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;

     Windows Object是Windows系统的内部结构,通过一个句柄来引用;

     MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。

2、从层次上讲比较

     MFC Object是高层的,Windows Object是低层的;

  • MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。

  • 3、从创建上比较

        MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。

    MFC中,使用这些MFC Object,一般分两步:

    首先,创建一个MFC Object,或者在STACK中创建,或者在HEAP中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。

    然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。

    4、从转换上比较

      

    可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。

    可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。

     

    5、从使用范围上比较

     

    MFC Object对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。

    对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。

     

    6、从销毁上比较

     

    MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。

    设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放

     

     

    二、Windows的注册

     

    1、一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(Windows Class)。注意,这里不是C++类的类。Register Window把窗口过程、窗口类型以及其他类型信息和要登记的窗口类关联起来。

    “窗口类”的数据结构

     

    “窗口类”是Windows系统的数据结构,可以把它理解为Windows系统的类型定义,而Windows窗口则是相应“窗口类”的实例。Windows使用一个结构来描述“窗口类”,其定义如下:

    typedef struct _WNDCLASSEX {

    UINT cbSize; //该结构的字节数

    UINT style; //窗口类的风格

    WNDPROC lpfnWndProc; //窗口过程

    int cbClsExtra;

    int cbWndExtra;

    HANDLE hInstance; //该窗口类的窗口过程所属的应用实例

    HICON hIcon; //该窗口类所用的像标

    HCURSOR hCursor; //该窗口类所用的光标

    HBRUSH hbrBackground; //该窗口类所用的背景刷

    LPCTSTR lpszMenuName; //该窗口类所用的菜单资源

    LPCTSTR lpszClassName; //该窗口类的名称

    HICON hIconSm; //该窗口类所用的小像标

    } WNDCLASSEX;

    从“窗口类”的定义可以看出,它包含了一个窗口的重要信息,如窗口风格、窗口过程、显示和绘制窗口所需要的信息,等等。

     

     

    如何注册窗口有如下集中方法:

    2、调用AfxRegisterClass注册

    AfxRegisterClass函数是MFC全局函数。AfxRegisterClass的函数原型:

    BOOL AFXAPI AfxRegisterClass(WNDCLASS *lpWndClass);

    参数lpWndClass是指向WNDCLASS结构的指针,表示一个“窗口类”。

    首先,AfxRegisterClass检查希望注册的“窗口类”是否已经注册,如果是则表示已注册,返回TRUE,否则,继续处理。

    接着,调用::RegisterClass(lpWndClass)注册窗口类;

    然后,如果当前模块是DLL模块,则把注册“窗口类”的名字加入到模块状态的域m_szUnregisterList中。该域是一个固定长度的缓冲区,依次存放模块注册的“窗口类”的名字(每个名字是以“/n/0”结尾的字符串)。之所以这样做,是为了DLL退出时能自动取消(Unregister)它注册的窗口类。

    最后,返回TRUE表示成功注册。

     

    3、调用AfxRegisterWndClass注册

    AfxRegisterWndClass函数也是MFC全局函数。AfxRegisterWndClass的函数原型:

    LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,

    HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon)

    参数1指定窗口类风格;

    参数2、3、4分别指定该窗口类使用的光标、背景刷、像标的句柄,缺省值是0。

    此函数根据窗口类属性动态地产生窗口类的名字,然后,判断是否该类已经注册,是则返回窗口类名;否则用指定窗口类的属性(窗口过程指定为缺省窗口过程),调用AfxRegisterCalss注册窗口类,返回类名。

     

    4、调用::RegisterWndClass。

     

    直接调用Win32的窗口注册函数::RegisterWndClass注册“窗口类”,这样做有一个缺点:如果是DLL模块,这样注册的“窗口类”在程序退出时不会自动的被取消注册(Unregister)。所以必须记得在DLL模块退出时取消它所注册的窗口类。

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值