• 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
  • 相关阅读:
    wait与sleep区别?
    oracle死锁查询
    atomic 原子操作的类
    买票问题
    0001.第一个多线程demo--分批处理数据
    01: JavaScript实例
    01: 运维工作梳理
    04: 使用BeautifulSoup封装的xss过滤模块
    04: 打开tornado源码剖析处理过程
    03: 自定义异步非阻塞tornado框架
  • 原文地址:https://www.cnblogs.com/szmtjs10/p/15950036.html
Copyright © 2020-2023  润新知