12)游戏的第一步 ,编写基类

我编好我的父类  然后  通过子类继承 改写不同的代码  就实现了 一个接口  多种行为

1)首先是switch消息的种类的展示:

  

 1 switch(uMsg)
 2     {
 3     
 4     case WM_CREATE://初始化
 5         break;
 6     case WM_PAINT://窗口重绘,其实就是贴图
 7         break;
 8     case WM_KEYDOWN://键盘按键按下
 9         break;
10     case WM_KEYUP://按键抬起
11         break;
12     case WM_LBUTTONDOWN://鼠标左键按下
13         break;
14     case WM_LBUTTONUP://鼠标左键抬起
15         break;
16     case WM_MOUSEMOVE://鼠标移动
17         break;
18     case WM_TIMER://定时器
19         break;
20     case WM_CLOSE://点那个×,窗口关闭
21         ::PostQuitMessage(0);//消息推出
22         break;
23     
24 
25     }

2)然后 就是  编写基类  就是父类,这个父类里卖弄有很多的虚函数

 我建立了一个CGameCtrl.h的基类头文件

 1 #pragma once
 2 //上面的代码为了兼容C++
 3 
 4 
 5 
 6 
 7 //下面的是兼容C编译器
 8 #ifndef _CGAMECTRL_
 9 #define _CGAMECTRL_
10 class CGameCtrl
11 {
12     //此处写的纯虚函数,子类必须他们全部重写
13 public:
14     void virtual OnCreateGame()=0;//这个给WM_CREATE
15     void virtual GameDraw()=0;//这个给WM_PAINT
16     void virtual GameRun()=0;//这个给WM_TIMER
17     void virtual OnKeyDown()=0;
18     void virtual OnKeyUp()=0;
19     void virtual OnLbuttonDown()=0;
20     void virtual OnLbuttonUp()=0;
21     void virtual OnMouseMove()=0;
22 
23 }
24 
25 #endif

但是 要是基类的函数全部是纯虚函数,那么子类就必须实现,所以  我可以将创虚函数做点修改:

 1 #pragma once
 2 //上面的代码为了兼容C++
 3 
 4 
 5 
 6 
 7 //下面的是兼容C编译器
 8 #ifndef _CGAMECTRL_
 9 #define _CGAMECTRL_
10 class CGameCtrl
11 {
12 
13     //这样改写  子类中  就没必要全部重写这些函数了,因为有的子类用到键盘,有的用不到,那么下面的这种写法 ,就避免了  不用OnKeyDown()函数的类去改写这个函数
14 public:
15     void virtual OnCreateGame(){}
16     void virtual GameDraw(){}
17     void virtual GameRun(){}
18     void virtual OnKeyDown(){}
19     void virtual OnKeyUp(){}
20     void virtual OnLbuttonDown(){}
21     void virtual OnLbuttonUp(){}
22     void virtual OnMouseMove(){}
23 
24 }
25 
26 #endif

 这样写   子类就可以不用实现了  要是 子类实现了  就用子类的  要是子类没有实现   就用父类的

3)修改WinMaincpp中的内容:
      

  基本步骤 图片:
        

    基本代码信息:

  1 #include<Windows.h>
  2 #include"CGameCtrl.h"
  3 
  4 HINSTANCE hIns;
  5 
  6 //然后定义一个父类的指针
  7 CGameCtrl * cGame=NULL;
  8 
  9 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 10 {
 11     switch(uMsg)
 12     {
 13     
 14     case WM_CREATE://初始化
 15         if(cGame!=NULL)
 16         {
 17             cGame->OnCreateGame();
 18         }
 19         break;
 20     case WM_PAINT://窗口重绘,其实就是贴图
 21         if(cGame!=NULL)
 22         {
 23             cGame->GameDraw();
 24         }
 25         break;
 26     case WM_KEYDOWN://键盘按键按下
 27         if(cGame!=NULL)
 28         {
 29             cGame->OnKeyDown();
 30         }
 31         break;
 32     case WM_KEYUP://按键抬起
 33         if(cGame!=NULL)
 34         {
 35             cGame->OnKeyUp();
 36         }
 37         break;
 38     case WM_LBUTTONDOWN://鼠标左键按下
 39         if(cGame!=NULL)
 40         {
 41             cGame->OnLbuttonDown();
 42         }
 43         break;
 44     case WM_LBUTTONUP://鼠标左键抬起
 45         if(cGame!=NULL)
 46         {
 47             cGame->OnLbuttonUp();
 48         }
 49         break;
 50     case WM_MOUSEMOVE://鼠标移动
 51         if(cGame!=NULL)
 52         {
 53             cGame->OnMouseMove();
 54         }
 55         break;
 56     case WM_TIMER://定时器
 57         if(cGame!=NULL)
 58         {
 59             cGame->OnCreateGame();
 60         }
 61         break;
 62     case WM_CLOSE://点那个×,窗口关闭
 63         ::PostQuitMessage(0);//消息推出
 64         break;
 65     
 66     }
 67     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
 68 }
 69 
 70 
 71 int CALLBACK WinMain(HINSTANCE hIstance,
 72                      HINSTANCE hPreInstance,
 73                      LPSTR pCmdLine,
 74                      int nCmdShow)
 75 {
 76             
 77     hIns=hIstance;
 78     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
 79             
 80     
 81     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
 82             WNDCLASSEX wndclass;
 83             wndclass.cbClsExtra=0;
 84             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
 85             wndclass.cbSize=sizeof(WNDCLASSEX);
 86             wndclass.hbrBackground=hBrush;
 87             wndclass.hCursor=NULL;//光标
 88             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
 89             wndclass.hIcon=NULL;//窗口图标
 90             wndclass.hIconSm=NULL;//窗口左上的图标
 91             wndclass.hInstance=hIstance;
 92             wndclass.lpfnWndProc=WndProc;
 93             wndclass.lpszClassName="wangchao";
 94             wndclass.lpszMenuName=NULL;
 95             wndclass.style=CS_HREDRAW|CS_VREDRAW;
 96 
 97     //2.注册
 98             if(::RegisterClassEx(&wndclass)==FALSE)
 99             {
100                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
101                 
102                 return 0;
103             }
104     //3.创建
105                     
106             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
107             
108         if(hWnd==NULL)
109         {
110             ::MessageBox(NULL,"创建失败","提示",MB_OK);
111             return 0;
112         }
113     //4.显式
114             
115         ::ShowWindow(hWnd,SW_SHOW);
116         
117     //5.消息循环
118         
119             MSG msg;
120             
121             while(::GetMessage(&msg,0,0,0))
122         {
123             //第一步先翻译
124             ::TranslateMessage(&msg);
125             //第二部分发
126             ::DispatchMessageA(&msg);
127 
128         }
129 
130 
131     ::DeleteObject(hBrush);
132 }

4)然后  我运行 一下  没有错误  证明我的代码是正确的。

5)总的文档目录展示:
      

6)总的代码展示:

    CGameCtrl.h文件内容:

 1 #pragma once
 2 //上面的代码为了兼容C++
 3 
 4 
 5 
 6 
 7 //下面的是兼容C编译器
 8 #ifndef _CGAMECTRL_
 9 #define _CGAMECTRL_
10 class CGameCtrl
11 {
12 
13 public:
14     CGameCtrl()
15     {
16     
17     }
18     //如果  你的函数中有虚函数,那么析构就应是虚析构   至于为啥  我也不清楚
19     virtual ~CGameCtrl()
20     {
21     
22     }
23 public:
24     void virtual OnCreateGame(){}
25     void virtual GameDraw(){}
26     void virtual GameRun(){}
27     void virtual OnKeyDown(){}
28     void virtual OnKeyUp(){}
29     void virtual OnLbuttonDown(){}
30     void virtual OnLbuttonUp(){}
31     void virtual OnMouseMove(){}
32 
33 };
34 
35 #endif

      WinMaincpp.cpp文件内容:

  1 #include<Windows.h>
  2 #include"CGameCtrl.h"
  3 
  4 HINSTANCE hIns;
  5 
  6 //然后定义一个父类的指针
  7 CGameCtrl * cGame=NULL;
  8 
  9 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 10 {
 11     switch(uMsg)
 12     {
 13     
 14     case WM_CREATE://初始化
 15         if(cGame!=NULL)
 16         {
 17             cGame->OnCreateGame();
 18         }
 19         break;
 20     case WM_PAINT://窗口重绘,其实就是贴图
 21         if(cGame!=NULL)
 22         {
 23             cGame->GameDraw();
 24         }
 25         break;
 26     case WM_KEYDOWN://键盘按键按下
 27         if(cGame!=NULL)
 28         {
 29             cGame->OnKeyDown();
 30         }
 31         break;
 32     case WM_KEYUP://按键抬起
 33         if(cGame!=NULL)
 34         {
 35             cGame->OnKeyUp();
 36         }
 37         break;
 38     case WM_LBUTTONDOWN://鼠标左键按下
 39         if(cGame!=NULL)
 40         {
 41             cGame->OnLbuttonDown();
 42         }
 43         break;
 44     case WM_LBUTTONUP://鼠标左键抬起
 45         if(cGame!=NULL)
 46         {
 47             cGame->OnLbuttonUp();
 48         }
 49         break;
 50     case WM_MOUSEMOVE://鼠标移动
 51         if(cGame!=NULL)
 52         {
 53             cGame->OnMouseMove();
 54         }
 55         break;
 56     case WM_TIMER://定时器
 57         if(cGame!=NULL)
 58         {
 59             cGame->OnCreateGame();
 60         }
 61         break;
 62     case WM_CLOSE://点那个×,窗口关闭
 63         ::PostQuitMessage(0);//消息推出
 64         break;
 65     
 66     }
 67     return ::DefWindowProc( hWnd, uMsg, wParam, lParam);
 68 }
 69 
 70 
 71 int CALLBACK WinMain(HINSTANCE hIstance,
 72                      HINSTANCE hPreInstance,
 73                      LPSTR pCmdLine,
 74                      int nCmdShow)
 75 {
 76             
 77     hIns=hIstance;
 78     HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255));
 79             
 80     
 81     //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个)
 82             WNDCLASSEX wndclass;
 83             wndclass.cbClsExtra=0;
 84             wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间
 85             wndclass.cbSize=sizeof(WNDCLASSEX);
 86             wndclass.hbrBackground=hBrush;
 87             wndclass.hCursor=NULL;//光标
 88             //因为上面的那个LoadCUrsor是需要字符串,但是那个IDC_CURSOR1是一个整型数字,所以  需要用那个宏给转定义一下
 89             wndclass.hIcon=NULL;//窗口图标
 90             wndclass.hIconSm=NULL;//窗口左上的图标
 91             wndclass.hInstance=hIstance;
 92             wndclass.lpfnWndProc=WndProc;
 93             wndclass.lpszClassName="wangchao";
 94             wndclass.lpszMenuName=NULL;
 95             wndclass.style=CS_HREDRAW|CS_VREDRAW;
 96 
 97     //2.注册
 98             if(::RegisterClassEx(&wndclass)==FALSE)
 99             {
100                 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK);
101                 
102                 return 0;
103             }
104     //3.创建
105                     
106             HWND hWnd=::CreateWindow("wangchao","xiao_hua",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,NULL,hIstance,NULL);
107             
108         if(hWnd==NULL)
109         {
110             ::MessageBox(NULL,"创建失败","提示",MB_OK);
111             return 0;
112         }
113     //4.显式
114             
115         ::ShowWindow(hWnd,SW_SHOW);
116         
117     //5.消息循环
118         
119             MSG msg;
120             
121             while(::GetMessage(&msg,0,0,0))
122         {
123             //第一步先翻译
124             ::TranslateMessage(&msg);
125             //第二部分发
126             ::DispatchMessageA(&msg);
127 
128         }
129 
130 
131     ::DeleteObject(hBrush);
132 }
原文地址:https://www.cnblogs.com/xiaoyoucai/p/8306444.html