Win32: Toolbar Dialog scheint nie Fokus zu erhalten und bewirkt, dass sich das Hauptfenster langsam verarbeiten?
Frage
Ich schreibe eine Anwendung folgende dieses Tutorial . Ich bin mir bewusst, dass dieses Tutorial Daten, und als solche habe ich den Code angepasst haben Berücksichtigung der Unicode zu nehmen.
Ich habe ein Hauptfenster, das wie ein MDI aussieht. Dann habe ich eine Menü, das eine Toolbar Dialog schaltet wie ein- und ausgeblendet werden.
Wenn ich den Dialog zeigen, ist es angezeigt, aber die PUSHBUTTON
s werden nicht richtig angezeigt. Sie erscheinen nur, wenn ich wieder mein Hauptfenster klicken.
Plus, ich habe nicht in der Lage sein scheinen weder der PUSHBUTTON
s in meiner Symbolleiste Dialog zu klicken.
Die Ressourcen (resource.h
) sind wie folgt definiert (nur zeigen, was auf diese Frage relevant ist):
#define IDD_TOOLBAR 102
#define IDC_PRESS 1000
#define IDC_OTHER 1001
#define ID_VIEW_SHOWTOOLBAR 40002
#define ID_VIEW_HIDETOOLBAR 40003
Und der Dialog wie folgt in meiner .rc
-Datei:
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
Und zeigt es folgt wie in meinem WndProc Funktion:
// 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);
}
}
Und hier ist die Art, wie ich die verschiedenen Nachrichten für meine Hauptfenster behandeln und meinen Dialog in meiner Nachrichtenschleife in meiner WinMain Funktion.
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);
}
}
}
Mein Problem ist:
-
Ich scheine nicht in der Lage sein, auf meinem Dialogs des Schaltflächen zu klicken.
-
Wenn ich auf Tasten meines Dialoges klicken versuchen, wird mein Hauptfenster sehr langsam reagieren auf seine eigenen Nachrichten.
Das heißt, wenn ich meinen Toolbar Dialog als modalen Dialog angezeigt werden soll, denn wenn ich zeige es Modal, es funktioniert perfekt!
Jeder Hinweis, dieses Problem zu lösen?
Danke!
Lösung
Das Problem ist, wie Drej in dem obigen Kommentar sagte, in meinem Meldungsverteilschleife.
Das Problem ist, dass ich schreiben:
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
// Processing message here...
}
Und das werde ich schreiben:
while (GetMessageW(&Msg, NULL, 0, 0) > 0) {
// Processing message here...
}
Also, weil ich die Nachrichten für ein bestimmtes Fenster bekommen, die hWnd So schien mein ToolbarDialog Mangel an Zeit selbst ganz oder etwas ähnliches zu ziehen. Ersetzen hWnd NULL in dem Szenario, das Problem vollständig gelöst.