这一节将 - 如何构建出一个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程序,并抽象出一个程序框架接口。

 

posted on 2017-04-16 23:03  devil86  阅读(56)  评论(0)    收藏  举报