博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Win32编程day07 学习笔记
阅读量:5897 次
发布时间:2019-06-19

本文共 34168 字,大约阅读时间需要 113 分钟。

一 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;}

 

转载于:https://www.cnblogs.com/tangzhengyue/archive/2012/08/15/2639124.html

你可能感兴趣的文章
影响英语单词拼写的6大因素
查看>>
计算机硬件基础知识
查看>>
SQLServer删除/重建/禁用/启用外键约束
查看>>
Unity3D播放视频
查看>>
[hadoop实战3]Hbase安装
查看>>
CNN卷积核反传分析
查看>>
python刷取CSDN博文访问量之三
查看>>
shell if
查看>>
利用PDO导入导出数据库
查看>>
CentOS 6.5 部署redmine 2.42
查看>>
DDR3
查看>>
分支 统计字数
查看>>
艾级计算机的发展与挑战
查看>>
我的友情链接
查看>>
java.lang.ArrayIndexOutOfBoundsException: 100
查看>>
RocketMQ事务消息实战
查看>>
mysql-mmm-2.2.1安装手册
查看>>
奥运主题游戏《阿翔 跨栏》已经发布成功
查看>>
bzoj 1070: [SCOI2007]修车
查看>>
搭建yum源服务器
查看>>