【发布时间】:2012-04-23 12:42:30
【问题描述】:
我一直试图让我的程序在选择不同的菜单项时显示不同的无模式对话框。到目前为止,我只致力于显示 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;
}
这是我的关于框的代码:
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 编码,事情会变得更加清晰和安全。请注意,
tWinMainmonstrosity 既不是标准 C,也不是标准 C++,而且它没有任何技术用途。这只是微软的混淆,所以,使用标准的main。此外,它有助于不使用全局变量。一般情况下,不要使用 C 风格的强制转换。 -
为什么您的
WM_CREATE处理程序会再次尝试创建对话框? -
我已经解决了这个问题。也不需要 g_hToolbar 创建对话框。我刚刚将
ShowWindow(g_hToolbar, SW_SHOW);移动到WM_INITDIALOG,它对我有用。
标签: c++ winapi dialog modeless