Передача сообщений из подкласса в оригинальный WndProc - PullRequest
5 голосов
/ 22 октября 2008

Я читал документацию MSDN по подклассам и мне удалось обработать события в подклассе

Моя проблема связана с передачей сообщений обратно на оригинальный WndProc.

Например, если у меня есть окно с субклассовым элементом управления групповым ящиком и кнопкой в ​​качестве дочернего элемента этого группового ящика, я хочу обработать событие кнопки в исходной процедуре окна, а не в процедуре подклассового группового блока. 1007 *

По сути, я хочу пустую процедуру подкласса:

LRESULT FAR PASCAL SubClassFunc(HWND hwnd,
                        UINT uMsg,
                WPARAM wParam,
                LPARAM lParam)
{
    return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
}

Где oldProc:

FARPROC oldProc = (FARPROC)SetClassLong(group_box, GCL_WDPROC, (DWORD)SubCLassFunc);

А где окно, группа и кнопка:

HWND window = CreateWindowEx(
    WS_EX_WINDOWEDGE, 
    appname,
    TEXT("Subclass Test"),
    WS_VISIBLE |WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    300,
    400,
    NULL,
    NULL,
    hInstance,
    0);

HWND group_box = CreateWindowEx(
    0,
    TEXT("BUTTON"),
    TEXT("Group Box"),
    WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
    8,
    8,
    275,
    350,
    window,
    NULL,
    hInstance,
    0);

HWND push_button = CreateWindowEx(
    0,
    TEXT("BUTTON"),
    TEXT("Push Button"),
    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_VCENTER,
    50,
    100,
    100,
    25,
    group_box,
    (HMENU)PUSH_BUTTON,
    hInstance,
    0);

Я могу обрабатывать события кнопок в SubClassFunc, но я хочу передать их обратно в окно WndProc. Кажется, что CallWindowProc не делает этого, или я могу быть совершенно неправ в том, как работает CallWindowProc.

Ответы [ 2 ]

4 голосов
/ 22 октября 2008

Уведомления кнопки отправляются родителю кнопки, который является групповым блоком. Поскольку вы подклассировали групповой блок, ваш SubClassFunc получает эти сообщения, которые затем передают их в исходную оконную процедуру группового блока, используя CallWindowProc.

Если вы хотите, чтобы уведомления кнопок переходили в родительское окно (т. Е. window в вашем коде), вы можете либо установить для родителя кнопки значение window вместо group_box, либо использовать PostMessage изнутри SubClassFunc для отправки сообщения (WM_COMMAND или WM_NOTIFY в зависимости от ситуации) на window.

Кроме того, я вижу, что вы используете SetClassLong для установки процедуры окна. Это заменяет оконную процедуру для всего класса BUTTON, но только для окон, которые впоследствии создаются. Любые BUTTON окна, созданные до вызова SetClassLong, не будут разделены на подклассы. Возможно, вы захотите использовать SetWindowLong вместо того, чтобы создавать подклассы для отдельных окон, а не для всего класса.

Редактировать: оригинальная процедура окна группы не отправляет WM_COMMAND сообщения своему родителю. Это объясняется в книге Programming Windows Чарльза Петцольда:

Групповое поле, которое имеет стиль BS_GROUPBOX, является странностью в классе кнопок. Он не обрабатывает ввод с помощью мыши или клавиатуры и не отправляет сообщения WM_COMMAND своему родителю.

Вы должны обнаружить, что уведомления кнопок не доходят до window, даже если вы не подклассифицируете групповое поле.

Надеюсь, это поможет!

0 голосов
/ 22 октября 2008

Я подозреваю, что если вы удалите подкласс все вместе, события кнопки все равно не достигнут исходной оконной процедуры, как вы ожидаете.

Поскольку у вас есть процедура подкласса, которая не делает ничего, кроме вызова CallWindowProc , окно фактически не является подклассом.

Я бы предложил использовать инструмент Spy ++ , чтобы увидеть, в какое окно поступают сообщения о событиях кнопки.

Одним из наиболее сложных аспектов программирования на Win32 является определение того, какое окно получает какое сообщение, и Spy ++ неоценим, когда дело доходит до выяснения этой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...