这一节将 - 如何构建出一个windows窗口程序框架。
程序框架接口类
class App
{
public:
App();
virtual ~App();
virtual void
Init(HWND hWnd, int w, int h);
virtual void
Update();
virtual void
Shutdown();
virtual void
Resize(int w, int h);
virtual void
OnInit(int w, int h) = 0;
virtual void
OnUpdate() = 0;
virtual void
OnShutdown() = 0;
virtual void
OnResize(int w, int h) = 0;
virtual void
OnMouseDown(int btn) {}
virtual void
OnMouseUp(int btn) {}
virtual void
OnMouseMove(int x, int y) {}
virtual void
OnKeyDown(int vk) {}
virtual void
OnKeyUp(int vk) {}
protected:
HWND mWnd;
int mWidth, mHeight;
float mTime;
float mFrameTime;
};
主要接口:
OnInit 初始化
OnUpdate 更新
OnShutdown 卸载
OnResize 窗口改变后消息
OnMouseDown 鼠标按下消息
OnMouseUp 鼠标弹起消息
OnMouseMove 鼠标移动消息
OnKeyDown 键盘按下消息
OnKeyUp 键盘弹起消息
Win32程序入口函数:
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
// 创建窗口
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor= NULL;
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = WIN32_CLASS_NAME;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
DWORD style = WS_OVERLAPPEDWINDOW;//WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX;
RECT rc = { 0, 0, S_WIDTH, S_HEIGHT };
AdjustWindowRect(&rc, style, FALSE);
int width = rc.right - rc.left;
int height = rc.bottom - rc.top;
int xpos = (GetSystemMetrics(SM_CXSCREEN) - width) / 2;
int ypos = (GetSystemMetrics(SM_CYSCREEN) - height) / 2;
HWND hWnd = CreateWindow(WIN32_CLASS_NAME, "SoftRender", style, xpos, ypos, width, height, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
GetClientRect(hWnd, &rc);
width = rc.right - rc.left;
height = rc.bottom - rc.top;
// 初始化程序
CreateApplication(&gApp);
gApp->Init(hWnd, width, height);
// 循环
MSG msg;
memset(&msg,0,sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
gApp->Update();
}
}
// 退出
gApp->Shutdown();
delete gApp;
UnregisterClass(WIN32_CLASS_NAME, hInstance);
return 0;
}
// 第一个实例App
#include "App.h"
class MyApp : public App
{
public:
MyApp()
{
}
virtual ~MyApp()
{
}
virtual void OnInit(int w, int h)
{
}
virtual void OnUpdate()
{
}
virtual void OnShutdown()
{
}
virtual void OnResize(int w, int h)
{
}
};
void CreateApplication(App ** ppApp)
{
*ppApp = new MyApp;
}
//
上述代码完成了一个基本的windows程序,并抽象出一个程序框架接口。
浙公网安备 33010602011771号