控制子类的过程不起作用。为什么?
The procedure of control subclassed does not work. Why?
我最近尝试使用 SetWindowSubclass()
函数对控件进行子类化。令我惊讶的是,它一开始运行得很顺利。我创建了控制程序,但它没有收到 WM_LBUTTONDOWN
或 WM_KEYDOWN
之类的消息,我不明白为什么!我昨天一直在搜索,我承认我正在失去希望。
这是我的代码,经过简化(平时很长!):
HWND button = CreateWindow("BUTTON", NULL, WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 100, 200, 250, 50, hwnd, (HMENU)ID_B_JOUER, instance, NULL);
SetWindowSubclass(boutton, ControlProc, ID_B_JOUER, 0);
这里是控制程序:
LRESULT CALLBACK ControlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch(msg)
{
case WM_...:
{
MessageBox(hwnd, "Bonjour!", "Message", MB_ICONINFORMATION); // Here it does not work!!! Something be the message.
break;
}
default:
{
DefSubclassProc(hwnd, msg, wParam, lParam);
}
}
return 0;
}
我想澄清一下,我正在使用 GetLastError()
函数并且它返回了 0(没问题)。我希望有人有解决方案,因为它很奇怪。
您正在创建一个新的 BUTTON
控件并将其分配给一个名为 button
的变量,但您正在使用另一个名为 boutton
的变量进行子类化。
假设这只是一个拼写错误,您的 ControlProc()
对每条消息都是 returning 0,它忽略了 DefSubclassProc()
的 return 值,这可能不会为 0。对于未处理的消息,您必须 return DefSubclassProc()
return。
HWND button = CreateWindow("BUTTON", NULL, WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 100, 200, 250, 50, hwnd, (HMENU)ID_B_JOUER, instance, NULL);
SetWindowSubclass(button, &ControlProc, ID_B_JOUER, 0);
...
LRESULT CALLBACK ControlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (msg)
{
case WM_LBUTTONDOWN:
case WM_KEYDOWN:
{
MessageBox(hwnd, "Bonjour!", "Message", MB_ICONINFORMATION);
break;
}
default:
{
return DefSubclassProc(hwnd, msg, wParam, lParam);
}
}
return 0;
}
我最近尝试使用 SetWindowSubclass()
函数对控件进行子类化。令我惊讶的是,它一开始运行得很顺利。我创建了控制程序,但它没有收到 WM_LBUTTONDOWN
或 WM_KEYDOWN
之类的消息,我不明白为什么!我昨天一直在搜索,我承认我正在失去希望。
这是我的代码,经过简化(平时很长!):
HWND button = CreateWindow("BUTTON", NULL, WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 100, 200, 250, 50, hwnd, (HMENU)ID_B_JOUER, instance, NULL);
SetWindowSubclass(boutton, ControlProc, ID_B_JOUER, 0);
这里是控制程序:
LRESULT CALLBACK ControlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch(msg)
{
case WM_...:
{
MessageBox(hwnd, "Bonjour!", "Message", MB_ICONINFORMATION); // Here it does not work!!! Something be the message.
break;
}
default:
{
DefSubclassProc(hwnd, msg, wParam, lParam);
}
}
return 0;
}
我想澄清一下,我正在使用 GetLastError()
函数并且它返回了 0(没问题)。我希望有人有解决方案,因为它很奇怪。
您正在创建一个新的 BUTTON
控件并将其分配给一个名为 button
的变量,但您正在使用另一个名为 boutton
的变量进行子类化。
假设这只是一个拼写错误,您的 ControlProc()
对每条消息都是 returning 0,它忽略了 DefSubclassProc()
的 return 值,这可能不会为 0。对于未处理的消息,您必须 return DefSubclassProc()
return。
HWND button = CreateWindow("BUTTON", NULL, WS_VISIBLE | WS_CHILD | BS_OWNERDRAW, 100, 200, 250, 50, hwnd, (HMENU)ID_B_JOUER, instance, NULL);
SetWindowSubclass(button, &ControlProc, ID_B_JOUER, 0);
...
LRESULT CALLBACK ControlProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (msg)
{
case WM_LBUTTONDOWN:
case WM_KEYDOWN:
{
MessageBox(hwnd, "Bonjour!", "Message", MB_ICONINFORMATION);
break;
}
default:
{
return DefSubclassProc(hwnd, msg, wParam, lParam);
}
}
return 0;
}