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;
我粘貼的代碼,這樣大段的道歉,但我不知道作爲呼叫到問題出在哪裏。
任何幫助,這將是偉大的!
代碼創建模式對話框丟失。顯然這個代碼就是你所問的。無論如何,如果你用C++而不是C編寫代碼,事情會變得更加清晰和安全。請注意,'tWinMain'怪物既不是標準的C也不是標準的C++,並且它沒有任何技術用途。這只是微軟的混淆,所以使用標準的'main'。另外,它有助於不使用全局變量。一般來說,不要使用C風格的演員。 – 2012-04-23 13:15:48
爲什麼你的'WM_CREATE'處理程序再次嘗試並創建對話框? – Deanna 2012-04-23 13:18:42
我已經解決了這個問題。沒有必要讓g_hToolbar創建對話框。我只是將'ShowWindow(g_hToolbar,SW_SHOW);'移到'WM_INITDIALOG'併爲我工作。 – L337BEAN 2012-04-23 13:21:19