Win32 CreateWindow () ошибка, это nullptr

Я создаю дочернее окно в другом классе, поэтому я передаю hWnd и hInstance родителя в функцию, где я создаю дочернее окно.

Моя проблема сейчас заключается в том, что функция createWindow () дочернего окна зависает, и я получаю сообщение об ошибке, в котором говорится: «Исключение встретилось с beend. Это может быть вызвано расширением».

Кто-то знает, что означает это сообщение, или что я делаю неправильно?

Вот оно, где я вызываю дочернее окно в обработчике сообщений родительского окна, потому что я использую подменю с идентификаторами.

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;
}

InitializeWindow:

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

-1

Решение

this является неявным первым аргументом каждого нестатического метода класса. Это указатель на объект, для которого вызывается метод. Полученное сообщение об ошибке означает, что вы вызвали метод для nullptr, Хотя ваш код неполон, единственная строка, где это может произойти,

m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);

Вы можете проверить это с помощью отладчика, чтобы проверить m_CreatePorjectMenuзначение прямо перед вызовом или добавив assert(CreatePorjectMenu);, Для последнего убедитесь, что вы компилируете с включенными утверждениями.

Что касается того, как ее решить, я не могу сказать, не зная структуру вашего проекта. Некоторые функции должны нести ответственность за инициализацию этого объекта, и вы должны убедиться, что он вызывается до вашего обратного вызова. Кроме того, если шаблон инициализатора не работает по какой-либо причине, ваш обратный вызов может проверить nullptr и создайте объект при необходимости.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]