我编好我的父类 然后 通过子类继承 改写不同的代码 就实现了 一个接口 多种行为
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 }