以下是 SUBCLASSPROC 的定义:
typedef LRESULT CALLBACK SUBCLASSPROC(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
UINT_PTR uIdSubclass,
DWORD_PTR dwRefData
);
SUBCLASSPROC 函数接收以下参数:
- hWnd: 子类化窗口的句柄。
- uMsg: 消息类型。
- wParam 和 lParam: 消息参数。
- uIdSubclass: 用于标识子类化的 ID。
- dwRefData: 用户定义的数据。
函数返回一个 LRESULT 值,通常是消息的处理结果。
使用 SetWindowSubclass 函数,你可以将一个子类化的窗口过程与一个窗口关联起来,这个过程可以是 SUBCLASSPROC 类型的函数。以下是 SetWindowSubclass 函数的原型:
BOOL SetWindowSubclass(
HWND hWnd,
SUBCLASSPROC pfnSubclass,
UINT_PTR uIdSubclass,
DWORD_PTR dwRefData
);
- hWnd: 要子类化的窗口句柄。
- pfnSubclass: 子类化的窗口过程的回调函数。
- uIdSubclass: 子类化的 ID,用于标识子类化的窗口过程。
- dwRefData: 用户定义的数据,传递给子类化的窗口过程。
这个机制允许你截取和处理窗口消息,而不必完全替换窗口过程。这对于在不修改现有窗口过程的情况下添加自定义行为非常有用。
以下是一个简单的示例,展示如何使用 SUBCLASSPROC 和 SetWindowSubclass:
#include <Windows.h>
#include <CommCtrl.h>
LRESULT CALLBACK MySubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (uMsg)
{
case WM_DESTROY:
MessageBox(hWnd, L"Window is being destroyed!", L"Subclass Callback", MB_OK | MB_ICONINFORMATION);
break;
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
int main()
{
// 创建窗口
HWND hWnd = CreateWindowEx(0, L"BUTTON", L"Click me",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 200,
NULL, NULL, GetModuleHandle(NULL), NULL);
// 子类化窗口
SetWindowSubclass(hWnd, MySubclassProc, 1, 0);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
在这个例子中,MySubclassProc 函数是子类化的窗口过程,用于处理窗口销毁时的消息。这个过程通过 SetWindowSubclass 与按钮窗口关联,当窗口被销毁时,弹出一个消息框。
转载请注明出处:http://www.zyzy.cn/article/detail/24872/Win32 API/Commctrl.h/SUBCLASSPROC