C++ Запуск нескольких немодальных диалогов с использованием WINAPI (без MFC)

Я пытался заставить свою программу отображать разные немодальные диалоговые окна при выборе разных пунктов меню. Пока я работаю только над отображением 1, но я не могу заставить это работать.

Когда я запускаю свой код, я вижу, что главное окно теряет фокус, но диалоговое окно «О программе» не отображается.

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;
}

Вот код для моего поля about:

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;

Я извиняюсь за вставку таких больших участков кода, но я не знаю, где именно проблема.

Любая помощь в этом будет здорово!


person L337BEAN    schedule 23.04.2012    source источник
comment
Код создания модального диалога отсутствует. И, видимо, именно этот код и есть то, о чем вы спрашиваете. В любом случае, если вы кодируете на C++ вместо C, все станет намного понятнее и безопаснее. Имейте в виду, что tWinMain чудовищность не является ни стандартным C, ни стандартным C++, и что она не служит никакой технической цели. Это всего лишь обфускация Microsoft, поэтому используйте стандартный main. Кроме того, это помогает не использовать глобальные переменные. И вообще не используйте приведения в стиле C.   -  person Cheers and hth. - Alf    schedule 23.04.2012
comment
Почему ваш обработчик WM_CREATE пытается снова создать диалог?   -  person Deanna    schedule 23.04.2012
comment
Я решил проблему. Не было необходимости и в g_hToolbar для создания диалогов. Я только что переместил ShowWindow(g_hToolbar, SW_SHOW); в WM_INITDIALOG, и это работает для меня.   -  person L337BEAN    schedule 23.04.2012


Ответы (1)


Эта проблема была решена.

Решение содержится в комментариях.

person L337BEAN    schedule 24.04.2012