首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在编辑控件上未触发回调

在编辑控件上未触发回调
EN

Stack Overflow用户
提问于 2019-06-21 06:40:50
回答 1查看 64关注 0票数 1

我正在尝试将回调事件处理程序附加到windows控件。我的代码如下:

URLInput.c

代码语言:javascript
复制
#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中,我是这样调用的:

代码语言:javascript
复制
INT WINAPI WinMain(  
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nShowCmd)
{
...
URLInputHwnd = URLInput(hwnd);
...

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

我已经检查了MSDN文档,尽管我找不到任何关于将WNDCLASS与控件一起使用的内容。

你知道我哪里错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-21 08:19:40

感谢@Thomas在评论中的帮助。我解决了创建组件的子类化问题。

URLInput.c

代码语言:javascript
复制
#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

代码语言:javascript
复制
URLInputHwnd = URLInput(hwnd);
/* Error checking */
setOldURLInputProc((WNDPROC)SetWindowLongPtr (URLInputHwnd, GWLP_WNDPROC, (LONG_PTR)URLInputWndProc));

微软的帮助文档:https://docs.microsoft.com/en-us/windows/desktop/controls/subclassing-overview

一切都很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56694718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档