例如,下面的程序可以正常运行:
#include <Windows.h>
class MyClass : public WNDCLASSEX
{
protected:
HWND hWnd;
public:
LPTSTR szTitle;
MyClass();
void Register();
void Create(int nCmdShow);
int Loop();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
// 构造函数
MyClass::MyClass()
{
cbSize = sizeof(WNDCLASSEX);
cbClsExtra = 0;
cbWndExtra = 0;
hbrBackground = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
hCursor = LoadCursor(NULL, IDC_ARROW);
hIcon = LoadIcon(NULL, IDI_APPLICATION);
hIconSm = LoadIcon(NULL, IDI_APPLICATION);
hInstance = hInstance;
lpfnWndProc = WndProc; // 子类不能直接重写父类的lpfnWndProc, 否则创建窗口会失败
lpszClassName = TEXT("MyClass");
lpszMenuName = NULL;
style = NULL;
}
void MyClass::Register()
{
if (!RegisterClassEx(this))
exit(0);
}
void MyClass::Create(int nCmdShow)
{
hWnd = CreateWindow(TEXT("MyClass"), szTitle, WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, NULL, NULL, hInstance, NULL);
if (!hWnd)
exit(0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
}
int MyClass::Loop()
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK MyClass::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MyClass cls;
cls.szTitle = TEXT("窗口标题");
cls.Register();
cls.Create(nCmdShow);
return cls.Loop();
}