我有一个自定义窗口封装在一个静态WndProc函数的类中,以处理由它生成的消息。现在我有一个子类,它实现了消息处理过程中的一些特性,与父类不同。处理来自子类的Windows消息
例如,在下面的代码中,子类中的WM_LBUTTONDOWN发生的情况与父类中发生的情况有所不同。
我想过多态性,但我认为它不会工作,因为从父类调用:: SetWindowLongPtr(),并且“this”指针传递给属于父类,纠正我,如果我错了。
如果我错了,多态性将在这种情况下工作,那么也有一些消息,这些消息不是由父类处理,应该在子类中处理,并将一个空虚拟函数放在父类中,仅用于这似乎并不干净,除了很难为窗口产生的每一条消息提供一个空的虚拟函数外,这些消息仅仅是为了将来它将被使用。
会有几个这样的子类,每个子类对于某些消息的行为不同,但不是全部。
那么,我该怎么去做。
parent.cpp
parent::parent()
{
WNDCLASSEX wincl;
wincl.hInstance = hInstance;
wincl.lpszClassName = "parent";
wincl.lpfnWndProc = WndProc;
wincl.style = CS_BYTEALIGNWINDOW;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = 0;
wincl.hIconSm = 0;
wincl.hCursor = ::LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 4;
wincl.hbrBackground = ::CreateSolidBrush(backgroundColor);
::RegisterClassEx (&wincl);
hwnd = ::CreateWindowEx (0, "parent", txt.c_str(), WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD, x, y, width, height, parent, 0, hInstance, 0) ;
::SetWindowLongPtr(hwnd , GWLP_USERDATA , (LONG) this) ;
}
LRESULT CALLBACK parent::WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
view::parent* panel = reinterpret_cast < view::parent* > ( ::GetWindowLongPtr (hwnd , GWLP_USERDATA) );
switch (message)
{
case WM_CREATE:
::SendMessage (hwnd, WM_SETFONT, (WPARAM) panel->hFont, (LPARAM) true);
break ;
case WM_COMMAND:
return panel->command (message, wParam, lParam);
break ;
case WM_LBUTTONDOWN:
return panel->lButton (message, wParam, lParam);
break;
case WM_RBUTTONDOWN:
return panel->rButton (message, wParam, lParam);
break;
case WM_ERASEBKGND:
return 1;
break;
case WM_PAINT:
return panel->paint ();
break ;
default:
return ::DefWindowProc (hwnd, message, wParam, lParam);
}
return 0 ;
};
感谢。
一种常见的方法来做到这是创建虚拟或纯虚成员函数,例如'虚拟LRESULT onButtonDown(...){}'等 –
@JoshGreifer所以你说在这种情况下Polymorphism将工作,即使“this”指针传递给:: SetWindowLongPtr()属于父类? – StudentX
使'parent :: WndProc'虚拟。派生类重写'child :: WndProc',处理它们想要重写的消息,对于那些他们不想重写的消息,将调用转发给'parent :: WndProc'。 [这是一项标准技术](http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx)。 –