GDI编程框架代码

  1 #include <windows.h>
  2 #include <math.h>
  3 
  4 #define WINDOW_WIDTH    400                          
  5 #define WINDOW_HEIGHT    300                           
  6 
  7 
  8 
  9 LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 10 {
 11     switch(msg)
 12     {
 13         // 窗口绘制消息
 14     case WM_PAINT:
 15         //Paint(hwnd); // 调用我们的 GDI 绘制函数
 16         break;
 17         // 窗口关闭消息
 18     case WM_CLOSE:
 19         DestroyWindow(hwnd);
 20         break;
 21         // 窗口销毁消息
 22     case WM_DESTROY:
 23         PostQuitMessage(0); // 发送离开消息给系统
 24         break;
 25         // 其他消息
 26     default:
 27         // pass 给系统,咱不管
 28         return DefWindowProc(hwnd, msg, wParam, lParam);
 29     }
 30     return 0;
 31 }
 32 
 33 /*
 34 * 第一步,注册窗口类
 35 */
 36 void RegisterMyWindow(HINSTANCE hInstance)
 37 {
 38     WNDCLASSEX wc; 
 39 
 40     // 1)配置窗口属性
 41     wc.cbSize = sizeof(WNDCLASSEX);
 42     wc.style = 0;
 43     wc.lpfnWndProc = MyWindowProc; // 设置第四步的窗口过程回调函数
 44     wc.cbClsExtra = 0;
 45     wc.cbWndExtra = 0;
 46     wc.hInstance = hInstance;
 47     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 48     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 49     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 50     wc.lpszMenuName = NULL;
 51     wc.lpszClassName = TEXT("myWindowClass");
 52     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 53 
 54     // 2)注册
 55     if(!RegisterClassEx(&wc))
 56     {
 57         MessageBox(NULL, TEXT("窗口注册失败!"), TEXT("错误"), MB_ICONEXCLAMATION | MB_OK);
 58         exit(0); // 进程退出
 59     }
 60 }
 61 
 62 /*
 63 * 第二步,创建窗口
 64 */
 65 HWND CreateMyWindow(HINSTANCE hInstance, int nCmdShow)
 66 {
 67     HWND hwnd;
 68     hwnd = CreateWindowEx(
 69         WS_EX_CLIENTEDGE,
 70         TEXT("myWindowClass"),
 71         TEXT("我的窗口名称"),
 72         WS_OVERLAPPEDWINDOW,
 73         CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, // 出现坐标 x,y 默认分配 窗口宽 400 高 300
 74         NULL, NULL, hInstance, NULL);
 75 
 76     if(hwnd == NULL)
 77     {
 78         MessageBox(NULL, TEXT("窗口创建失败!"), TEXT("错误"), MB_ICONEXCLAMATION | MB_OK);
 79         exit(0); // 进程退出
 80     }
 81 
 82     // 显示窗口
 83     ShowWindow(hwnd, nCmdShow);
 84     UpdateWindow(hwnd);
 85 
 86     return hwnd;
 87 }
 88 
 89 /*
 90 * 主函数
 91 */
 92 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 93     LPSTR lpCmdLine, int nCmdShow)
 94 {
 95     HWND hwnd;
 96     MSG Msg;
 97 
 98     // 第一步,注册窗口类
 99     RegisterMyWindow(hInstance);
100     // 第二步:创建窗口
101     hwnd = CreateMyWindow(hInstance, nCmdShow);
102     // 第三步:消息循环
103     while(GetMessage(&Msg, NULL, 0, 0) > 0)
104     {
105         TranslateMessage(&Msg);
106 
107         DispatchMessage(&Msg);
108     }
109     return Msg.wParam;
110 }
View Code

 一个更合理的框架

  1 #include <windows.h>
  2 
  3 
  4 #define WINDOW_WIDTH    800                         
  5 #define WINDOW_HEIGHT    600                          
  6 #define WINDOW_TITLE    L"程序核心框架"
  7 
  8 HDC g_hdc=NULL;
  9 
 10 LRESULT CALLBACK    WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );  //窗口过程函数
 11 BOOL Game_Init(HWND hwnd); //在此函数中进行资源的初始化
 12 VOID Game_Paint(HWND hwnd); //进行绘图代码的书写
 13 BOOL Game_CleanUp(HWND hwnd); //资源的清理
 14 
 15 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
 16 {
 17     //【1】窗口创建四步曲之一:开始设计一个完整的窗口类
 18     WNDCLASSEX wndClass = { 0 };                            //用WINDCLASSEX定义了一个窗口类,{0}用来初始化结构体
 19     wndClass.cbSize = sizeof( WNDCLASSEX ) ;            //设置结构体的字节数大小
 20     wndClass.style = CS_HREDRAW | CS_VREDRAW;    //设置窗口的样式
 21     wndClass.lpfnWndProc = WndProc;                    //设置指向窗口过程函数的指针
 22     wndClass.cbClsExtra  = 0;                                //窗口类的附加内存,取0就可以了
 23     wndClass.cbWndExtra  = 0;                            //窗口的附加内存,依然取0就行了
 24     wndClass.hInstance = hInstance;                        //指定包含窗口过程的程序的实例句柄。
 25     wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);  //本地加载自定义ico图标
 26     wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );    //指定窗口类的光标句柄。
 27     wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //为hbrBackground成员指定一个灰色画刷句柄    
 28     wndClass.lpszMenuName = NULL;                        //用一个以空终止的字符串,指定菜单资源的名字。
 29     wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";        //用一个以空终止的字符串,指定窗口类的名字。
 30 
 31     //【2】窗口创建四步曲之二:注册窗口类
 32     if( !RegisterClassEx( &wndClass ) )                //设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
 33         return -1;        
 34 
 35     //【3】窗口创建四步曲之三:正式创建窗口
 36     HWND hwnd = CreateWindow( L"ForTheDreamOfGameDevelop",WINDOW_TITLE,        //喜闻乐见的创建窗口函数CreateWindow
 37         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
 38         WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );
 39 
 40     //【4】窗口创建四步曲之四:窗口的移动、显示与更新
 41     MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);        //调整窗口显示时的位置,使窗口左上角位于(250,80)处
 42     ShowWindow( hwnd, nShowCmd );    //调用ShowWindow函数来显示窗口,第二个参数用于指定窗口的显示状态
 43     UpdateWindow(hwnd);                        //对窗口进行更新,就像我们买了新房子要装修一样
 44 
 45     //游戏资源的初始化,若初始化失败,弹出一个消息框,并返回FALSE
 46     if(!(Game_Init(hwnd)))
 47     {
 48         MessageBox(hwnd,L"资源初始化失败",L"消息窗口",0);
 49         return FALSE;
 50     }
 51 
 52     //【5】消息循环过程
 53     MSG msg = { 0 };        //定义并初始化msg
 54     while( msg.message != WM_QUIT )            //使用while循环,如果消息不是WM_QUIT消息,就继续循环
 55     {
 56         if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
 57         {
 58             TranslateMessage( &msg );        //将虚拟键消息转换为字符消息
 59             DispatchMessage( &msg );            //分发一个消息给窗口程序。
 60         }
 61     }
 62 
 63     //【6】窗口类的注销
 64     UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance);  //程序准备结束,注销窗口类
 65     return 0;  
 66 }
 67 
 68 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )      
 69 {
 70     PAINTSTRUCT paintStruct;    //定义一个PAINTSTRUCT结构体来记录一些绘制信息
 71 
 72     switch( message )                        //switch语句开始
 73     {
 74     case WM_PAINT:                        // 若是客户区重绘消息
 75         g_hdc=BeginPaint(hwnd,&paintStruct);    //指定窗口进行绘图工作的准备,并将和绘图有关的信息填充到paintstruct结构体中
 76         Game_Paint(hwnd);
 77         EndPaint(hwnd,&paintStruct);    //EndPaint函数标记指定窗口的绘画过程结束
 78         ValidateRect(hwnd, NULL);        // 更新客户区的显示
 79         break;                                    //跳出该switch语句
 80 
 81     case WM_KEYDOWN:                // 若是键盘按下消息
 82         if (wParam == VK_ESCAPE)    // 如果被按下的键是ESC
 83             DestroyWindow(hwnd);        // 销毁窗口, 并发送一条WM_DESTROY消息
 84         break;                                    //跳出该switch语句
 85 
 86     case WM_DESTROY:                //若是窗口销毁消息
 87         PostQuitMessage( 0 );        //向系统表明有个线程有终止请求。用来响应WM_DESTROY消息
 88         break;                                //跳出该switch语句
 89 
 90     default:                                    //若上述case条件都不符合,则执行该default语句
 91         return DefWindowProc( hwnd, message, wParam, lParam );        //调用缺省的窗口过程
 92     }
 93 
 94     return 0;            //正常退出
 95 }
 96 
 97 //初始化函数,进行一些简单的初始化
 98 BOOL Game_Init(HWND hwnd)
 99 {
100     g_hdc=GetDC(hwnd);
101     Game_Paint(hwnd);
102     ReleaseDC(hwnd,g_hdc); //一个窗口句柄,一个设备上下文环境句柄,注意区别
103     return TRUE;
104 }
105 
106 //绘制函数
107 VOID Game_Paint(HWND hwnd)
108 {
109     //我们自己的绘制逻辑
110 }
111 
112 //清理资源
113 BOOL Game_CleanUp(HWND hwnd)
114 {
115     return TRUE;
116 }
View Code

 

posted @ 2022-03-01 14:31  szmtjs10  阅读(91)  评论(0编辑  收藏  举报