类内部的C ++ Winapi窗口进程不起作用

贾登

我正在用C ++创建一个窗口包装器类,但似乎无法修复此错误。看来,当我的窗口进程回调被调用时,它并没有在创建窗口时检索我输入的this指针,以获取更多信息。我做了一些调试,发现当我将其重新解释为Window *时,它为NULL,并且每个变量都未初始化。这是Window.h

    #pragma once

    #include <Windows.h>
    #include <string>




    class Window
    {
    private:

        class WindowClass
        {
        private:
            static WindowClass wndClass;


            WindowClass();
            HINSTANCE hInst;
            const char* className = "Sadie Game Engine";

            WindowClass(WindowClass&) = delete;
            WindowClass operator=(WindowClass&) = delete;

            ~WindowClass();
        public:
            static WindowClass& getInstance();
            HINSTANCE getHInstance();

            const char* getClassName();
        };

    private:
        const char* windowTitle;
        int width, height;
        int windowX, windowY;
        HWND windowHandle;
    public:

        
        bool keyStates[256];

        Window(int width, int height, int x, int y, const char* title);
    
        void setWindowTitle(std::string str);

        static LRESULT CALLBACK handleMsgCallBack(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
        LRESULT handleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

        ~Window();


    

    };


这是Window.cpp


    #include "Window.h"



    /// 
    /// WindowClass
    /// 
    Window::WindowClass Window::WindowClass::wndClass;


    Window::WindowClass::WindowClass()
    {
        hInst = GetModuleHandleA(nullptr);

        WNDCLASSEXA wc = { 0 };
        wc.cbSize = sizeof(wc);
        wc.style = CS_OWNDC;
        wc.lpfnWndProc = handleMsgCallBack;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInst;
        wc.lpszClassName = className;
        wc.hIcon = nullptr;
        wc.hIconSm = nullptr;
        wc.hCursor = nullptr;
        wc.hbrBackground = nullptr;
        wc.lpszMenuName = nullptr;
    

        RegisterClassExA(&wc);


    }

    Window::WindowClass::~WindowClass()
    {
        UnregisterClassA(className, hInst);
    }

    Window::WindowClass& Window::WindowClass::getInstance()
    {
        return wndClass;
    }


    HINSTANCE Window::WindowClass::getHInstance()
    {
        return hInst;
    }

    const char* Window::WindowClass::getClassName()
    {
        return className;
    }


    ///
    /// Window
    /// 



    Window::Window(int _width, int _height, int x, int y, const char* title)
    {
    
        width = _width;
        height = _height;
        windowX = x;
        windowY = y;
        windowTitle = title;


        RECT wr;
        wr.left = 100;
        wr.right = width + wr.left;
        wr.top = 100;
        wr.bottom = height + wr.top;
        AdjustWindowRect(&wr, WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, FALSE);



        windowHandle = CreateWindowExA(0l, WindowClass::getInstance().getClassName(),
            windowTitle, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
            windowX, windowY, width, height, nullptr, nullptr, WindowClass::getInstance().getHInstance(), this);



        ShowWindow(windowHandle, SW_SHOW);




    }

    void Window::setWindowTitle(std::string str)
    {
        SetWindowTextA(windowHandle, str.c_str());


    }

    LRESULT Window::handleMsgCallBack(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    

        Window* const windowPtr = reinterpret_cast<Window*>(GetWindowLongPtrA(hWnd, GWLP_USERDATA));





        return windowPtr->handleMsg(hWnd, msg, wParam, lParam);

    
    }

    LRESULT Window::handleMsg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {

    



        switch (msg)
        {
    
        case WM_SYSKEYDOWN:

        case WM_KEYDOWN:



            keyStates[wParam] = true;

            break;
        case WM_SYSKEYUP:

        case WM_KEYUP:


            keyStates[wParam] = false;

            break;

        case WM_CHAR:

            

            break;
        case WM_CLOSE:
            PostQuitMessage(0);
            return 0;
        }


        return DefWindowProcA(hWnd, msg, wParam, lParam);
    }

    Window::~Window()
    {
        DestroyWindow(windowHandle);
    }



任何帮助,将不胜感激。

Zhu Song - MSFT

正如RbMm所说,您没有调用该SetWindowLongPtr函数

只需添加以下代码:

case WM_NCCREATE:
{
    LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
    Window* w = (Window*)pcs->lpCreateParams;
    ::SetWindowLongPtr(hWnd,GWLP_USERDATA,reinterpret_cast<LONG_PTR>(w));
    break;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

unset()在类方法内部不起作用

来自分类Dev

Bootstrap Popover在传单弹出窗口内部不起作用

来自分类Dev

Bootstrap Popover在传单弹出窗口内部不起作用

来自分类Dev

具有参数的C#进程不起作用

来自分类Dev

如何启动进程C#不起作用

来自分类Dev

在类内部调用环境变量不起作用

来自分类Dev

_callstatic内部的静态类调用不起作用

来自分类Dev

函数内部的类对象不起作用(FPDF)

来自分类Dev

Python :: tkinter OptionMenu 方法内部的类结构不起作用

来自分类Dev

简单的类在C ++中不起作用

来自分类Dev

简单的类在C ++中不起作用

来自分类Dev

提升Windows 7进程时,ITrayNotify界面不起作用(“未注册类”)

来自分类Dev

内部联接不起作用

来自分类Dev

<ul>类不起作用

来自分类Dev

GPSTracker类不起作用

来自分类Dev

异常类不起作用

来自分类Dev

查找类不起作用

来自分类Dev

伪类不起作用

来自分类Dev

C ++控制台程序(通常)不起作用,进程返回255(0xFF)

来自分类Dev

使用mongodb_name在C#进程中不起作用

来自分类Dev

(WinApi)ChangeDisplaySettingsEx不起作用

来自分类Dev

(WinApi)ChangeDisplaySettingsEx不起作用

来自分类Dev

C#SendKeys到Windows 7中的前景窗口不起作用

来自分类Dev

c#“$”运算符在窗口 7 中不起作用

来自分类Dev

C ++扩展Windows WRL组件类不起作用

来自分类Dev

C ++我的String类:指针不起作用

来自分类Dev

指向类的指针的C ++函数不起作用?

来自分类Dev

C ++自动推论在类构造函数中不起作用

来自分类Dev

名称空间在类库C#中不起作用