【问题标题】:Callback not firing on edit control回调未在编辑控件上触发
【发布时间】:2019-06-21 09:13:28
【问题描述】:

我正在尝试将回调事件处理程序附加到 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;
}

在 ma​​in.c 我这样称呼:

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

它渲染得很好。但是,如果我在第 11 行 switch(uMsg) 设置断点,它永远不会中断。例如,我希望它在创建窗口时中断。或者,在输入中输入文本时。但这不会发生。

我查看了 MSDN 文档,但找不到任何关于使用 WNDCLASS 和控件的内容。

任何想法我哪里出错了?

【问题讨论】:

  • 已经很久了,但 CreateWindowExW (L"EDIT") 中的类名不应该与您注册回调的类名 (L"Edit Control") 匹配吗?
  • 我也是这么想的。我用L"EDIT" 都试过了。如果我这样做,根本不会渲染。
  • 此处的示例:Creating a Window 使用相同的名称。
  • 啊,是的,但那是主窗口。在为控件创建窗口时,我在文档的某处阅读了您必须指定控件类的内容。喜欢这里:docs.microsoft.com/en-us/windows/desktop/controls/…
  • 我认为你需要像Subclassing Controls 那样做。

标签: c winapi


【解决方案1】:

感谢@Thomas 在 cmets 中的帮助。我解决了对创建的组件进行子类化的问题。

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;
}

在 ma​​in.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

一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2011-10-07
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2020-08-08
    相关资源
    最近更新 更多