您现在的位置: 中国教师站 >> 教师关注 >> 电脑技术 >> 编程技术 >> Visual C >> 正文

Google
探索Win32系统之窗口类(Window Classes in Win32)
作者:Siny 文章来源:中国教师站cn-teacher 点击数: 更新时间:2007-4-22 12:49:20
warning 信息

  • 复制一份被子类化的窗口类的信息 。将复制的新类填加到应用程序的“私有”系统类列表里。win9x系统里,系统为每个进程都保持了这样的一个列表,以供系统存放系统全局类的克隆信息。

  • 强制进程里所有的子类化过的窗口实例使用这个系统类的拷贝。但这不影响已经存在的窗口,窗口是使用事先已经拷贝到窗口实例数据区的类信息,并非直接使用进程里保存的类的信息。子类化只更新了进程的窗口类列表里的类的信息,而没有更新窗口实例里的类。

  • 16位应用程序共享相同的进程空间。在win9x里,16位程序的表现和它在win3.1里是一样的。

    • winNT的实现

    winNT则有很多的不同。winNT包括了两个win32子系统:一个服务进程和一个在各win32进程里运行的动态连接库(DLL)。以edit类为例,winNT在各进程空间里,从DLL里导出和注册edit类。这样,处理EDIT控件的代码可以存在于DLL里,也即在各进程空间里。不需要系统分配局部过程调用来处理Edit控件,应用程序对控件的频繁调用所导致的系统开销也被避免了。因为EDIT 控件实例仅仅在各进程空间里操作自身数据,所以对系统鲁棒性的冲击就降低了。

    服务进程管理每个win32应用程序的信息,包括应用程序的公有和私有窗口类。当创建一个win32线程的过程开始(即某个线程调用USER模块或GDI模块的函数时),USER模块检查该线程是否该进程的第一个线程,如果是(一般是主线程),USER模块为该进程注册系统类。当为了任何一个进程而注册一个类(服务模块进程除外),该类就会添加到该进程的公有或私有列表里。为了提高效率,windows为每个进程都注册系统类,并且把类信息的拷贝储存在应用程序的空间里。这增加了鲁棒性,但是比起Windows95,增加了需要使用的内存。windowsNT也由此获得了更高的性能,因为当子类化一个系统类的时候,winNT不需要象window95那样重新分配内存和拷贝类信息。

    在winNT里,16位的应用程序依然共享同一进程,也共享所有的系统全局类。16位程序总是不稳定因素的起源。

    2.应用程序全局类。

    应用程序全局类是注册的时候指定了CS_GLOBALCLASS标志的类(该标志还有后续叙述)。

    16位系统比如win3.1的应用程序“全局”类是真正意义的“全局”的,一个DLL或应用程序注册的应用程序全局类,系统内所有的DLL和应用程序都可以使用。一个应用程序全局类在“全局”的意义上和系统全局类一致,只是它是由应用程序创建的而不是系统创建的而已。

    Win32的应用系统全局类本质的不同是:应用程序全局类只是在进程内部的“全局”而已。这是什么意思呢?一个DLL或.EXE可以注册一个类,这个类可以让在相同的进程空间里其他.EXE和DLL使用。如果一个DLL注册了一个非应用程序全局类的窗口类,那么,只有该DLL可以使用该类,同样的,.EXE里注册的非应用程序全局类也适用这个规则,即该类只在该.EXE里有效。

    作为这个特性的扩展,win32有一项技术,允许一个第三方窗口控件在DLL里实现,然后把这个DLL载入和初始化到每个Win32进程空间里。这项技术的细节是,把DLL的名字写入注册表的指定键值里:

    HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWindowsAPPINIT_DLLS

    这样当任意一个win32应用程序加载的时候,系统也同时将该dll加载到进程空间里(这可能有点过于奢侈,因为很多win32程序不一定会使用该控件)。DLL在初始化的时候注册应用程序全局类,这样的窗口类就可以在每个进程空间的.EXE或DLL里使用了。这个技术基于win32系统的这个特性:允许在每个进程空间里自动的(也是强制的)加载特定的DLL(事实上,这也是打破进程边界,把你的代码切入到其他进程里的一种办法)。

     

    3. 应用程序局部类

    WIN32应用程序局部类是使用最频繁的类(绝大部分的应用程序为主窗口注册的类都是应用程序局部类),仅仅在声明和注册该类的应用程序模块或DLL自身里使用。注册一个应用程序局部类和应用程序全局类的区别是,局部类不包括CS_GLOBAL CLASS标志。

     


    二:窗口类包含的信息和作用

    窗口类都包含些什么信息呢?让我们看以下窗口类结构体。

    WNDCLASS结构包含的是一般的窗口类的信息

    typedef struct tagWNDCLASS {       UINT      style;    WNDPROC   lpfnWndProc;    int       cbClsExtra;    int       cbWndExtra;    HINSTANCE hInstance;    HICON     hIcon;    HCURSOR   hCursor;    HBRUSH    hbrBackground;    LPCSTR    lpszMenuName;    LPCSTR    lpszClassName;} WNDCLASS;

    成员

    描述

    style

    一组标志位的组合。定义比如窗口位置,设备上下文(DC)分配,双击的处理等特征。

    lpfnWndProc

    指向窗口过程的地址,该窗口过程负责处理窗口类相应的窗口消息

    cbClsExtra

    指明需要额外分配的内存数量,单位为byte,系统为该类分配保留指定数量的额外内存

    cbWndExtra

    指明需要额外分配的内存数量,单位为byte,系统为每个该类所对应的窗口实例分配保留指定数量的额外内存

    hInstance

    标识注册该类的DLL或应用程序实例

    hIcon

    当一个属于该类的窗口被最小化的时候,显示的图标.

    hCursor

    属于鼠标该类的窗口里显示的指针

    hbrBackground

    定义当程序打开或重画某个属于该类的窗口是,填充窗口客户区的颜色和样式

    lpszMenuName

    上一页  [1] [2] [3] [4] [5] [6] 下一页

    相关专题:
     
     网友评论:(评论内容只代表网友观点,与本站立场无关!)
    GOOGLE广告

    阅读排行

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
    中国教师站

    中国教师站 版权所有 Copyright © 2006-2020 All Rights Reserved 站长:Sina & Siny
    [备用域名:www.JXZYW.Com] 有事请留言有事请留言
    【实力成就精品 诚信呵护品牌】

    信息产业部备案
    苏ICP备06018635号