Я создаю дочернее окно в другом классе, поэтому я передаю 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
this
является неявным первым аргументом каждого нестатического метода класса. Это указатель на объект, для которого вызывается метод. Полученное сообщение об ошибке означает, что вы вызвали метод для nullptr
, Хотя ваш код неполон, единственная строка, где это может произойти,
m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);
Вы можете проверить это с помощью отладчика, чтобы проверить m_CreatePorjectMenu
значение прямо перед вызовом или добавив assert(CreatePorjectMenu);
, Для последнего убедитесь, что вы компилируете с включенными утверждениями.
Что касается того, как ее решить, я не могу сказать, не зная структуру вашего проекта. Некоторые функции должны нести ответственность за инициализацию этого объекта, и вы должны убедиться, что он вызывается до вашего обратного вызова. Кроме того, если шаблон инициализатора не работает по какой-либо причине, ваш обратный вызов может проверить nullptr
и создайте объект при необходимости.
Других решений пока нет …