我正在为win32写一个窗口包装程序,以使GUI的创建更加容易。我有一个abstractdisplay类,一个displayclass类和一个displayclass。最后,该窗口不显示。经过一些调试后,我的windowclass没有正确注册。在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

最佳答案

分配了一些struct成员后即调用ZeroMemory(即hInstancelpfnWndProclpszClassName都为空)。

关于c++ - Win32 Window Wrapper错误(参数不正确),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34937798/

10-11 03:50