C 编辑控件上未触发回调
我正在尝试将回调事件处理程序附加到windows控件。我的代码如下: URLInput.cC 编辑控件上未触发回调,c,winapi,C,Winapi,我正在尝试将回调事件处理程序附加到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
#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;
}
#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;
}
天气转晴。但是,如果我在第11行switch(uMsg)
上设置一个断点,它永远不会中断。例如,我希望在创建窗口时它会断开。或者,在输入中输入文本时。但这并没有发生
我已经查看了MSDN文档,尽管我找不到任何关于将WNDCLASS
与控件一起使用的内容
你知道我哪里出错了吗?谢谢@Thomas在评论中的帮助。我解决了将创建的组件子类化的问题 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;
}
#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;
}
Microsoft文档有助于:
一切正常。已经很久了,但是
CreateWindowExW
(L“EDIT”
)中的类名不应该与注册回调的类名匹配吗(L“EDIT Control”
)?我也这么认为。我用L“编辑”
尝试了这两种方法。如果我这样做,根本不会渲染。这里的示例:使用相同的名称。啊,是的,但这是主窗口。我在文档的某个地方读到,当为控件创建窗口时,必须指定控件类。比如这里:我认为你需要做一些类似的事情。