Ich schreibe eine Anwendung nach this tutorial. Ich bin mir bewusst, dass dieses Tutorial datiert, und so habe ich den Code angepasst, um den Unicode zu berücksichtigen.Win32: Toolbar Dialogfeld scheint nie den Fokus zu bekommen und verursacht das Hauptfenster langsam zu verarbeiten?
Ich habe ein Hauptfenster, das wie ein MDI aussieht. Dann habe ich ein View Menü, das einen Toolbar-Dialog ein- und ausblendet. Wenn ich den Dialog zeige, wird er angezeigt, aber die PUSHBUTTON
s werden nicht korrekt angezeigt. Sie erscheinen nur, wenn ich wieder auf mein Hauptfenster klicke.
Außerdem scheint ich nicht in der Lage zu sein, keines 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 in meiner .rc
Datei folgt:
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 wie folgt 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 mein Hauptfenster und mein Dialogfeld in meiner Nachrichtenschleife in meiner WinMain Funktion behandeln.
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:
scheine ich nicht in der Lage sein, auf meinem Dialog Schaltflächen zu klicken.
Wenn ich versuche, auf die Schaltflächen meines Dialogs zu klicken, reagiert mein Hauptfenster sehr langsam auf seine eigenen Nachrichten.
Das heißt, wenn ich möchte, dass mein Toolbar Dialog als modalen Dialog zeigen, denn wenn ich es modal zeigen, es funktioniert perfekt!
Irgendwelche Hinweise, um dieses Problem zu lösen?
Danke!
Ihr Code sieht ziemlich gut aus. Aus Ihrer Beschreibung sieht es so aus, als ob das Problem in der Nachrichtenpumpe liegt, aber es sieht gut aus. Haben Sie einen speziellen Code in ToolbarDlgProc, den wir betrachten müssen? – DReJ
Die 'ToolbarDlgProc' wurde bearbeitet, um anzuzeigen, was darin enthalten ist. Danke, dass Sie sich die Zeit genommen haben, mein Problem zu betrachten. =) Ich bezweifle auch die Nachrichtenpumpe, aber da ich immer noch Win32s lerne, kann ich nicht richtig debuggen. –
Gerade versuchte MDI und SDI-Anwendung mit Ihrem Code, es funktioniert OK für mich. Have keine Ahnung ... Ich weiß, es wird nicht mit Ihrem Problem helfen, aber wenn Sie Win32Api verwenden möchten, würde ich Ihnen empfehlen, auf WTL zu schauen, es ist guter Wrapper für WinApi, gute Sachen :) – DReJ