Win32: dialogo Toolbar sembra mai messa a fuoco e fa sì che la finestra principale per processo lento?
Domanda
Sto scrivendo una domanda in seguito questo tutorial . Sono consapevole che questo tutorial di date, e come tale, ho adattato il codice per prendere in considerazione l'unicode.
Ho una finestra principale che si presenta come un MDI. Poi, ho un Visualizza menu che alterna una finestra Barra degli strumenti per essere mostrato e nascosto.
Quando mostro la finestra di dialogo, viene visualizzato, ma i PUSHBUTTON
s non vengono visualizzati correttamente. Essi appaiono solo quando clicco di nuovo la mia finestra principale.
Inoltre, non mi sembra di essere in grado di fare clic su nessuno dei PUSHBUTTON
s nella mia finestra della barra degli strumenti.
Le risorse (resource.h
) sono definite come segue (solo mostrando ciò che è rilevante a questa domanda):
#define IDD_TOOLBAR 102
#define IDC_PRESS 1000
#define IDC_OTHER 1001
#define ID_VIEW_SHOWTOOLBAR 40002
#define ID_VIEW_HIDETOOLBAR 40003
E la finestra di dialogo come segue nel mio file .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
E mostrando come segue nel mio WndProc Funzione:
// 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);
}
}
Ed ecco il mio modo di gestire i diversi messaggi per il mio finestra principale e la mia finestra del mio ciclo di messaggi nel mio WinMain la funzione.
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);
}
}
}
Il mio problema è il seguente:
-
Non mi sembra di essere in grado di fare clic sui pulsanti del mio dialogo.
-
Quando tento di fare clic sui pulsanti del mio dialogo, la mia finestra principale diventa molto lento a rispondere ai propri messaggi.
Cioè, quando voglio mostrare il mio dialogo Toolbar come un dialogo non modale, perché quando lo mostro modale, funziona perfettamente!
Qualsiasi indizio per risolvere questo problema?
Grazie!
Soluzione
Il problema è, come ha detto Drej nel commento di cui sopra, nella mia pompa messaggio.
Il problema è che scrivo:
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
// Processing message here...
}
E che io scriverò:
while (GetMessageW(&Msg, NULL, 0, 0) > 0) {
// Processing message here...
}
Quindi, perché mi è stato sempre i messaggi per una determinata finestra, la hWnd esempio, il mio ToolbarDialog sembrava la mancanza di tempo per disegnare se stesso completamente o qualcosa di simile. Sostituzione hWnd per NULL in questo scenario ha risolto il problema del tutto.