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」関数のデフォルト部分で呼び出されます。
今のところ、私のボタンは「クリック」をまったく受けていません。クリックしても何も起こりません(視覚的に変化せず、WM_COMMANDも呼び出しません)。そのボタンからのすべてのメッセージが messageProc 関数によって処理されているためだと推測しています。これにより、メッセージのブロックが発生しています...たとえば、ボタンコントロールの 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 関数を書き直すことを検討していますが、ほぼすべてのユーザー入力メッセージでサブクラス化されたすべてのウィンドウを考慮する必要があります... または、サブクラス化を忘れてしまいます。