Win32窗口包装器出错(参数不正确)

时间:2016-01-22 02:03:03

标签: c++ winapi this wrapper

我正在为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

1 个答案:

答案 0 :(得分:2)

在分配一些结构成员后,您正在调用ZeroMemory (即hInstancelpfnWndProclpszClassName将全部成为空)。