-1

我正在另一个类中创建一个子窗口,因此我将父级的 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

4

1 回答 1

-1

this是每个非静态类方法的隐式第一个参数。它是一个指向调用该方法的对象的指针。您收到的错误消息意味着您在nullptr. 尽管您的代码不完整,但唯一可能发生这种情况的行是

m_CreateProjectMenu->Initialize(m_hWnd, m_hinstance);

m_CreatePorjectMenu您可以在调用之前使用调试器检查's 的值,或者添加一个assert(CreatePorjectMenu);. 对于后者,请确保您在编译时启用了断言。

至于如何解决,不知道你的项目结构我是说不出来的。某些函数必须负责初始化该对象,并且您必须确保在回调之前调用它。或者,如果初始化模式由于某种原因不起作用,您的回调可以检查nullptr并在必要时创建对象。

于 2017-09-29T21:20:47.793 回答