Window Classes

每一个窗口类都有一个相关联的窗口过程,这个窗口过程是被同一个类的所有窗口所共享。窗口过程处理这个类的所有窗口的消息从而控制他们的行为和外观。

进程必须注册一个窗口类后才能创建一个窗口。注册窗口类用一个类名字关联到窗口过程,类风格,以及其他的类属性。当进程在CreateWindow或者CreateWindowEx中指定了一个类名的时候,系统就会创建一个窗口,其中窗口过程,风格,其他属性跟这个类名相关联。

1窗口类型

<1>系统类

系统类是系统注册窗口类。许多系统类可被所有进程使用,有的则仅在只能在系统内部使用。由于系统注册这些类,所以进程不能破坏它们。

系统会在进程中的任意一个线程首次调用用户或许系统的GDI函数的时候来注册这些系统类。

每个应用程序接受它自己对系统类的副本。在同一个中的VDM所有的16bit的Windows应用程序分享同一个系统类,就像他们在16bit的Windows上一样。

下表介绍了可用于所有进程使用的系统类。


Class


Description


Button


The class for a button.


ComboBox


The class for a combo box.


Edit


The class for an edit control.


ListBox


The class for a list box.


MDIClient


The class for an MDI client window.


ScrollBar


The class for a scroll bar.


Static


The class for a static control.

下面的表描述了只能别系统调用的系统类


Class


Description


ComboLBox


The class for the list box contained in a combo box.


DDEMLEvent


The class for Dynamic Data Exchange Management Library (DDEML) events.


Message


The class for a message-only window.


#32768


The class for a menu.


#32769


The class for the desktop window.


#32770


The class for a dialog box.


#32771


The class for the task switch window.


#32772


The class for icon titles.

 

<2>应用程序全局类

一个应用程序全局类是由一个可执行文件或DLL注册的窗口类,它可以被进程中的所有其他模块访问。例如,你的your.dll可以调用RegisterClassEx函数注册了一个自定义的控件定义作为一个应用程序全局类,从而当一个进程加载这样一个dll的时候,它就可以创建这个自定义控件的实例。

创建一个可以在每一个进程中使用的类,在.dll中创建窗口类并且在每一个进程中加载dll。为了能在所有的进程章加载这个dll,要把它的名字加载到注册表中HKEY_LOCAL_MACHINE \ SOFTWARE\ MICROSOFT \ Windows NT\CURRENTVERSION\ Windows键的值Applnit_Dlls中。

当一个进程启动时,系统会在新启动的进程调用入口函数之前加载上下文中指定的dll。Dll必须在它的初始化过程中注册窗口类并且必须指定为CS_GLOBALCLASS风格

要删除一个应用程序全局类,并释放与它相关联的存储,使用UnregisterClass函数。

<3>应用程序局部类

一个应用程序局部类是exe或者dll注册只让自己用的。尽管你可以注册许多局部类,但是通常只注册一个。这个窗口类支持应用程序主窗口的窗口过程。

当注册窗口类的模块关闭的时候,系统会销毁局部类。应用程序也可以调用UnregisterClass函数来移除局部类并且释放和它相关的内存。

2系统是怎样找到一个窗口类

系统会为每种类型的窗口类(即以上说明的三种窗口类)分别维护一个结构列表。当应用程序调用CreateWindow或CreateWindowEx来创建一个窗口时,系统会根据指定的窗口类,按照以下过程来定位这个类:

<1> 根据指定的窗口类名和进程(或模块)的实例句柄(因为其它模块,也会以相同的窗口类名注册,所以会以模块的实例句柄作区分),查找Application Local Classes;

<2> 若没有在1步骤中找到,则查找ApplicationGlobal Classes;

<3> 若没有在2步骤中找到,则查找SystemClasses;

所有由应用程序创建的窗口,包括因应用程序的行为使系统创建的窗口,都是采用这个过程定位的。

Window Classes

时间: 2024-10-07 06:28:56

Window Classes的相关文章

Win32中安全的子类化(翻译)

关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核.甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助. 原文标题:Safe Subclassing in Win32作者:Kyle MarshMSDN技术组 点击此处查看原文 摘要 本文描述了Win32环境下的子类化,描述了它是如何工作的以及实现安全的子类化必须要遵循的规则.本文涵盖了实例子类化和全局子类化.而超类化则作为一个全局子类化的可选替代方案被介绍.从Win16到

Delphi DLL制作和加载 Static, Dynamic, Delayed 以及 Shared-Memory Manager

一 Dll的制作一般分为以下几步:1 在一个DLL工程里写一个过程或函数2 写一个Exports关键字,在其下写过程的名称.不用写参数和调用后缀.二 参数传递1 参数类型最好与window C++的参数类型一致.不要用DELPHI的数据类型.2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态.成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容.3 用stdcall声明后缀.4 最好大小写敏感.5 无须用far调用后缀,那只是为了与windows 1

Windows Error Codes

http://www.briandunning.com/error-codes/?source=Windows Windows Error Codes List All Error Codes | Search Errors: FileMaker Error Codes Lasso Error Codes MySQL Error Codes Windows System Errors About this databaseThis is a free public resource. It is

MFC程序的来龙去脉

引言 : 侯捷老师在他那本著名的"深入浅出MFC"(第二版)的第六章中对比着传统的Win32API编程,详细讲解了MFC应用程序"生死因果",而且侯捷 老师还在"深入浅出MFC"(第二版)一书的"无责任书评"中称应用程序和MFC Framework的因果关系,是学习MFC程序设计的关键,并把它作为学习MFC程序设计的"第一个台阶". 正文 : 初学MFC程序设计的人(甚至包括已经很精通Win32API编程的

wxpython wx.windows的API

wx.Window is the base class for all windows and represents any visible object on screen. All controls, top level windows and so on are windows. Sizers and device contexts are not, however, as they don't appear on screen themselves. Please note that a

Meandering Through the Maze of MFC Message and Command Routing

Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a freelance software consultant specializing in developing C++ applications for Windows. He is the author of Windows++: Writing Reusable Code in C++ (Addiso

windows消息机制详解(转载)

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息.例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标.这个记录类型叫做TMsg, 它在Windows单元中是这样声明的:typeTMsg = packed recordhwnd: HWND; / /窗口句柄message: UINT; / /

CreateWindow创建无边框 可拉伸窗体

createwindow 定义 HWND WINAPI CreateWindow( _In_opt_ LPCTSTR lpClassName, _In_opt_ LPCTSTR lpWindowName, _In_ DWORD dwStyle, _In_ int x, _In_ int y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE h

Delphi使用普通类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good

在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了.delphi提供了一个函数Classes.AllocateHWnd.分析AllocateHWND发现delphi CreateWindowEx一个尺寸为0的窗口,窗口是生成了,Handle也有了,但窗口的消息要处理吧,否则怎么说让对象接收Windows消息呢,但我们都知道类函数和Windows消息处理函数是不一