Win32 CreateWindow() 错误,这是 nullptr
Win32 CreateWindow() error, this is nullptr
我在另一个类中创建了一个子窗口,所以我将父的 hWnd 和 hInstance 传递到函数中,在那里我正在创建子窗口。
我现在的问题是,子窗口的createWindow()函数挂起,我收到一条错误消息,说:"遇到异常。这可能是由延期引起的"。
有人知道这条消息是什么意思,或者我做错了什么吗?
这就是它,我在父窗口的消息处理程序中调用子窗口,因为我使用的是带有 ID 的子菜单。
LRESULT CALLBACK System::MessageHandler(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
MainMenu mMainMenu;
switch (message)
{
case WM_COMMAND:
{
switch (LOWORD(wparam))
{
//If user presses on the exit button
case IDM_FILE_EXIT:
{
PostQuitMessage(0);
} break;
case IDM_NEW_NEWPROJECT:
{
//////////////////////////////////////////////
// Here is the error showing up
//////////////////////////////////////////////
m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);
}break;
default:
break;
}
}
// Any other messages send to the default message handler as our application won't make use of them.
default:
{
return DefWindowProc(hwnd, message, wparam, lparam);
}
}
}
初始化:
bool CreateProjectMenu::Initialize(HWND m_ParentWindow, HINSTANCE m_hParentInstance)
{
//Initialize the window
InitializeWindow(m_ParentWindow, m_hParentInstance);
return true;
}
初始化窗口:
void CreateProjectMenu::InitializeWindow(HWND m_ParentWindow, HINSTANCE m_hParentInstance)
{
wc.style = CS_HREDRAW | CS_VREDRAW; // Defines additional elements of the window class.
wc.lpfnWndProc = ChildProc; // A pointer to the window procedure.
wc.cbClsExtra = 0; // The number of extra bytes to allocate following the window-class structure.
wc.cbWndExtra = 0; // The number of extra bytes to allocate following the window instance.
wc.hInstance = m_hParentInstance; // A handle to the instance that contains the window procedure.
wc.hIcon = LoadIcon(wc.hInstance, IDI_APPLICATION); // Load the icon for the application.
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load the cursor for the application.
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // Load the background for the application.
wc.lpszMenuName = NULL; // Pointer to a character string that specifies the name of the resource class menu.
wc.lpszClassName = m_ProjectMenuWindowName; // Set the name for the window.
wc.hInstance = m_hParentInstance;
if (!RegisterClass(&wc))
{
MessageBox(NULL, L"Failed to register the menuprojectwindow", L"Error", MB_OK);
}
m_NewProjectHwnd = CreateWindow(NULL,
m_ProjectMenuWindowName,
WS_CHILD | WS_VISIBLE | WS_CAPTION
| WS_SYSMENU | WS_THICKFRAME
| WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
screenWidth, screenHeight,
m_ParentWindow,
NULL,
m_hParentInstance,
NULL);
// Check if the hwnd is zero(error)
// Display a messagebox with a error
if (m_NewProjectHwnd == 0)
MessageBox(NULL, L"Could not create the create project hwnd.", L"Error", MB_OK);
else
{
ShowWindow(m_NewProjectHwnd, SW_SHOW); // Bring the window up on the screen
SetFocus(m_NewProjectHwnd);
}
return;
}
以下是重现错误的代码: https://ufile.io/ddmj4
this
是每个非静态类方法的隐式第一个参数。它是指向调用该方法的对象的指针。您收到的错误消息表示您已在nullptr
上调用了一个方法。虽然您的代码不完整,但唯一可能发生这种情况的行是
m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);
您可以通过在进行调用之前使用调试器检查m_CreatePorjectMenu
的值或通过添加assert(CreatePorjectMenu);
来验证这一点。对于后者,请确保在启用断言的情况下进行编译。
至于如何解决,如果不了解您的项目结构,我就无法判断。某个函数必须负责初始化该对象,并且必须确保在回调之前调用它。或者,如果初始值设定项模式由于某种原因不起作用,则回调可以检查nullptr
并在必要时创建对象。
相关文章:
- 使用递归的数组的最小值.这是怎么回事
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 这是实现图形的坏方法吗
- 当基类是依赖类型时,这是一个缺陷吗
- 当C++中需要自动删除时,这是静态的正确用法吗?
- 这是关于成员访问规则的正确摘要吗
- 这是插入排序的正确实现吗?
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 如何在OpenCV中检测这是谁的脸?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 这是GoogleTest AssertionResult中的错误吗?
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 这是 basic.def.odr 部分的缺陷吗?
- 被覆盖的函数不会反映在基类中,这是正常行为吗?
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 当没有调用"这个"时,如何修复"这是nullptr"
- Win32 CreateWindow() 错误,这是 nullptr