2012-04-23 5 views
0

Я пытаюсь заставить свою программу отображать различные диалоговые окна без моделирования, когда выбираются разные пункты меню. Пока я только работаю над отображением 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; 

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

Любая помощь по этому вопросу будет замечательной!

+0

Отсутствует код, создающий модальный диалог. И, видимо, этот код - это то, о чем вы просите. Во всяком случае, если вы код на C++, а не C, станет намного понятнее и безопаснее. Имейте в виду, что montrosity 'tWinMain' не является ни стандартным C, ни стандартным C++, и что он не выполняет никаких технических целей. Это только обертка Microsoft, поэтому используйте стандартный 'main'. Кроме того, это помогает не использовать глобальные переменные. И не используйте приведения стиля C в целом. –

+0

Почему ваш обработчик 'WM_CREATE' пытается снова создать диалог? – Deanna

+0

Я решил проблему. Не было необходимости также создавать диалоги g_hToolbar. Я просто переместил «ShowWindow» (g_hToolbar, SW_SHOW), 'to' WM_INITDIALOG' и его работу для меня. – L337BEAN

ответ

0

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

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