生成されたメッセージを処理する静的な WndProc 関数を持つクラスにカプセル化されたカスタム ウィンドウがあります。現在、メッセージ処理プロセスの一部の機能を親クラスとは異なる方法で実装する子クラスがあります。
たとえば、次のコードでは、子クラスの WM_LBUTTONDOWN で発生することは、親クラスで発生することとは異なります。
ポリモーフィズムについて考えましたが、 ::SetWindowLongPtr() が親クラスから呼び出され、渡された「this」ポインターが親クラスに属しているため、機能しないと思います。間違っている場合は修正してください。
そして、私が間違っていて、この場合ポリモーフィズムが機能する場合、親クラスによって処理されず、子クラスで処理する必要があるいくつかのメッセージがあり、そのためだけに親クラスに空の仮想関数を配置することはできませんきれいに見えますが、ウィンドウが生成するメッセージごとに空の仮想関数を配置するのは難しいだけでなく、将来それが使用される場合に備えています。
そのような子クラスがいくつかあり、それぞれが一部のメッセージに対して異なる動作をしますが、すべてではありません。
では、どのようにすればよいのでしょうか。
親.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 ;
};
ありがとう。