【发布时间】: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;
}
在 main.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 那样做。