对话框在打开后立即关闭
Dialog Box Closes Immediately After It Opens
我有一个用于用户输入的对话框,它工作正常,现在无论我做什么,对话框都会弹出一秒钟,然后程序在没有警告的情况下死机,调用 WM_DESTROY
即使在我注释掉所有可能的出口之后。只有一个错误,即 no_init_all
错误,但每次出现运行时错误时都会出现,并且在尝试找到解决方案时毫无用处。
这是我的代码:
project.cpp
BOOL CreateMyDialog(HINSTANCE hInstance) {
HWND hWnd = CreateDialog(NULL, MAKEINTRESOURCE(myDialogResource), NULL, (DLGPROC)myDialogProcess);
if (!hWnd) {
return FALSE;
}
myDialogGlobalHandle = hWnd;
ShowWindow(hWnd, SW_SHOW);
//UpdateWindow(hWnd);
return TRUE;
}
INT_PTR CALLBACK myDialogProcess(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
INITCOMMONCONTROLSEX InitCtrlEx;
InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCtrlEx.dwICC = ICC_PROGRESS_CLASS;
InitCommonControlsEx(&InitCtrlEx);
switch(msg) {
case WM_INITDIALOG: {
//Do stuff to prep the dialog
return TRUE;
}
case WM_DESTROY: {
PostQuitMessage(WM_QUIT);
break;
}
}
return TRUE;
}
project.rc
myDialogResource DIALOGEX 600, 400, 286, 108
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION
EXSTYLE WS_EX_OVERLAPPEDWINDOW /*| WS_EX_APPWINDOW*/
CAPTION "My Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
COMBOBOX dropdownList,112,7,61,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
//... it's all syntactically correct controls that still work the split second the dialog is on the screen
END
这是缩短的代码,即使这样,对话框也会自行打开并在屏幕上出现故障。使用我的完整代码,它通常会在应用程序关闭前出现一瞬间。我相信如果我能解决这个小问题,我就能找到我的对话框的问题。所以我的问题是,问题是什么?
编辑:
这是我的 wWinMain
:
HWND myDialogGlobalHandle;
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) {
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
INITCOMMONCONTROLSEX InitCtrlEx;
InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCtrlEx.dwICC = ICC_PROGRESS_CLASS;
InitCommonControlsEx(&InitCtrlEx);
if (!CreateMyDialog(hInstance)) {
//return FALSE;
}
else {
MSG message = { 0 };
while (GetMessage(&message, nullptr, 0, 0)) {
if (!IsDialogMessage(myDialogGlobalHandle, &message)) {
DispatchMessage(&message);
}
}
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJECT));
MSG msg;
// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
事实证明,我的所有代码都是正确的。问题出在我的对话过程中的 case
语句,出于某种原因 Visual Studio 不喜欢 case
语句中的括号。在尝试了一切然后用 break;
语句替换它们之后,我的代码又开始工作了。
我有一个用于用户输入的对话框,它工作正常,现在无论我做什么,对话框都会弹出一秒钟,然后程序在没有警告的情况下死机,调用 WM_DESTROY
即使在我注释掉所有可能的出口之后。只有一个错误,即 no_init_all
错误,但每次出现运行时错误时都会出现,并且在尝试找到解决方案时毫无用处。
这是我的代码:
project.cpp
BOOL CreateMyDialog(HINSTANCE hInstance) {
HWND hWnd = CreateDialog(NULL, MAKEINTRESOURCE(myDialogResource), NULL, (DLGPROC)myDialogProcess);
if (!hWnd) {
return FALSE;
}
myDialogGlobalHandle = hWnd;
ShowWindow(hWnd, SW_SHOW);
//UpdateWindow(hWnd);
return TRUE;
}
INT_PTR CALLBACK myDialogProcess(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
INITCOMMONCONTROLSEX InitCtrlEx;
InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCtrlEx.dwICC = ICC_PROGRESS_CLASS;
InitCommonControlsEx(&InitCtrlEx);
switch(msg) {
case WM_INITDIALOG: {
//Do stuff to prep the dialog
return TRUE;
}
case WM_DESTROY: {
PostQuitMessage(WM_QUIT);
break;
}
}
return TRUE;
}
project.rc
myDialogResource DIALOGEX 600, 400, 286, 108
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION
EXSTYLE WS_EX_OVERLAPPEDWINDOW /*| WS_EX_APPWINDOW*/
CAPTION "My Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
COMBOBOX dropdownList,112,7,61,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
//... it's all syntactically correct controls that still work the split second the dialog is on the screen
END
这是缩短的代码,即使这样,对话框也会自行打开并在屏幕上出现故障。使用我的完整代码,它通常会在应用程序关闭前出现一瞬间。我相信如果我能解决这个小问题,我就能找到我的对话框的问题。所以我的问题是,问题是什么?
编辑:
这是我的 wWinMain
:
HWND myDialogGlobalHandle;
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) {
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
INITCOMMONCONTROLSEX InitCtrlEx;
InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCtrlEx.dwICC = ICC_PROGRESS_CLASS;
InitCommonControlsEx(&InitCtrlEx);
if (!CreateMyDialog(hInstance)) {
//return FALSE;
}
else {
MSG message = { 0 };
while (GetMessage(&message, nullptr, 0, 0)) {
if (!IsDialogMessage(myDialogGlobalHandle, &message)) {
DispatchMessage(&message);
}
}
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PROJECT));
MSG msg;
// Main message loop:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
事实证明,我的所有代码都是正确的。问题出在我的对话过程中的 case
语句,出于某种原因 Visual Studio 不喜欢 case
语句中的括号。在尝试了一切然后用 break;
语句替换它们之后,我的代码又开始工作了。