zoukankan      html  css  js  c++  java
  • Win32编程day07 学习笔记

    一 Windows绘图

      1 图形绘制
     
        1.1 图形绘制的方式
          获取到绘图句柄-设备描述表(DC),使用相应的绘图的API,在设备上绘制图形.
         
        1.2 颜色
          R\G\B三色, 每种颜色8位, 共24位颜色.
          32位颜色: 颜色数量24位颜色, 多出来的8位表示灰度.
          16位: 颜色数量2的16次方.
         
          Win32下,颜色的定义 COLORREF(DWORD), RGB宏定义颜色
           COLORREF nColor = RGB( 0,  0,  0 );
            COLORREF nColor = RGB( 255,255,255 );
            COLORREF nColor = RGB( 255,0,  0 );
          从一个颜色中获取RGB三色:
            int nBlue = GetBValue( nColor );
            int nRed  = GetRValue( nColor );
            int nGreen= GetGValue( nColor );

        1.3 点的绘制和获取
          绘制: COLORREF SetPixel(
         HDC hdc, //DC句柄
         int X, //x坐标
         int Y, //y坐标
        COLORREF crColor ); // 点的颜色

          获取: COLORREF GetPixel(
          HDC hdc,   //DC句柄
          int XPos,  //x坐标
          int nYPos ); //y坐标
        返回指定坐标位置的点的颜色

        1.4 直线的绘制
          MoveToEx 移动当前点到指定位置
          LineTo 从当前点绘制直线到指定位置

    View Code
    // WinDraw.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "stdio.h"
    #include "resource.h"
    
    HINSTANCE g_hInst     = NULL;
    int       g_nDrawType = 0;
    
    void DrawPixel( HDC hDC )
    {
        COLORREF nColor = RGB( 0, 0, 0 );
        SetPixel( hDC, 100, 100, nColor );
    }
    
    void GetPixelColor( HDC hDC )
    {    //获取点的颜色
        COLORREF nColor = 
            GetPixel( hDC, 100, 100 );
        //获取颜色的三色值
        int nRed   = GetRValue( nColor );
        int nGreen = GetGValue( nColor );
        int nBlue  = GetBValue( nColor );
    
        CHAR szText[260] = { 0 };
        sprintf( szText, 
            "COLOR=%08X, RED=%d GREEN=%d BLUE=%d",
            nColor, nRed, nGreen, nBlue );
        MessageBox( NULL, szText, "WinDraw", MB_OK );
    }
    
    void DrawLine( HDC hDC )
    {
        MoveToEx( hDC, 0, 0, NULL );
        LineTo( hDC, 500, 500 );
        MoveToEx( hDC, 500, 0, NULL );
        LineTo( hDC, 0, 500 );
    }
    
    void OnPaint( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        PAINTSTRUCT ps = { 0 };
        HDC hDC = BeginPaint( hWnd, &ps );
    
        switch( g_nDrawType )
        {
        case ID_SETPIXEL:
            DrawPixel( hDC );
            break;
        case ID_GETPIXEL:
            GetPixelColor( hDC );
            break;
        case ID_LINE:
            DrawLine( hDC );
            break;
        }
    
        EndPaint( hWnd, &ps );
    }
    
    void OnCommand( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        int nCmdID = LOWORD( wParam );
        switch( nCmdID )
        {
        case ID_SETPIXEL:
        case ID_GETPIXEL:
        case ID_LINE:
            //保存绘制图形类型
            g_nDrawType = nCmdID;
            //刷新窗口
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_EXIT:
            PostQuitMessage( 0 );
            break;
        }
    }
    
    LRESULT CALLBACK WndProc( HWND   hWnd, 
                              UINT   nMsg,
                              WPARAM wParam,
                              LPARAM lParam )
    {
        switch( nMsg )
        {
        case WM_PAINT:
            OnPaint( hWnd, nMsg, wParam, lParam );
            break;
        case WM_COMMAND:
            OnCommand( hWnd, nMsg, wParam, lParam );
            break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        }
        return DefWindowProc( hWnd, nMsg,
            wParam, lParam );
    }
    
    BOOL RegisterWnd( LPSTR pszClassName )
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize        = sizeof( wce );
        wce.cbClsExtra    = 0;
        wce.cbWndExtra    = 0;
        wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
        wce.hCursor       = NULL;
        wce.hIcon         = NULL;
        wce.hIconSm       = NULL;
        wce.hInstance     = g_hInst;
        wce.lpfnWndProc   = WndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName  = NULL;
        wce.style         = CS_HREDRAW|CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx( &wce );
        if( 0 ==  nAtom )
        {
            return FALSE;
        }
    
        return TRUE;
    }
    
    HWND CreateWnd( LPSTR pszClassName )
    {
        HMENU hMenu = LoadMenu( g_hInst, 
            MAKEINTRESOURCE(IDR_MAIN) );
    
        HWND hWnd = CreateWindowEx( 0,
            pszClassName, "MyWnd", 
            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, NULL, hMenu, g_hInst,
            NULL );
        return hWnd;
    }
    
    void DisplayWnd( HWND hWnd )
    {
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }
    
    void Message( )
    {
        MSG msg = { 0 };
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        g_hInst = hInstance;
        RegisterWnd( "MYWND" );
        HWND hWnd = CreateWnd( "MYWND" );
        DisplayWnd( hWnd );
        Message( );
        return 0;
    } 

        1.5 弧的绘制
           Arc和AngleArc提供不同的绘制弧的方式:
           1.5.1 BOOL Arc( HDC hdc,
          int nLeftRect, // 外切矩形的坐标
          int nTopRect,//外切矩形的坐标
          int nRightRect,//外切矩形的坐标
          int nBottomRect,//外切矩形的坐标
          int nXStartArc,//起始切割半径的X坐标
          int nYStartArc,//起始切割半径的Y坐标
          int nXEndArc, //终止切割半径的X坐标
          int nYEndArc ); //终止切割半径的X坐标
        可以使用SetArcDirection函数,设置Arc函数
        切割方向:顺时针和逆时针.
           1.5.2 BOOL AngleArc(
         HDC hdc, // handle to device context
         int X, //圆心的X坐标
         int Y, //圆心的Y坐标
         DWORD dwRadius,//圆的半径
         FLOAT eStartAngle,//开始角度
          FLOAT eSweepAngle );//夹角

    View Code
    // WinDraw.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "stdio.h"
    #include "resource.h"
    
    HINSTANCE g_hInst     = NULL;
    int       g_nDrawType = 0;
    
    void DrawPixel( HDC hDC )
    {
        COLORREF nColor = RGB( 0, 0, 0 );
        SetPixel( hDC, 100, 100, nColor );
    }
    
    void GetPixelColor( HDC hDC )
    {    //获取点的颜色
        COLORREF nColor = 
            GetPixel( hDC, 100, 100 );
        //获取颜色的三色值
        int nRed   = GetRValue( nColor );
        int nGreen = GetGValue( nColor );
        int nBlue  = GetBValue( nColor );
    
        CHAR szText[260] = { 0 };
        sprintf( szText, 
            "COLOR=%08X, RED=%d GREEN=%d BLUE=%d",
            nColor, nRed, nGreen, nBlue );
        MessageBox( NULL, szText, "WinDraw", MB_OK );
    }
    
    void DrawLine( HDC hDC )
    {
        MoveToEx( hDC, 0, 0, NULL );
        LineTo( hDC, 500, 500 );
        MoveToEx( hDC, 500, 0, NULL );
        LineTo( hDC, 0, 500 );
    }
    
    void DrawArc( HDC hDC )
    {    //逆时针的方式
        SetArcDirection( hDC, 
            AD_COUNTERCLOCKWISE );
        //通过外切矩形和切割线
        Arc( hDC, 400, 200, 500, 300,
            500, 200, 400, 200);
        //顺时针的方式
        SetArcDirection( hDC, 
            AD_CLOCKWISE );
        Arc( hDC, 500, 200, 600, 300,
            600, 200, 500, 200);
        
        MoveToEx( hDC, 200, 200, NULL );
        //指定圆心和角度
        AngleArc( hDC, 200, 200, 100,
            60, 240 );
        LineTo( hDC, 200, 200 );
    }
    
    void OnPaint( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        PAINTSTRUCT ps = { 0 };
        HDC hDC = BeginPaint( hWnd, &ps );
    
        switch( g_nDrawType )
        {
        case ID_SETPIXEL:
            DrawPixel( hDC );
            break;
        case ID_GETPIXEL:
            GetPixelColor( hDC );
            break;
        case ID_LINE:
            DrawLine( hDC );
            break;
        case ID_ARC:
            DrawArc( hDC );
            break;
        }
    
        EndPaint( hWnd, &ps );
    }
    
    void OnCommand( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        int nCmdID = LOWORD( wParam );
        switch( nCmdID )
        {
        case ID_SETPIXEL:
        case ID_GETPIXEL:
        case ID_LINE:
        case ID_ARC:
            //保存绘制图形类型
            g_nDrawType = nCmdID;
            //刷新窗口
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_EXIT:
            PostQuitMessage( 0 );
            break;
        }
    }
    
    LRESULT CALLBACK WndProc( HWND   hWnd, 
                              UINT   nMsg,
                              WPARAM wParam,
                              LPARAM lParam )
    {
        switch( nMsg )
        {
        case WM_PAINT:
            OnPaint( hWnd, nMsg, wParam, lParam );
            break;
        case WM_COMMAND:
            OnCommand( hWnd, nMsg, wParam, lParam );
            break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        }
        return DefWindowProc( hWnd, nMsg,
            wParam, lParam );
    }
    
    BOOL RegisterWnd( LPSTR pszClassName )
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize        = sizeof( wce );
        wce.cbClsExtra    = 0;
        wce.cbWndExtra    = 0;
        wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
        wce.hCursor       = NULL;
        wce.hIcon         = NULL;
        wce.hIconSm       = NULL;
        wce.hInstance     = g_hInst;
        wce.lpfnWndProc   = WndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName  = NULL;
        wce.style         = CS_HREDRAW|CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx( &wce );
        if( 0 ==  nAtom )
        {
            return FALSE;
        }
    
        return TRUE;
    }
    
    HWND CreateWnd( LPSTR pszClassName )
    {
        HMENU hMenu = LoadMenu( g_hInst, 
            MAKEINTRESOURCE(IDR_MAIN) );
    
        HWND hWnd = CreateWindowEx( 0,
            pszClassName, "MyWnd", 
            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, NULL, hMenu, g_hInst,
            NULL );
        return hWnd;
    }
    
    void DisplayWnd( HWND hWnd )
    {
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }
    
    void Message( )
    {
        MSG msg = { 0 };
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        g_hInst = hInstance;
        RegisterWnd( "MYWND" );
        HWND hWnd = CreateWnd( "MYWND" );
        DisplayWnd( hWnd );
        Message( );
        return 0;
    }

        1.6 折线
           1.6.1 BOOL Polyline(
         HDC hdc, //DC句柄
         CONST POINT *lppt,//Polyline顶点的坐标数组
         int cPoints ); //顶点数组的长度
           1.6.2 PolylineTo 与Polyline类似, 只是在绘制Polyline前,从当前点使用LineTo绘制直线到Polyline的第一个顶点.
           1.6.3 绘制多组折线 PolyPolyline
              BOOL PolyPolyline( HDC hdc,
          CONST POINT *lppt,//所有点的数组
           CONST DWORD *lpdwPolyPoints,//每组点的数量
           DWORD cCount );//分组的数量
             例如:
              DWORD nGroup[] = { 4, 3 };
             PolyPolyline( hDC, ptPolyLine,nGroup, 2 );

         1.7 Bezier曲线
           BOOL PolyBezier(HDC hdc,
             CONST POINT *lppt,//点数组,最少4个点
          DWORD cPoints );//点的数量
          4个点: 1和4是端点,2.3点是控制点
             7个点: 1.4.7是端点,其余是控制点
        
         1.8 多样式的线条
            BOOL PolyDraw( HDC hdc,
            CONST POINT *lppt,//各个点的数组
         CONST BYTE *lpbTypes, //从某点到下一点的绘制方式 pointer to line and curve identifiers
         int cCount); //点的数量
         lpbTypes - PT_MOVETO  移动到该点
                    PT_LINETO  绘直线
                       PT_BIZERTO Biezer曲线
                      
         1.9 矩形的绘制
           1.9.1 普通矩形 Rectangle
           1.9.2 带圆角的矩形
            BOOL RoundRect( HDC hdc,
            int nLeftRect, //左上X坐标
          int nTopRect, //左上Y坐标
            int nRightRect,//右下X坐标
            int nBottomRect, //右下Y坐标
            int nWidth, //生成圆角的椭圆的宽度
            int nHeight );//生成圆角的椭圆的高度

         1.10 椭圆和圆
           BOOL Ellipse( HDC hdc,
           int nLeftRect, //外切矩形左上X坐标
          int nTopRect,//外切矩形左上Y坐标
           int nRightRect, //外切矩形右下X坐标
           int nBottomRect); //外切矩形右下Y坐标
          
         1.11 饼Pie
           BOOL Pie( HDC hdc,
           int nLeftRect, //外切矩形左上X坐标
         int nTopRect, //外切矩形左上Y坐标
           int nRightRect,  //外切矩形右下X坐标
           int nBottomRect, //外切矩形右下Y坐标
           int nXRadial1,//切割起始半径X坐标
           int nYRadial1,//切割起始半径Y坐标
           int nXRadial2,//切割终止半径X坐标
          int nYRadial2 );//切割终止半径Y坐标

    View Code
    // WinDraw.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "stdio.h"
    #include "resource.h"
    
    HINSTANCE g_hInst     = NULL;
    int       g_nDrawType = 0;
    
    void DrawPixel( HDC hDC )
    {
        COLORREF nColor = RGB( 0, 0, 0 );
        SetPixel( hDC, 100, 100, nColor );
    }
    
    void GetPixelColor( HDC hDC )
    {    //获取点的颜色
        COLORREF nColor = 
            GetPixel( hDC, 100, 100 );
        //获取颜色的三色值
        int nRed   = GetRValue( nColor );
        int nGreen = GetGValue( nColor );
        int nBlue  = GetBValue( nColor );
    
        CHAR szText[260] = { 0 };
        sprintf( szText, 
            "COLOR=%08X, RED=%d GREEN=%d BLUE=%d",
            nColor, nRed, nGreen, nBlue );
        MessageBox( NULL, szText, "WinDraw", MB_OK );
    }
    
    void DrawLine( HDC hDC )
    {
        MoveToEx( hDC, 0, 0, NULL );
        LineTo( hDC, 500, 500 );
        MoveToEx( hDC, 500, 0, NULL );
        LineTo( hDC, 0, 500 );
    }
    
    void DrawArc( HDC hDC )
    {    //逆时针的方式
        SetArcDirection( hDC, 
            AD_COUNTERCLOCKWISE );
        //通过外切矩形和切割线
        Arc( hDC, 400, 200, 500, 300,
            500, 200, 400, 200);
        //顺时针的方式
        SetArcDirection( hDC, 
            AD_CLOCKWISE );
        Arc( hDC, 500, 200, 600, 300,
            600, 200, 500, 200);
        
        MoveToEx( hDC, 200, 200, NULL );
        //指定圆心和角度
        AngleArc( hDC, 200, 200, 100,
            60, 240 );
        LineTo( hDC, 200, 200 );
    }
    
    void DrawPolyLine( HDC hDC )
    {
        POINT ptPolyLine[7] = { 0 };
        ptPolyLine[0].x = 100;
        ptPolyLine[0].y = 100;
        ptPolyLine[1].x = 200;
        ptPolyLine[1].y = 100;
        ptPolyLine[2].x = 200;
        ptPolyLine[2].y = 200;
        ptPolyLine[3].x = 300;
        ptPolyLine[3].y = 200;
        ptPolyLine[4].x = 300;
        ptPolyLine[4].y = 300;
        ptPolyLine[5].x = 400;
        ptPolyLine[5].y = 300;
        ptPolyLine[6].x = 400;
        ptPolyLine[6].y = 400;
    
        //Polyline( hDC, ptPolyLine, 7 );
        //PolylineTo( hDC, ptPolyLine, 3 );
    
        DWORD nGroup[] = { 4, 3 };
        PolyPolyline( hDC, ptPolyLine,nGroup, 2 );
    }
    
    void DrawBizer( HDC hDC )
    {
        POINT ptBizer[7] = { 0 };
        ptBizer[0].x = 100; //端点
        ptBizer[0].y = 100; //
        ptBizer[1].x = 100; //控制点
        ptBizer[1].y = 50;  //
        ptBizer[2].x = 300; //控制点
        ptBizer[2].y = 150; //
        ptBizer[3].x = 300; //端点
        ptBizer[3].y = 100; //
        ptBizer[4].x = 300; //控制点
        ptBizer[4].y = 400;
        ptBizer[5].x = 400; //控制点
        ptBizer[5].y = 200;
        ptBizer[6].x = 500; //端点
        ptBizer[6].y = 300;
        
        PolyBezier( hDC, ptBizer, 7 );
        MoveToEx( hDC, ptBizer[0].x, 
            ptBizer[0].y, NULL );
        LineTo( hDC, ptBizer[1].x, ptBizer[1].y );
        MoveToEx( hDC, ptBizer[3].x, 
            ptBizer[3].y, NULL );
        LineTo( hDC, ptBizer[2].x, ptBizer[2].y );
    }
    
    void DrawPolyDraw( HDC hDC )
    {
        POINT ptDraw[4] = { 0 };
        ptDraw[0].x = 100;
        ptDraw[0].y = 100;
        ptDraw[1].x = 200;
        ptDraw[1].y = 100;
        ptDraw[2].x = 200;
        ptDraw[2].y = 200;
        ptDraw[3].x = 300;
        ptDraw[3].y = 200;
    
        BYTE ptType[4] = {0};
        ptType[0] = PT_MOVETO;
        ptType[1] = PT_LINETO;
        ptType[2] = PT_MOVETO;
        ptType[3] = PT_LINETO;
    
        PolyDraw( hDC, ptDraw, ptType, 4 );
    }
    
    void DrawRect( HDC hDC )
    {    //矩形
        Rectangle( hDC, 100, 100, 200, 200 );
        //带圆角矩形
        RoundRect( hDC, 300, 100, 400, 200, 50, 50 );
    }
    
    void DrawEllipse( HDC hDC )
    {    //
        Ellipse( hDC, 100, 100, 200, 200 );
        //椭圆
        Ellipse( hDC, 300, 100, 500, 200 );
    }
    
    void DrawPie( HDC hDC )
    {
        Pie( hDC, 100, 100, 500, 400,
            500, 100, 100, 100 );
    }
    
    void OnPaint( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        PAINTSTRUCT ps = { 0 };
        HDC hDC = BeginPaint( hWnd, &ps );
    
        switch( g_nDrawType )
        {
        case ID_SETPIXEL:
            DrawPixel( hDC );
            break;
        case ID_GETPIXEL:
            GetPixelColor( hDC );
            break;
        case ID_LINE:
            DrawLine( hDC );
            break;
        case ID_ARC:
            DrawArc( hDC );
            break;
        case ID_POLYLINE:
            DrawPolyLine( hDC );
            break;
        case ID_DRAWBIZER:
            DrawBizer( hDC );
            break;
        case ID_POLYDRAW:
            DrawPolyDraw( hDC );
            break;
        case ID_RECT:
            DrawRect( hDC );
            break;
        case ID_ELLIPSE:
            DrawEllipse( hDC );
            break;
        case ID_PIE:
            DrawPie( hDC );
            break;
        }
    
        EndPaint( hWnd, &ps );
    }
    
    void OnCommand( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        int nCmdID = LOWORD( wParam );
        switch( nCmdID )
        {
        case ID_SETPIXEL:
        case ID_GETPIXEL:
        case ID_LINE:
        case ID_ARC:
        case ID_POLYLINE:
        case ID_DRAWBIZER:
        case ID_POLYDRAW:
        case ID_RECT:
        case ID_ELLIPSE:
        case ID_PIE:
            //保存绘制图形类型
            g_nDrawType = nCmdID;
            //刷新窗口
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_EXIT:
            PostQuitMessage( 0 );
            break;
        }
    }
    
    LRESULT CALLBACK WndProc( HWND   hWnd, 
                              UINT   nMsg,
                              WPARAM wParam,
                              LPARAM lParam )
    {
        switch( nMsg )
        {
        case WM_PAINT:
            OnPaint( hWnd, nMsg, wParam, lParam );
            break;
        case WM_COMMAND:
            OnCommand( hWnd, nMsg, wParam, lParam );
            break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        }
        return DefWindowProc( hWnd, nMsg,
            wParam, lParam );
    }
    
    BOOL RegisterWnd( LPSTR pszClassName )
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize        = sizeof( wce );
        wce.cbClsExtra    = 0;
        wce.cbWndExtra    = 0;
        wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
        wce.hCursor       = NULL;
        wce.hIcon         = NULL;
        wce.hIconSm       = NULL;
        wce.hInstance     = g_hInst;
        wce.lpfnWndProc   = WndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName  = NULL;
        wce.style         = CS_HREDRAW|CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx( &wce );
        if( 0 ==  nAtom )
        {
            return FALSE;
        }
    
        return TRUE;
    }
    
    HWND CreateWnd( LPSTR pszClassName )
    {
        HMENU hMenu = LoadMenu( g_hInst, 
            MAKEINTRESOURCE(IDR_MAIN) );
    
        HWND hWnd = CreateWindowEx( 0,
            pszClassName, "MyWnd", 
            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, NULL, hMenu, g_hInst,
            NULL );
        return hWnd;
    }
    
    void DisplayWnd( HWND hWnd )
    {
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }
    
    void Message( )
    {
        MSG msg = { 0 };
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        g_hInst = hInstance;
        RegisterWnd( "MYWND" );
        HWND hWnd = CreateWnd( "MYWND" );
        DisplayWnd( hWnd );
        Message( );
        return 0;
    }

         1.12 弦
           BOOL Chord( HDC hdc,
           int nLeftRect, //外切矩形左上X坐标
         int nTopRect, //外切矩形左上Y坐标
           int nRightRect,  //外切矩形右下X坐标
           int nBottomRect, //外切矩形右下Y坐标
           int nXRadial1,//切割起始半径X坐标
           int nYRadial1,//切割起始半径Y坐标
           int nXRadial2,//切割终止半径X坐标
          int nYRadial2 );//切割终止半径Y坐标
          
         1.13 多边形
           BOOL Polygon( HDC hdc,
            CONST POINT *lpPoints, //多边形的顶点
            int nCount ); //顶点的数量
           PolyPolygon 可以绘制多组多边形
          
      2 GDI绘图对象 - 画笔
       2.1 画笔的作用
         可以控制线条的颜色、样式、宽度。
       2.2 画笔的使用
         2.2.1 创建画笔 CreatePen
            HPEN CreatePen(
          int fnPenStyle, //画笔的样式
           int nWidth, //画笔的宽度
          COLORREF crColor);//画笔的颜色
         2.2.2 置成当前DC可以使用的画笔
            HGDIOBJ SelectObject(
           HDC hdc, // 当前DC的句柄
              HGDIOBJ hgdiobj );//要使用的GDI对象句柄
            返回当前DC原来使用的同类型的GDI对象句柄。
         2.2.3 绘制图形
         2.2.4 从当前DC中取出画笔,即将旧画笔放入当前DC中
               SelectObject( hDC, hOldPen );
         2.2.5 销毁画笔
            DeleteObject( hPen );
            画笔使用时,由于绘图资源有限,一定要注意释放。

    View Code
    // WinDraw.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "stdio.h"
    #include "resource.h"
    
    HINSTANCE g_hInst     = NULL;
    int       g_nDrawType = 0;
    COLORREF  g_nPenColor = RGB( 0, 0, 0 );
    int          g_nPenStyle = PS_SOLID;
    int       g_nPenWdith = 1;
    
    void DrawPixel( HDC hDC )
    {
        COLORREF nColor = RGB( 0, 0, 0 );
        SetPixel( hDC, 100, 100, nColor );
    }
    
    void GetPixelColor( HDC hDC )
    {    //获取点的颜色
        COLORREF nColor = 
            GetPixel( hDC, 100, 100 );
        //获取颜色的三色值
        int nRed   = GetRValue( nColor );
        int nGreen = GetGValue( nColor );
        int nBlue  = GetBValue( nColor );
    
        CHAR szText[260] = { 0 };
        sprintf( szText, 
            "COLOR=%08X, RED=%d GREEN=%d BLUE=%d",
            nColor, nRed, nGreen, nBlue );
        MessageBox( NULL, szText, "WinDraw", MB_OK );
    }
    
    void DrawLine( HDC hDC )
    {
        MoveToEx( hDC, 0, 0, NULL );
        LineTo( hDC, 500, 500 );
        MoveToEx( hDC, 500, 0, NULL );
        LineTo( hDC, 0, 500 );
    }
    
    void DrawArc( HDC hDC )
    {    //逆时针的方式
        SetArcDirection( hDC, 
            AD_COUNTERCLOCKWISE );
        //通过外切矩形和切割线
        Arc( hDC, 400, 200, 500, 300,
            500, 200, 400, 200);
        //顺时针的方式
        SetArcDirection( hDC, 
            AD_CLOCKWISE );
        Arc( hDC, 500, 200, 600, 300,
            600, 200, 500, 200);
        
        MoveToEx( hDC, 200, 200, NULL );
        //指定圆心和角度
        AngleArc( hDC, 200, 200, 100,
            60, 240 );
        LineTo( hDC, 200, 200 );
    }
    
    void DrawPolyLine( HDC hDC )
    {
        POINT ptPolyLine[7] = { 0 };
        ptPolyLine[0].x = 100;
        ptPolyLine[0].y = 100;
        ptPolyLine[1].x = 200;
        ptPolyLine[1].y = 100;
        ptPolyLine[2].x = 200;
        ptPolyLine[2].y = 200;
        ptPolyLine[3].x = 300;
        ptPolyLine[3].y = 200;
        ptPolyLine[4].x = 300;
        ptPolyLine[4].y = 300;
        ptPolyLine[5].x = 400;
        ptPolyLine[5].y = 300;
        ptPolyLine[6].x = 400;
        ptPolyLine[6].y = 400;
    
        //Polyline( hDC, ptPolyLine, 7 );
        //PolylineTo( hDC, ptPolyLine, 3 );
    
        DWORD nGroup[] = { 4, 3 };
        PolyPolyline( hDC, ptPolyLine,nGroup, 2 );
    }
    
    void DrawBizer( HDC hDC )
    {
        POINT ptBizer[7] = { 0 };
        ptBizer[0].x = 100; //端点
        ptBizer[0].y = 100; //
        ptBizer[1].x = 100; //控制点
        ptBizer[1].y = 50;  //
        ptBizer[2].x = 300; //控制点
        ptBizer[2].y = 150; //
        ptBizer[3].x = 300; //端点
        ptBizer[3].y = 100; //
        ptBizer[4].x = 300; //控制点
        ptBizer[4].y = 400;
        ptBizer[5].x = 400; //控制点
        ptBizer[5].y = 200;
        ptBizer[6].x = 500; //端点
        ptBizer[6].y = 300;
        
        PolyBezier( hDC, ptBizer, 7 );
        MoveToEx( hDC, ptBizer[0].x, 
            ptBizer[0].y, NULL );
        LineTo( hDC, ptBizer[1].x, ptBizer[1].y );
        MoveToEx( hDC, ptBizer[3].x, 
            ptBizer[3].y, NULL );
        LineTo( hDC, ptBizer[2].x, ptBizer[2].y );
    }
    
    void DrawPolyDraw( HDC hDC )
    {
        POINT ptDraw[4] = { 0 };
        ptDraw[0].x = 100;
        ptDraw[0].y = 100;
        ptDraw[1].x = 200;
        ptDraw[1].y = 100;
        ptDraw[2].x = 200;
        ptDraw[2].y = 200;
        ptDraw[3].x = 300;
        ptDraw[3].y = 200;
    
        BYTE ptType[4] = {0};
        ptType[0] = PT_MOVETO;
        ptType[1] = PT_LINETO;
        ptType[2] = PT_MOVETO;
        ptType[3] = PT_LINETO;
    
        PolyDraw( hDC, ptDraw, ptType, 4 );
    }
    
    void DrawRect( HDC hDC )
    {    //矩形
        Rectangle( hDC, 100, 100, 200, 200 );
        //带圆角矩形
        RoundRect( hDC, 300, 100, 400, 200, 50, 50 );
    }
    
    void DrawEllipse( HDC hDC )
    {    //
        Ellipse( hDC, 100, 100, 200, 200 );
        //椭圆
        Ellipse( hDC, 300, 100, 500, 200 );
    }
    
    void DrawPie( HDC hDC )
    {
        Pie( hDC, 100, 100, 500, 400,
            500, 100, 100, 100 );
    }
    
    void DrawChord( HDC hDC )
    {
        Chord( hDC, 100, 100, 500, 400,
            500, 100, 100, 100 );
    }
    
    void DrawPloygon( HDC hDC )
    {
        POINT ptPloygon[4] = { 0 };
        ptPloygon[0].x = 100;
        ptPloygon[0].y = 100;
        ptPloygon[1].x = 200;
        ptPloygon[1].y = 100;
        ptPloygon[3].x = 600;
        ptPloygon[3].y = 300;
        ptPloygon[2].x = 500;
        ptPloygon[2].y = 300;
    
        Polygon( hDC, ptPloygon, 4 );
    }
    
    void OnPaint( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        PAINTSTRUCT ps = { 0 };
        HDC hDC = BeginPaint( hWnd, &ps );
        //创建画笔
        HPEN hPen = CreatePen( g_nPenStyle, 
            g_nPenWdith, g_nPenColor );
        //设置画笔到当前DC
        HPEN hOldPen = (HPEN)
            SelectObject( hDC, hPen );
        //绘制图形
        switch( g_nDrawType )
        {
        case ID_SETPIXEL:
            DrawPixel( hDC );
            break;
        case ID_GETPIXEL:
            GetPixelColor( hDC );
            break;
        case ID_LINE:
            DrawLine( hDC );
            break;
        case ID_ARC:
            DrawArc( hDC );
            break;
        case ID_POLYLINE:
            DrawPolyLine( hDC );
            break;
        case ID_DRAWBIZER:
            DrawBizer( hDC );
            break;
        case ID_POLYDRAW:
            DrawPolyDraw( hDC );
            break;
        case ID_RECT:
            DrawRect( hDC );
            break;
        case ID_ELLIPSE:
            DrawEllipse( hDC );
            break;
        case ID_PIE:
            DrawPie( hDC );
            break;
        case ID_CHORD:
            DrawChord( hDC );
            break;
        case ID_POLYGON:
            DrawPloygon( hDC );
            break;
        }
        //取出画笔
        SelectObject( hDC, hOldPen );
        //销毁画笔
        DeleteObject( hPen );
    
        EndPaint( hWnd, &ps );
    }
    
    void OnCommand( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        int nCmdID = LOWORD( wParam );
        switch( nCmdID )
        {
        case ID_SETPIXEL:
        case ID_GETPIXEL:
        case ID_LINE:
        case ID_ARC:
        case ID_POLYLINE:
        case ID_DRAWBIZER:
        case ID_POLYDRAW:
        case ID_RECT:
        case ID_ELLIPSE:
        case ID_PIE:
        case ID_CHORD:
        case ID_POLYGON:
            //保存绘制图形类型
            g_nDrawType = nCmdID;
            //刷新窗口
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_REDPEN:
            //保存画笔颜色
            g_nPenColor = RGB( 255, 0, 0 );
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_PSDASH:
            g_nPenStyle = PS_DASH;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_PEN5:
            g_nPenWdith = 5;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_PEN1:
            g_nPenWdith = 1;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_EXIT:
            PostQuitMessage( 0 );
            break;
        }
    }
    
    LRESULT CALLBACK WndProc( HWND   hWnd, 
                              UINT   nMsg,
                              WPARAM wParam,
                              LPARAM lParam )
    {
        switch( nMsg )
        {
        case WM_PAINT:
            OnPaint( hWnd, nMsg, wParam, lParam );
            break;
        case WM_COMMAND:
            OnCommand( hWnd, nMsg, wParam, lParam );
            break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        }
        return DefWindowProc( hWnd, nMsg,
            wParam, lParam );
    }
    
    BOOL RegisterWnd( LPSTR pszClassName )
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize        = sizeof( wce );
        wce.cbClsExtra    = 0;
        wce.cbWndExtra    = 0;
        wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
        wce.hCursor       = NULL;
        wce.hIcon         = NULL;
        wce.hIconSm       = NULL;
        wce.hInstance     = g_hInst;
        wce.lpfnWndProc   = WndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName  = NULL;
        wce.style         = CS_HREDRAW|CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx( &wce );
        if( 0 ==  nAtom )
        {
            return FALSE;
        }
    
        return TRUE;
    }
    
    HWND CreateWnd( LPSTR pszClassName )
    {
        HMENU hMenu = LoadMenu( g_hInst, 
            MAKEINTRESOURCE(IDR_MAIN) );
    
        HWND hWnd = CreateWindowEx( 0,
            pszClassName, "MyWnd", 
            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, NULL, hMenu, g_hInst,
            NULL );
        return hWnd;
    }
    
    void DisplayWnd( HWND hWnd )
    {
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }
    
    void Message( )
    {
        MSG msg = { 0 };
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        g_hInst = hInstance;
        RegisterWnd( "MYWND" );
        HWND hWnd = CreateWnd( "MYWND" );
        DisplayWnd( hWnd );
        Message( );
        return 0;
    }         
      3 GDI绘图对象 - 画刷
        3.1 画刷的作用
          填充封闭图形,包括样式、颜色等。
          
        3.2 画刷的使用
          3.2.1 创建画刷
             CreateSolidBrush 创建实心画刷
             CreateHatchBrush 创建阴影线的画刷
          3.2.2 置成当前DC可以使用的画刷
             SelectObject 和画笔使用方式类似
          3.2.3 绘制图形
          3.2.4 取出画刷
             SelectObject 和画笔使用方式类似
          3.2.5 销毁画刷
             DeleteObject 和画笔使用方式类似
    // WinDraw.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "stdio.h"
    #include "resource.h"
    
    HINSTANCE g_hInst     = NULL;
    int       g_nDrawType = 0;
    COLORREF  g_nPenColor = RGB( 0, 0, 0 );
    int          g_nPenStyle = PS_SOLID;
    int       g_nPenWdith = 1;
    
    COLORREF  g_nBrushColor = RGB( 255, 255, 255 );
    int       g_nBrushStyle = 0xFFFFFFFF;
    
    void DrawPixel( HDC hDC )
    {
        COLORREF nColor = RGB( 0, 0, 0 );
        SetPixel( hDC, 100, 100, nColor );
    }
    
    void GetPixelColor( HDC hDC )
    {    //获取点的颜色
        COLORREF nColor = 
            GetPixel( hDC, 100, 100 );
        //获取颜色的三色值
        int nRed   = GetRValue( nColor );
        int nGreen = GetGValue( nColor );
        int nBlue  = GetBValue( nColor );
    
        CHAR szText[260] = { 0 };
        sprintf( szText, 
            "COLOR=%08X, RED=%d GREEN=%d BLUE=%d",
            nColor, nRed, nGreen, nBlue );
        MessageBox( NULL, szText, "WinDraw", MB_OK );
    }
    
    void DrawLine( HDC hDC )
    {
        MoveToEx( hDC, 0, 0, NULL );
        LineTo( hDC, 500, 500 );
        MoveToEx( hDC, 500, 0, NULL );
        LineTo( hDC, 0, 500 );
    }
    
    void DrawArc( HDC hDC )
    {    //逆时针的方式
        SetArcDirection( hDC, 
            AD_COUNTERCLOCKWISE );
        //通过外切矩形和切割线
        Arc( hDC, 400, 200, 500, 300,
            500, 200, 400, 200);
        //顺时针的方式
        SetArcDirection( hDC, 
            AD_CLOCKWISE );
        Arc( hDC, 500, 200, 600, 300,
            600, 200, 500, 200);
        
        MoveToEx( hDC, 200, 200, NULL );
        //指定圆心和角度
        AngleArc( hDC, 200, 200, 100,
            60, 240 );
        LineTo( hDC, 200, 200 );
    }
    
    void DrawPolyLine( HDC hDC )
    {
        POINT ptPolyLine[7] = { 0 };
        ptPolyLine[0].x = 100;
        ptPolyLine[0].y = 100;
        ptPolyLine[1].x = 200;
        ptPolyLine[1].y = 100;
        ptPolyLine[2].x = 200;
        ptPolyLine[2].y = 200;
        ptPolyLine[3].x = 300;
        ptPolyLine[3].y = 200;
        ptPolyLine[4].x = 300;
        ptPolyLine[4].y = 300;
        ptPolyLine[5].x = 400;
        ptPolyLine[5].y = 300;
        ptPolyLine[6].x = 400;
        ptPolyLine[6].y = 400;
    
        //Polyline( hDC, ptPolyLine, 7 );
        //PolylineTo( hDC, ptPolyLine, 3 );
    
        DWORD nGroup[] = { 4, 3 };
        PolyPolyline( hDC, ptPolyLine,nGroup, 2 );
    }
    
    void DrawBizer( HDC hDC )
    {
        POINT ptBizer[7] = { 0 };
        ptBizer[0].x = 100; //端点
        ptBizer[0].y = 100; //
        ptBizer[1].x = 100; //控制点
        ptBizer[1].y = 50;  //
        ptBizer[2].x = 300; //控制点
        ptBizer[2].y = 150; //
        ptBizer[3].x = 300; //端点
        ptBizer[3].y = 100; //
        ptBizer[4].x = 300; //控制点
        ptBizer[4].y = 400;
        ptBizer[5].x = 400; //控制点
        ptBizer[5].y = 200;
        ptBizer[6].x = 500; //端点
        ptBizer[6].y = 300;
        
        PolyBezier( hDC, ptBizer, 7 );
        MoveToEx( hDC, ptBizer[0].x, 
            ptBizer[0].y, NULL );
        LineTo( hDC, ptBizer[1].x, ptBizer[1].y );
        MoveToEx( hDC, ptBizer[3].x, 
            ptBizer[3].y, NULL );
        LineTo( hDC, ptBizer[2].x, ptBizer[2].y );
    }
    
    void DrawPolyDraw( HDC hDC )
    {
        POINT ptDraw[4] = { 0 };
        ptDraw[0].x = 100;
        ptDraw[0].y = 100;
        ptDraw[1].x = 200;
        ptDraw[1].y = 100;
        ptDraw[2].x = 200;
        ptDraw[2].y = 200;
        ptDraw[3].x = 300;
        ptDraw[3].y = 200;
    
        BYTE ptType[4] = {0};
        ptType[0] = PT_MOVETO;
        ptType[1] = PT_LINETO;
        ptType[2] = PT_MOVETO;
        ptType[3] = PT_LINETO;
    
        PolyDraw( hDC, ptDraw, ptType, 4 );
    }
    
    void DrawRect( HDC hDC )
    {    //矩形
        Rectangle( hDC, 100, 100, 200, 200 );
        //带圆角矩形
        RoundRect( hDC, 300, 100, 400, 200, 50, 50 );
    }
    
    void DrawEllipse( HDC hDC )
    {    //
        Ellipse( hDC, 100, 100, 200, 200 );
        //椭圆
        Ellipse( hDC, 300, 100, 500, 200 );
    }
    
    void DrawPie( HDC hDC )
    {
        Pie( hDC, 100, 100, 500, 400,
            500, 100, 100, 100 );
    }
    
    void DrawChord( HDC hDC )
    {
        Chord( hDC, 100, 100, 500, 400,
            500, 100, 100, 100 );
    }
    
    void DrawPloygon( HDC hDC )
    {
        POINT ptPloygon[4] = { 0 };
        ptPloygon[0].x = 100;
        ptPloygon[0].y = 100;
        ptPloygon[1].x = 200;
        ptPloygon[1].y = 100;
        ptPloygon[3].x = 600;
        ptPloygon[3].y = 300;
        ptPloygon[2].x = 500;
        ptPloygon[2].y = 300;
    
        Polygon( hDC, ptPloygon, 4 );
    }
    
    void OnPaint( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        PAINTSTRUCT ps = { 0 };
        HDC hDC = BeginPaint( hWnd, &ps );
        //创建画笔
        HPEN hPen = CreatePen( g_nPenStyle, 
            g_nPenWdith, g_nPenColor );
        //设置画笔到当前DC
        HPEN hOldPen = (HPEN)
            SelectObject( hDC, hPen );
        //创建画刷
        HBRUSH hBrush = NULL;
        if( g_nBrushStyle == 0xFFFFFFFF )
        {
            hBrush = CreateSolidBrush( g_nBrushColor );
        }
        else
        {
            hBrush = CreateHatchBrush( 
                g_nBrushStyle, g_nBrushColor );    
        }
        //设置画刷到当前DC
        HBRUSH hOldBrush = (HBRUSH)
            SelectObject( hDC, hBrush );
        //绘制图形
        switch( g_nDrawType )
        {
        case ID_SETPIXEL:
            DrawPixel( hDC );
            break;
        case ID_GETPIXEL:
            GetPixelColor( hDC );
            break;
        case ID_LINE:
            DrawLine( hDC );
            break;
        case ID_ARC:
            DrawArc( hDC );
            break;
        case ID_POLYLINE:
            DrawPolyLine( hDC );
            break;
        case ID_DRAWBIZER:
            DrawBizer( hDC );
            break;
        case ID_POLYDRAW:
            DrawPolyDraw( hDC );
            break;
        case ID_RECT:
            DrawRect( hDC );
            break;
        case ID_ELLIPSE:
            DrawEllipse( hDC );
            break;
        case ID_PIE:
            DrawPie( hDC );
            break;
        case ID_CHORD:
            DrawChord( hDC );
            break;
        case ID_POLYGON:
            DrawPloygon( hDC );
            break;
        }
        //取出画刷
        SelectObject( hDC, hOldBrush );
        //删除画刷
        DeleteObject( hBrush );
        //取出画笔
        SelectObject( hDC, hOldPen );
        //销毁画笔
        DeleteObject( hPen );
    
        EndPaint( hWnd, &ps );
    }
    
    void OnCommand( HWND hWnd, UINT nMsg,
         WPARAM wParam, LPARAM lParam )
    {
        int nCmdID = LOWORD( wParam );
        switch( nCmdID )
        {
        case ID_SETPIXEL:
        case ID_GETPIXEL:
        case ID_LINE:
        case ID_ARC:
        case ID_POLYLINE:
        case ID_DRAWBIZER:
        case ID_POLYDRAW:
        case ID_RECT:
        case ID_ELLIPSE:
        case ID_PIE:
        case ID_CHORD:
        case ID_POLYGON:
            //保存绘制图形类型
            g_nDrawType = nCmdID;
            //刷新窗口
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_REDPEN:
            //保存画笔颜色
            g_nPenColor = RGB( 255, 0, 0 );
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_PSDASH:
            g_nPenStyle = PS_DASH;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_PEN5:
            g_nPenWdith = 5;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_PEN1:
            g_nPenWdith = 1;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_REDBRUSH:
            g_nBrushColor = RGB( 255, 0, 0 );
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_SOLIDBRUSH:
            g_nBrushStyle = 0xFFFFFFFF;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_HSDIAGCROSS:
            g_nBrushStyle = HS_DIAGCROSS;
            InvalidateRect( hWnd, NULL, TRUE );
            break;
        case ID_EXIT:
            PostQuitMessage( 0 );
            break;
        }
    }
    
    LRESULT CALLBACK WndProc( HWND   hWnd, 
                              UINT   nMsg,
                              WPARAM wParam,
                              LPARAM lParam )
    {
        switch( nMsg )
        {
        case WM_PAINT:
            OnPaint( hWnd, nMsg, wParam, lParam );
            break;
        case WM_COMMAND:
            OnCommand( hWnd, nMsg, wParam, lParam );
            break;
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;
        }
        return DefWindowProc( hWnd, nMsg,
            wParam, lParam );
    }
    
    BOOL RegisterWnd( LPSTR pszClassName )
    {
        WNDCLASSEX wce = { 0 };
        wce.cbSize        = sizeof( wce );
        wce.cbClsExtra    = 0;
        wce.cbWndExtra    = 0;
        wce.hbrBackground = HBRUSH(COLOR_BTNFACE+1);
        wce.hCursor       = NULL;
        wce.hIcon         = NULL;
        wce.hIconSm       = NULL;
        wce.hInstance     = g_hInst;
        wce.lpfnWndProc   = WndProc;
        wce.lpszClassName = pszClassName;
        wce.lpszMenuName  = NULL;
        wce.style         = CS_HREDRAW|CS_VREDRAW;
    
        ATOM nAtom = RegisterClassEx( &wce );
        if( 0 ==  nAtom )
        {
            return FALSE;
        }
    
        return TRUE;
    }
    
    HWND CreateWnd( LPSTR pszClassName )
    {
        HMENU hMenu = LoadMenu( g_hInst, 
            MAKEINTRESOURCE(IDR_MAIN) );
    
        HWND hWnd = CreateWindowEx( 0,
            pszClassName, "MyWnd", 
            WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, NULL, hMenu, g_hInst,
            NULL );
        return hWnd;
    }
    
    void DisplayWnd( HWND hWnd )
    {
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    }
    
    void Message( )
    {
        MSG msg = { 0 };
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
        g_hInst = hInstance;
        RegisterWnd( "MYWND" );
        HWND hWnd = CreateWnd( "MYWND" );
        DisplayWnd( hWnd );
        Message( );
        return 0;
    }
  • 相关阅读:
    async await 了解
    vi 命令
    mysql 相关操作
    mac下配置python的虚拟环境virtualenv和虚拟环境管理包virtualenvwrapper
    ip 域名 和端口号
    脱离 flask 上下文,使用 jinja2 来动态渲染模板
    使用 vue-cli 3.0 创建项目
    p 标签和 span 标签
    el-table 更改表格行高和列髋
    使用 axios 传参问题
  • 原文地址:https://www.cnblogs.com/tangzhengyue/p/2639124.html
Copyright © 2011-2022 走看看