TN001:windows选件类注册
此说明描述了 MFC 实例特定 WNDCLASSES 由 Microsoft Windows 需要该注册。 MFC 使用的特定 WNDCLASS 属性和 windows 讨论。
问题
一 CWnd 对象的属性,如窗口中 HWND 句柄,在两个位置存储:窗口对象和 WNDCLASS。 WNDCLASS 的名称传递给常规窗口创建功能 (如 CWnd::Create 和 CFrameWnd::Create 在 lpszClassName 参数。
必须通过四种方式之一注册此 WNDCLASS :
隐式使用 MFC 提供的 WNDCLASS,。
隐式通过 subclassing windows 控件 (或其他控件)。
显式通过调用 MFC AfxRegisterWndClass 或 AfxRegisterClass。
显式通过调用 windows 例程 RegisterClass。
WNDCLASS 字段
WNDCLASS 结构包含描述窗口类的各个字段。 下表显示字段并指定在 MFC 应用程序:
字段 |
说明 |
---|---|
lpfnWndProc |
窗口进程,必须是 AfxWndProc |
cbClsExtra |
不使用 (应为零) |
cbWndExtra |
不使用 (应为零) |
hInstance |
在 AfxGetInstanceHandle自动加载 |
hIcon |
框架窗口的图标,请参见下面的 " |
hCursor |
光标为,当鼠标窗口中,在参见 |
hbrBackground |
背景色,请参见下面的 " |
lpszMenuName |
不使用 (应为空) |
lpszClassName |
类名,请参见下面的 " |
提供的 WNDCLASSes
MFC 的早期版本 (在 MFC 4.0) 之前,,假定几个预定义的 windows 类别。 不再提供默认情况下这些窗口类。 应用程序应使用相应的参数的 AfxRegisterWndClass 。
如果应用程序提供了一个资源与指定的资源 ID (例如, AFX_IDI_STD_FRAME), MFC 将使用该资源。 否则它将使用默认资源。 对于图标,使用标准应用图标,并且,对于光标,标准箭头游标使用。
两个图标支持与的 MDI 应用程序单文件类型:主应用程序的图标,另一个图标图标样式的文档/MDIChild 窗口。 对于多个不同的图标的文件类型,必须注册附加 WNDCLASSES 或使用 CFrameWnd::LoadFrame 功能。
CFrameWnd::LoadFrame 将注册 WNDCLASS 使用将指定为第一个参数和以下条件属性的图标 ID:
类样式:CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
图标 AFX_IDI_STD_FRAME
箭头光标
COLOR_WINDOW 背景色
背景色的 CMDIFrameWnd 的值和光标,因为 CMDIFrameWnd 的客户端区域由 MDICLIENT 窗口,其中包括不使用。 Microsoft 不鼓励 subclassing MDICLIENT 窗口,因此请使用标准颜色和光标类型,以后可以。
Subclassing 和控件创建超类
如果您的子类或的 windows 控件创建超类时 (例如, CButton) 因此您的类在该控件的窗口实现自动获取 WNDCLASS 属性提供的。
AfxRegisterWndClass 功能
MFC 提供注册窗口类提供一个 helper 函数。 一组特定属性 (windows 类样式、光标、背景画笔和图标),复合名称生成,,得到的窗口类注册。 例如,
const char* AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon);
此函数返回生成的注册窗口类名的临时字符串。 有关此功能的更多信息,请参见 AfxRegisterWndClass。
该返回的字符串是临时指向静态字符串缓冲区。 它是有效的,直到下调用 AfxRegisterWndClass。 如果要保留此字符串,请将它存储在一个 CString 变量,如下例所示:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClass 将引发 CResourceException ,如果窗口类未注册 (由于错误的参数,或 windows 内存不足)。
RegisterClass 和 AfxRegisterClass 功能
如果要执行复杂的任何内容相比 AfxRegisterWndClass 提供,可以调用 windows API RegisterClass 或 MFC 函数 AfxRegisterClass。 CWnd, CFrameWnd 和 CMDIChildWndCreate 函数采用一个 lpszClassName 字符串名称窗口类作为第一个参数。 可以使用任何注册窗口类名,无论您使用注册它的方法。
使用 AfxRegisterClass (或 AfxRegisterWndClass) 很重要在 Win32 的 DLL。 Win32 DLL 不自动注册的注销类,因此,您必须显式地取消注册类,在 DLL 被终止时。 通过使用而不是 RegisterClass 的 AfxRegisterClass 这会自动为您处理。 ,当 DLL 终止时,AfxRegisterClass 维护自己的 DLL 注册的单个类列表并自动将取消注册它们。 当您在 DLL 中使用 RegisterClass ,您必须确保所有类中注销,当 DLL 终止时 (在您的 DllMain 函数)。 ,而另一个客户端应用程序尝试使用您的 DLL 时,则可能会导致 RegisterClass 意外失败。