我在 Win32 应用程序中有一个带有按钮窗口的静态窗口,我对按钮进行了子类化,因此我可以用我的单个“MessageProc”来处理它的消息。
void MyProgram::Initialize(WNDPROC messageProc)
{
//Here I create a bunch of windows
_resourceWindow = CreateWindow("STATIC", "Resources", WS_CHILD | WS_VISIBLE | WS_SIZEBOX, 5, 5, 200, 600, 0, 0, _mainInstance, NULL);
//The child button
_resourceAddButton = CreateWindow("BUTTON", "Add", WS_CHILD | WS_VISIBLE, 5, 20, 50, 20, _resourceWindow, 0, _mainInstance, NULL);
_resourceAddButtonWndProc = (WNDPROC)SetWindowLongPtr(_resourceAddButton, GWLP_WNDPROC, (WNDPROC)messageProc);
//Messages from this button are sent to messageProc now
}
void MyProgram::SubclassesProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
{
if(hWnd == _resourceAddButton) //I have more than one child button so I'll have to do this one by one right?
{
CallWindowProc(_resourceAddButtonWndProc, hWnd, uMsg, wParam, lParam);
}
}
}
}
这个“SubclassesProc”在我的“messageProc”函数的默认部分被调用。
现在的方式是,我的 Button 根本没有得到“点击”,我点击但没有任何反应(它不会在视觉上发生变化,也不会调用 WM_COMMAND)。我猜这是因为现在来自该 Button 的所有消息都由 messageProc 函数处理,这导致了一些消息阻塞......例如,Button 控件中的 WM_LBUTTONDOWN 永远不会被调用,因为我已经有一个:
switch(uMsg)
{
case WM_LBUTTONDOWN:
{
//I'm doing something else
break;
}
//bunch of other commands
default:
{
myProgram.SubclassesProc(hWnd, uMsg, wParam, lParam);
break;
}
}
因此,永远不会调用带有 WM_LBUTTONDOWN 的 SubclassesProc,并且无法单击 Button,因此不会触发 WM_COMMAND。
处理这个问题的正确方法是什么?
现在我正在考虑重写 messageProc 函数,但我必须考虑几乎每个用户输入消息中的每个子类窗口......或者只是忘记子类化。