我的Visual C ++ Win32中有一个MessageBox,无法closures! 到底是怎么回事?

我有一个消息框,根本无法closures,我不知道为什么。 它是在我的窗口过程中创build一个对话框,它是这样创build的:

hwnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, WndProc); 

下面是有问题的WndProc代码。 这是有问题的MessageBox调用,OKbutton什么都不做,也没有在该消息框上打“X”。

 BOOL CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HBRUSH bgBrush; switch (msg) { case WM_INITDIALOG: bgBrush = CreateSolidBrush(RGB(65, 65, 66)); return TRUE; case WM_CTLCOLORDLG: return (INT_PTR)(bgBrush); case WM_CTLCOLORSTATIC: SetBkMode((HDC)wParam, TRANSPARENT); SetTextColor((HDC)wParam, RGB(200, 200, 200)); return (INT_PTR)(bgBrush); case WM_DEVICECHANGE: USBEnumerateDev(); break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_SELECTPROFILE: switch (HIWORD(wParam)) { case BN_CLICKED: int res = CommonFileDialog.BasicFileOpen(hwnd); if (res == TRUE) { int len = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDITWLAN)); if (len > 0) { int i; wchar_t* buf; buf = (wchar_t*)GlobalAlloc(GPTR, len + 1); GetDlgItemText(hwnd, IDC_EDITWLAN, buf, len + 1); GlobalFree((HANDLE)buf); } } break; } break; case IDC_PROGRAM: switch (HIWORD(wParam)) { case BN_CLICKED: int len = GetWindowTextLength(GetDlgItem(hwnd, IDC_EDITWLAN)); if (len > 0) { int i, fileSize; LPSTR XMLfilename, buf; FILE *fXMLfile; XMLfilename = (LPSTR)GlobalAlloc(GPTR, len + 1); GetDlgItemTextA(hwnd, IDC_EDITWLAN, XMLfilename, len + 1); fopen_s(&fXMLfile, XMLfilename, "r"); fseek(fXMLfile, 0L, SEEK_END); fileSize = ftell(fXMLfile); fseek(fXMLfile, 0L, SEEK_SET); buf = (LPSTR)GlobalAlloc(GPTR, fileSize); fread(buf, 1, fileSize, fXMLfile); DBG("fileSize: %d", fileSize); if (USBSetProfile(buf, fileSize)) MessageBox(hwnd, L"Programmed!", L"PC -> USB", MB_OK | MB_ICONINFORMATION); GlobalFree((HANDLE)XMLfilename); GlobalFree((HANDLE)buf); // } } break; } } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } 

是什么赋予了? 我已经尝试使用窗口句柄和NULL,同样的东西调用MessageBox。

你的WndProc()调用DefWindowProc() ,但是文档明确地说不这样做:

尽管对话框过程类似于窗口过程, 但它不能调用DefWindowProc函数来处理不需要的消息。 不需要的消息由对话框窗口过程在内部处理。

这是一个窗口过程和对话框过程的混合。 这些是不同的,有不同的规则。

还要注意返回值。 你应该为你处理的情况返回TRUE,否则返回FALSE。 总是返回0(FALSE)。