WIN32:ツールバーダイアログは決してフォーカスを得ることができず、メインウィンドウを処理しますか?
質問
以下のアプリケーションを書いています このチュートリアル. 。このチュートリアルの日付があることを知っているので、Unicodeを考慮するためにコードを適応させました。
MDIのように見えるメインウィンドウがあります。それから、私は持っています 意見 表示および非表示のツールバーダイアログを切り替えるメニュー。
ダイアログを表示すると表示されますが、 PUSHBUTTON
Sは正しく表示されません。メインウィンドウをもう一度クリックしたときにのみ表示されます。
さらに、私はどちらもクリックできないようです PUSHBUTTON
私のツールバーダイアログにs。
リソース(resource.h
)は次のように定義されています(この質問に関連するもののみを示しています):
#define IDD_TOOLBAR 102
#define IDC_PRESS 1000
#define IDC_OTHER 1001
#define ID_VIEW_SHOWTOOLBAR 40002
#define ID_VIEW_HIDETOOLBAR 40003
次のようなダイアログ .rc
ファイル:
IDD_TOOLBAR DIALOGEX 0, 0, 85, 50
STYLE DS_FIXEDSYS | DS_MODALFRAME | WS_CAPTION | WS_POPUP
EXSTYLE WS_EX_TOOLWINDOW
CAPTION L"Toolbar"
FONT 8, "MS Shell Dlg"
BEGIN
PUSHBUTTON L"&Press this button", IDC_PRESS, 7, 7, 70, 14
PUSHBUTTON L"&Or this one", IDC_OTHER, 7, 28, 70, 14
END
そして、私の中に次のように表示されます wndproc 働き:
// As a global variable I have my toolbar handler.
HWND g_hToolbar = NULL;
BOOL CALLBACK ToolbarDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case IDC_OTHER:
MessageBoxW(hWnd, L"You just clicked IDC_OTHER!", L"Information", MB_OK | MB_ICONINFORMATION);
break;
case IDC_PRESS:
MessageBoxW(hWnd, L"You just clicked ODC_PRESS!", L"Information", MB_OK | MB_ICONINFORMATION);
break;
default:
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_VIEW_HIDETOOLBAR:
ShowWindow(g_hToolbar, SW_HIDE);
break;
case ID_VIEW_SHOWTOOLBAR:
if (NULL == g_hToolbar)
g_hToolbar = CreateDialogW(GetModuleHandle(NULL)
, MAKEINTRESOURCE(IDD_TOOLBAR)
, hWnd
, ToolbarDlgProc);
ShowWindow(g_hToolbar, SW_SHOW);
break;
}
break;
default:
return DefWindowProcW(hWnd, Msg, wParam, lParam);
}
}
そして、これが私のメインウィンドウのさまざまなメッセージを処理する方法と、私のメッセージループでのダイアログを私の ウィンメイン 働き。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
// Declaring, registring and creating my main window to hWnd here...
MSG Msg;
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
if (!IsDialogMessageW(g_hToolbar, &Msg)) {
TranslateMessage(&Msg);
DispatchMessageW(&Msg);
}
}
}
私の問題は次のとおりです。
ダイアログのボタンをクリックできないようです。
ダイアログのボタンをクリックしようとすると、メインウィンドウが独自のメッセージに応答するのが非常に遅くなります。
つまり、モーダルを表示すると完全に機能するため、ツールバーダイアログをモードレスダイアログとして表示したい場合です。
この問題を解決する手がかりはありますか?
ありがとう!
解決
問題は、Drejが上記のコメントで言ったように、私のメッセージポンプでです。
問題は私が書くことです:
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
// Processing message here...
}
そして、私が書くこと:
while (GetMessageW(&Msg, NULL, 0, 0) > 0) {
// Processing message here...
}
だから、私は特定のウィンドウのメッセージを受け取っていたので、 hwnd たとえば、私のツールバルディアログは、完全に自分自身やそのようなものを描く時間がないように見えました。交換 hwnd にとって ヌル そのシナリオでは、問題が完全に解決されました。