Я пытаюсь заставить свою программу отображать различные диалоговые окна без моделирования, когда выбираются разные пункты меню. Пока я только работаю над отображением 1, но я не могу заставить это работать.C++ Запуск нескольких беспроблемных диалогов с использованием WINAPI (без MFC)
Когда я запускаю свой код, я вижу, как основное окно теряет фокус, но диалоговое окно не отображается.
HWND g_hToolbar = NULL;
HWND hDlgCurrent = NULL;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg;
HACCEL hAccelTable;
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_GUIAPP, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
if(!IsDialogMessage(g_hToolbar, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
Вот код для моего о коробке:
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_CREATE:
g_hToolbar = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUTBOX),
hDlg, ToolDlgProc
);
if(g_hToolbar != NULL)
{
ShowWindow(g_hToolbar, SW_SHOW);
}
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_ACTIVATE:
if (0 == wParam) // becoming inactive
hDlgCurrent = NULL;
else // becoming active
hDlgCurrent = hDlg;
return FALSE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDOK)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
Тогда мой вызов в WndProc
case IDM_ABOUT:
CreateDialog(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
Я извиняюсь за наклеивать такие большие участки кода, но я не знаю, как где именно проблема.
Любая помощь по этому вопросу будет замечательной!
Отсутствует код, создающий модальный диалог. И, видимо, этот код - это то, о чем вы просите. Во всяком случае, если вы код на C++, а не C, станет намного понятнее и безопаснее. Имейте в виду, что montrosity 'tWinMain' не является ни стандартным C, ни стандартным C++, и что он не выполняет никаких технических целей. Это только обертка Microsoft, поэтому используйте стандартный 'main'. Кроме того, это помогает не использовать глобальные переменные. И не используйте приведения стиля C в целом. –
Почему ваш обработчик 'WM_CREATE' пытается снова создать диалог? – Deanna
Я решил проблему. Не было необходимости также создавать диалоги g_hToolbar. Я просто переместил «ShowWindow» (g_hToolbar, SW_SHOW), 'to' WM_INITDIALOG' и его работу для меня. – L337BEAN