zoukankan      html  css  js  c++  java
  • 2D游戏编程3—GDI

    WM_PAINT消息触发程序重新绘制界面,过程如下:

    PAINTSTRUCT    ps;    // used in WM_PAINT
    HDC        hdc;    // handle to a device context

    case WM_PAINT:
    {
       hdc = BeginPaint(hwnd,&ps);
       EndPaint(hwnd,&ps);
       return(0);
    } break;

    image

    beginpaint将需要重绘的区域存入ps的rcpaint中,ps定义结构如下:

    typedef struct tagPAINTSTRUCT
    {
    HDC  hdc;        // graphics device context
    BOOL fErase;     // if TRUE then you must draw background
    RECT rcPaint;    // the RECT containing invalid region
    BOOL fRestore;   // internal
    BOOL fIncUpdate; // internal
    BYTE rgbReserved[32]; // internal
    } PAINTSTRUCT;

    其中RECT结构如下:

    typedef struct _RECT
    {
    LONG left;   // left edge if rectangle
    LONG top;    // upper edge of rectangle
    LONG right;  // right edge of rectangle
    LONG bottom; // bottom edge of rectangle
    } RECT;

    GDI文字输出依靠DrawText和TextOut两个函数

    例子:

    #define WIN32_LEAN_AND_MEAN  // just say no to MFC
    
    #include <windows.h>   // include all the windows headers
    #include <windowsx.h>  // include useful macros
    #include <mmsystem.h>  // very important and include WINMM.LIB too!
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    // DEFINES ////////////////////////////////////////////////
    
    // defines for windows 
    #define WINDOW_CLASS_NAME "WINCLASS1"
    
    // GLOBALS ////////////////////////////////////////////////
    HWND      main_window_handle = NULL; // globally track main window
    HINSTANCE hinstance_app      = NULL; // globally track hinstance
    
    // FUNCTIONS //////////////////////////////////////////////
    LRESULT CALLBACK WindowProc(HWND hwnd, 
                                UINT msg, 
                                WPARAM wparam, 
                                LPARAM lparam)
    {
    // this is the main message handler of the system
    PAINTSTRUCT        ps;        // used in WM_PAINT
    HDC                hdc;    // handle to a device context
    
    // what is the message 
    switch(msg)
        {    
        case WM_CREATE: 
            {
            // do initialization stuff here
            // return success
            return(0);
            } break;
      
    
        case WM_PAINT: 
            {
            // simply validate the window
            hdc = BeginPaint(hwnd,&ps);     
            // you would do all your painting here
            EndPaint(hwnd,&ps);
    
            // return success
            return(0);
               } break;
    
        case WM_DESTROY: 
            {
    
            // kill the application, this sends a WM_QUIT message 
            PostQuitMessage(0);
    
            // return success
            return(0);
            } break;
    
        default:break;
    
        } // end switch
    
    // process any messages that we didn't take care of 
    return (DefWindowProc(hwnd, msg, wparam, lparam));
    
    } // end WinProc
    
    // WINMAIN ////////////////////////////////////////////////
    int WINAPI WinMain(    HINSTANCE hinstance,
                        HINSTANCE hprevinstance,
                        LPSTR lpcmdline,
                        int ncmdshow)
    {
    
    WNDCLASSEX winclass; // this will hold the class we create
    HWND       hwnd;     // generic window handle
    MSG           msg;         // generic message
    
    // first fill in the window class stucture
    winclass.cbSize         = sizeof(WNDCLASSEX);
    winclass.style            = CS_DBLCLKS | CS_OWNDC | 
                              CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc    = WindowProc;
    winclass.cbClsExtra        = 0;
    winclass.cbWndExtra        = 0;
    winclass.hInstance        = hinstance;
    winclass.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    winclass.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName    = NULL;
    winclass.lpszClassName    = WINDOW_CLASS_NAME;
    winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    
    // save hinstance in global
    hinstance_app = hinstance;
    
    // register the window class
    if (!RegisterClassEx(&winclass))
        return(0);
    
    // create the window
    if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                                WINDOW_CLASS_NAME,     // class
                                "GDI Text Printing Demo", // title
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                 0,0,      // initial x,y
                                400,400,  // initial width, height
                                NULL,      // handle to parent 
                                NULL,      // handle to menu
                                hinstance,// instance of this application
                                NULL)))    // extra creation parms
    return(0);
    
    // save main window handle
    main_window_handle = hwnd;
    
    // get the dc and hold it
    HDC hdc = GetDC(hwnd);
    
    // enter main event loop, but this time we use PeekMessage()
    // instead of GetMessage() to retrieve messages
    while(TRUE)
        {
        // test if there is a message in queue, if so get it
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
           { 
           // test if this is a quit
           if (msg.message == WM_QUIT)
               break;
        
           // translate any accelerator keys
           TranslateMessage(&msg);
    
           // send the message to the window proc
           DispatchMessage(&msg);
           } // end if
        
        // main game processing goes here
        
        // set the foreground color to random
        SetTextColor(hdc, RGB(rand()%256,rand()%256,rand()%256));
    
        // set the background color to black
        SetBkColor(hdc, RGB(11,11,11));
    
        // finally set the transparency mode to transparent
        SetBkMode(hdc, TRANSPARENT);
    
        // draw some text at a random location
        TextOut(hdc,rand()%400,rand()%400, "GDI Text Demo!", strlen("GDI Text Demo!"));
    
        Sleep(10);
        
        } // end while
    
    // release the dc
    ReleaseDC(hwnd,hdc);
    
    // return to Windows like this
    return(msg.wParam);
    
    } // end WinMain
    
    ///////////////////////////////////////////////////////////
  • 相关阅读:
    xcode 工具栏中放大镜的替换的说明
    xcode 工具栏中放大镜的替换的简单说明
    xcode 资源管理
    泛型的冒泡,插入,选择,希尔算法
    一套手写ajax加一般处理程序的增删查改
    Android自定义控件_自绘控件
    查看自己Android设备分辨率
    Collection集合 和 Map
    深入理解Java中的面向对象
    webserivce请求头组装
  • 原文地址:https://www.cnblogs.com/seebro/p/3323190.html
Copyright © 2011-2022 走看看