我正在尝试从主窗口程序的按钮窗口单击WM_COMMAND中创建一个对话窗口。
case WM_CREATE:
hwndRegister = CreateWindow(TEXT("BUTTON"), TEXT("Register"), WS_VISIBLE | WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, 100, 50, hwnd, (HMENU)REGISTER_WINDOW, NULL, NULL);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case REGISTER_WINDOW:
DisplayRegisterDialog(hwndRegister);
break;
}
break;如果单击该hwndRegister,它将弹出在另一个cpp文件中定义和注册新对话框窗口。
CONST wchar_t DIALOG_WINDOW_NAME[] = L"DialogClass";
void RegisterDialog(HINSTANCE hInstance)
{
WNDCLASS dialogBox = { };
dialogBox.lpfnWndProc = DialogProc;
dialogBox.lpszClassName = DIALOG_WINDOW_NAME;
dialogBox.hInstance = hInstance;
dialogBox.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&dialogBox);
}
void DisplayRegisterDialog(HWND hwnd)
{
if (!hwnd)
{
MessageBox(NULL, L"Window Creation faile", L"WINDOW CREATION FAILED", MB_ICONERROR);
}
HWND hwndDialogWindow = CreateWindowEx(0, DIALOG_WINDOW_NAME, L"Register User", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, hwnd, (HMENU)DIALOG_REGISTER_WINDOW, NULL, NULL);
}我正在从主应用程序的winapi winmain中获取注册对话框的实例。
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
RegisterDialog(hInstance);
}到目前为止,我没有得到任何可见的错误抛出,程序运行顺利。但是,不会创建对话框窗口,也不会抛出错误。编辑-对话过程实现:
LRESULT CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}在遵循了IInspectable关于手动检查错误的建议之后,我还想说明一下。如果正在注册window,我会执行此操作
if (RegisterClass(&dialogBox) == 0) {
MessageBox(NULL, L"Dialog window registration failed", L"Error", 0);
throw GetLastError();
}此代码在内存位置0x0078F828引发Microsoft异常: unsigned C++。
编辑2-好的。我终于发现这个错误代码为1410的类已经存在了。我对这些窗口类有不同的名称。是因为hInstance吗?
发布于 2021-06-11 17:15:48
您的函数DialogProc实际上是一个普通的窗口过程,而不是一个对话过程,因此您必须向DefWindowProc传递未经处理的消息,如下所示:
LRESULT CALLBACK DialogProc /*misnomer!*/(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CLOSE:
MessageBox(hwnd, L"Test", L"Test", 0);
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam); // important!!
}如果改为编写return 0;,则窗口在从WM_CREATE调用返回后将立即销毁。
发布于 2021-06-12 13:39:31
该错误是由于在hwndDialogWindow中设置了HMENU.它必须为空。还有大约1410个错误。我也对此感到困惑。代码是
RegisterClass(&dialogBox);
if (RegisterClass(&dialogBox) == 0) {
int nresult = GetLastError();
MessageBox(NULL, L"Dialog window registration failed", L"Error", 0);
}我不知道上面的代码是如何产生1410错误的。我删除了要注册的第一行,错误就消失了。
还要感谢RemyLebeau指出了错误的方法,Inspectable提供了手动检查错误的建议,这非常有帮助,Iziminza提供了对话框rss脚本,我将使用它作为其他按钮。
https://stackoverflow.com/questions/67933761
复制相似问题