Обратный вызов не срабатывает при редактировании - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь прикрепить обработчик события обратного вызова к элементу управления Windows. Мой код ниже:

URLInput.c

#include <windows.h>

#define ID_EDITCHILD 100

LRESULT CALLBACK URLInputWndProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (uMsg) // Breakpoint set here never fires
    {
        ...
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

HWND URLInput(HWND hwnd)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    WNDCLASSW wc = { 0 };

    wc.lpszClassName = L"Edit Control";
    wc.lpfnWndProc  = URLInputWndProc;
    wc.hInstance    = hInstance;

    RegisterClassW(&wc);

    hwnd = CreateWindowExW(
        0,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL, 
        0,
        0,
        100,
        100,
        hwnd,
        (HMENU) ID_EDITCHILD,
        (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL
    );

    if (hwnd == NULL) {
        return 0;
    }

    return hwnd;
}

В main.c Я звоню так:

INT WINAPI WinMain(  
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nShowCmd)
{
...
URLInputHwnd = URLInput(hwnd);
...

Хорошо. Но если я установлю точку останова в строке 11 switch(uMsg), она никогда не сломается. Я ожидаю, что он сломается, когда окно будет создано, например. Или при вводе текста на вход. Но этого не происходит.

Я проверил документацию MSDN, хотя не могу найти ничего по использованию WNDCLASS с элементами управления.

Есть идеи, где я иду не так?

1 Ответ

1 голос
/ 21 июня 2019

Спасибо @Thomas за помощь в комментариях.Я решил проблему с созданием подкласса созданного компонента.

URLInput.c

#include <windows.h>

#define ID_EDITCHILD 100

static WNDPROC oldURLInputProc = 0;

LRESULT CALLBACK URLInputWndProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch (uMsg)
    {
        /* Do something with messages */
    }

    return CallWindowProc(oldURLInputProc, hwnd, uMsg, wParam, lParam);
}

HWND URLInput(HWND hwnd)
{
    return CreateWindowExW(
        0,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL, 
        0,
        0,
        100,
        100,
        hwnd,
        (HMENU) ID_EDITCHILD,
        (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
        NULL
    );
}

void setOldURLInputProc(WNDPROC wndProc)
{
    oldURLInputProc = wndProc;
}

И в main.c :

URLInputHwnd = URLInput(hwnd);
/* Error checking */
setOldURLInputProc((WNDPROC)SetWindowLongPtr (URLInputHwnd, GWLP_WNDPROC, (LONG_PTR)URLInputWndProc));

Помогла документация Microsoft: https://docs.microsoft.com/en-us/windows/desktop/controls/subclassing-overview

Все отлично работает.

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