I made a Window class to help with making simple demos and I'm running into an error. Here is my class:
class Window
{
HWND m_WndHandle;
WNDCLASS m_WndClass;
public:
Window()
{
char szFileName[MAX_PATH];
char szDrive[8], szDirectory[MAX_PATH];
WIN32_FIND_DATA FindData;
ZeroMemory(&m_WndClass, sizeof(WNDCLASS));
ZeroMemory(&FindData, sizeof(WIN32_FIND_DATA));
GetModuleFileName(0, szFileName, MAX_PATH);
_splitpath(szFileName, szDrive, szDirectory, 0, 0);
_makepath(szFileName, szDrive, szDirectory, 0, 0);
if(FindFirstFile(std::string(std::string(szFileName) + std::string("*.ico")).c_str(), &FindData) == INVALID_HANDLE_VALUE)
m_WndClass.hIcon = LoadIcon(0, IDI_APPLICATION);
else
m_WndClass.hIcon = (HICON)LoadImage(0, FindData.cFileName, IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_SHARED | LR_LOADTRANSPARENT);
if(FindFirstFile(std::string(std::string(szFileName) + std::string("*.cur")).c_str(), &FindData) == INVALID_HANDLE_VALUE)
m_WndClass.hCursor = LoadCursor(0, IDC_ARROW);
else
m_WndClass.hCursor = (HCURSOR)LoadImage(0, FindData.cFileName, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE | LR_SHARED | LR_LOADTRANSPARENT);
FindFirstFile(std::string(std::string(szFileName) + std::string("*.exe")).c_str(), &FindData);
m_WndClass.lpszClassName = FindData.cFileName;
m_WndClass.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
m_WndClass.hInstance = GetModuleHandle(0);
m_WndClass.lpfnWndProc = DefWindowProc;
}
void Create()
{
assert(RegisterClass(&m_WndClass) != 0);
assert((m_WndHandle = CreateWindow(m_WndClass.lpszClassName, m_WndClass.lpszClassName, WS_POPUP | WS_VISIBLE, 0, 0, 800, 600, 0, 0, m_WndClass.hInstance, 0)) != 0);
}
void Start(void (*Idle)())
{
if(!m_WndHandle)
Create();
MSG Msg;
ZeroMemory(&Msg, sizeof(MSG));
while(1)
{
if(PeekMessage(&Msg, 0, 0, 0, PM_REMOVE))
{
if(Msg.message == WM_QUIT)
break;
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else
{
Idle();
}
}
}
void OverrideIcon(HICON hIcon)
{
if(!m_WndHandle)
m_WndClass.hIcon = hIcon;
}
void OverrideCursor(HCURSOR hCursor)
{
if(!m_WndHandle)
m_WndClass.hCursor = hCursor;
}
void OverrideWndProc(WNDPROC WndProc)
{
if(!m_WndHandle)
m_WndClass.lpfnWndProc = WndProc;
else
SetWindowLong(m_WndHandle, GWL_WNDPROC, (long)WndProc);
}
void OverrideClassName(const char* pClassName)
{
if(!m_WndHandle)
m_WndClass.lpszClassName = pClassName;
}
HWND GetHandle() const { return m_WndHandle; }
WNDCLASS GetWndClass() const { return m_WndClass; }
};
And this is my code that is using it:
g_Wnd.OverrideWndProc(InputProc);
g_Wnd.Start(IdleProc);
This works perfectly everytime. But, if I add g_Wnd.Create() before g_Wnd.Start() and after g_Wnd.OverrideWndProc(), it fails to register the class (on the very first line of g_Wnd.Create()). Am I missing something, or is this not exactly what g_WndStart would do?
Anybody have any ideas?