我正在为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)
答案 0 :(得分:2)
在分配一些结构成员后,您正在调用ZeroMemory
(即hInstance
,lpfnWndProc
和lpszClassName
将全部成为空)。