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);
}
}
И вот как я обращаюсь к различным сообщениям для своего главного окна и диалога в моем цикле сообщения в моем Winmain функция
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);
}
}
}
Моя проблема в том, что:
Кажется, я не могу нажать на кнопки моего диалога.
Когда я пытаюсь нажать на кнопки моего диалога, мое главное окно становится очень медленным, чтобы отвечать на свои собственные сообщения.
То есть, когда я хочу показать свой диалог на панели инструментов в качестве бесконечного диалога, потому что, когда я показываю его модально, он работает отлично!
Любая подсказка для решения этой проблемы?
Спасибо!
Решение
Проблема в том, что, как сказал Дрей в приведенном выше комментарии, в моем насосе сообщения.
Проблема в том, что я пишу:
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
// Processing message here...
}
И что я напишу:
while (GetMessageW(&Msg, NULL, 0, 0) > 0) {
// Processing message here...
}
Итак, потому что я получал сообщения для данного окна, hwnd Пример, мой инструмент Bardialog, казалось, не имел времени, чтобы нарисовать себя полностью или что -то в этом роде. Замена hwnd за НУЛЕВОЙ В этом сценарии полностью решил проблему.