【问题标题】:Error with Win32 Window Wrapper (Incorrect Parameter)Win32 Window Wrapper 出错(参数不正确)
【发布时间】:2016-01-22 02:03:02
【问题描述】:

我正在为 win32 编写一个窗口包装器,以便更轻松地创建 gui。我有一个 abstractdisplay 类、一个 displayclass 类和一个 displayclass。最后,窗口没有出现。经过一些调试,我的窗口类没有正确注册。在GetLastError之后,我得到了INVALID PARAMETER的错误代码

displayclass.h:

#pragma once

#include <Windows.h>
#include "abstractdisplay.h"
class DisplayClass : protected WNDCLASSEX
        {
            public:
                // Public variables 

            private:
                // Private variables

            protected:
                // Protected variables

            public:
                // Public functions
                DisplayClass(HINSTANCE hInst, const TCHAR* className);
                DisplayClass();
                ~DisplayClass();

                // Registers the class

                // Get the class name
                virtual const TCHAR* getClassName() const { return lpszClassName; }
                virtual bool Register();

            private:
                // Private functions

            protected:
                    // Protected functions

                };

displayclass.cpp:

 #include "displayclass.h"
 #include "abstractdisplay.h"
 #include <string>
 #include <cstring>

DisplayClass::DisplayClass(HINSTANCE hInst, const TCHAR* className) 
        {
            hInstance = hInst;

            // All messages for windows that belong to this Window Class will be sent to Message Router
            lpfnWndProc = AbstractDisplay::MessageRouter;
            lpszClassName = className;

            // Set values for the rest of the WNDCLASSEX structure
            ZeroMemory(this, sizeof(WNDCLASSEX));

            lpszMenuName = 0;
            cbSize = sizeof(WNDCLASSEX);
            cbClsExtra = 0;
            cbWndExtra = 0;
            hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
            hIconSm = ::LoadIcon(NULL, IDI_APPLICATION);
            hCursor = ::LoadCursor(NULL, IDC_ARROW);
            style = CS_HREDRAW | CS_VREDRAW;
            hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        }

        DisplayClass::DisplayClass()
        {

        }

        DisplayClass::~DisplayClass()
        {

        }

        // Returns the last Win32 error, in string format. Returns an empty string if there is no error.
        std::string GetLastErrorAsString()
        {
            // Get the error message, if any.
            DWORD errorMessageID = ::GetLastError();
            if (errorMessageID == 0)
                return std::string(); // No error message has been recorded

            LPSTR messageBuffer = nullptr;
            size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);

            std::string message(messageBuffer, size);

            // Free the buffer.
            LocalFree(messageBuffer);

            return message;
        }

        bool DisplayClass::Register()
        {   
            if (::RegisterClassEx(this) != 0)
            {
                return true;
            }
            else
            {
                OutputDebugString("ERROR CODE BE LIKE:");
                OutputDebugString(GetLastErrorAsString().c_str());
                OutputDebugString("\n");
                return false;
            }
        }

调试:

ERROR CODE BE LIKE:The parameter is incorrect.

(有点追随这个来源:http://www.infernodevelopment.com/c-win32-api-simple-gui-wrapper

【问题讨论】:

    标签: c++ winapi this wrapper


    【解决方案1】:

    在分配一些结构成员(即hInstancelpfnWndProclpszClassName 都将为空)之后,您将调用ZeroMemory

    【讨论】:

    • 哇,感谢您的回答和快速回复!它摆脱了 RegisterClass 错误,但仍然没有显示窗口,但我会自己处理。再次感谢! :)
    • 此外,非 POD 类上的 ZeroMemory(this, ...) 是未定义的行为。
    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多