在 Win32 API 中,SUBCLASSPROC 回调函数用于子类化窗口,它允许你截取消息并在处理消息前后执行一些自定义的操作。SUBCLASSPROC 是 Commctrl.h 头文件中定义的一个类型别名。

以下是 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