Windows繪圖

1、圖形繪製

——1.1圖形繪製的方式

獲取到繪圖句柄—設備描述表(DC),使用相應的繪圖的API,在設備上繪製圖形。

——1.2顏色

RGB三色,每種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繪製直線到指定位置

——1.5圓弧的繪製

BOOL AngleArc(
HDC hdc,//設備上下文句柄
int X,//圓心的x座標
int Y,//圓心的Y座標
DWORD dwRadius,//圓的半徑
FLOAT eStartAngle,//開始角度
FLOAT eSweepAngle);//夾角

BOOL Arc(HDC hdc,
int nLeftRect,//外切矩形的座標
int nTopRect,//外切矩形的座標
int nRightRect,//外切矩形的座標
int nBottomRect,//外切矩形的座標
int nXStartRect,//起始切割半徑的X座標
int nYStartArc,//起始切割半徑的Y座標
int nXEndArc,//終止切割半徑的X座標
int nYEndArc)終止切割半徑的Y座標

可以使用SetArcDirection函數,設置Arc函數切割方向:順時針或者逆時針
SetArcDirection( hDC,AD_COUNTERCLOCKWISE );//逆時針
SetArcDirection( hDC,AD_CLOCKWISE );//順時針

——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.7Bizer曲線
BOOL PolyBezier(HDC hdc,
CONST POINT *lppt,//點數組,最少四個點
DWORD cPoints);//點的數量
4個點:1和4是斷點,2、3是控制點
7個點:1、4、7是端點,其餘是控制點
1.8多樣式的線條
BOOL PolyDraw(HDC hdc,
CONST POINT *lppt,//各個點的數組
CONST BYTE *lpbTypes,//從某點到下一點的繪製方式
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 nBottom,//外切矩形右下Y座標
int nXRadial1,//切割起始半徑X座標
int nYRadial1,//切割起始半徑Y座標
int nXRadial2,//切割終止半徑X座標
int nYRadial2)//切割終止半徑Y座標
1.12 弦
BOOL Chord(
HDC hdc,
int nLeftRect,//外切矩形左上X座標
int nTopRect,//外切矩形左上Y座標
int nRightRect,//外切矩形右下X座標
int nBottom,//外切矩形右下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中取出畫筆
  SelectObject(hDC,hOldPen);
 2.2.5銷燬畫筆
  DeleteObject(hPen);
  畫筆使用時,由於繪圖資源有限,一定要注意釋放

3 GDI繪圖對象——畫刷

3.1畫刷的作用
 填充封閉圖形,包括樣式、顏色等。
3.2畫刷的使用
 3.2.1 創建畫刷
 CreateSolidBrush 創建實心畫刷
 CreateHatchBrush 創建陰影線的畫刷
void OnCommand( HWND hWnd, UINT nMsg,
     WPARAM wParam, LPARAM lParam )
{
    int nCmdID = LOWORD( wParam );
    switch( nCmdID )
    {
    ......
        case ID_REDBRUSH:
        g_nBrushColor = RGB( 255, 0, 0 );//用g_nBrushColor保存畫刷顏色
        InvalidateRect( hWnd, NULL, TRUE );//刷新當前窗口
        break;
    case ID_SOLIDBRUSH:
        g_nBrushStyle = 0xFFFFFFFF;
        InvalidateRect( hWnd, NULL, TRUE );
        break;
        ......
    }
COLORREF  g_nBrushColor = RGB( 255, 255, 255 );//聲明全局變量畫刷顏色默認爲白色
在OnPaint函數中實現畫刷的創建和使用
//創建畫刷
    HBRUSH hBrush = NULL;
    if( g_nBrushStyle == 0xFFFFFFFF )
    {
        hBrush = CreateSolidBrush( g_nBrushColor );
    }
    else
    {
        hBrush = CreateHatchBrush( 
            g_nBrushStyle, g_nBrushColor ); 
    }
 3.2.2 置成當前DC可以使用的畫刷
 HBRUSH hOldBrush = (HBRUSH)SelectObject( hDC, hBrush );
 3.2.3繪製圖形
 3.2.4取出畫刷
 SelectObject( hDC, hOldBrush );
 3.2.5銷燬畫刷
 DeleteObject( hBrush );

新建一個簡單的win32程序,添加窗口程序
新建資源腳本,添加菜單資源
在文件視圖中添加“resource.h”文件

點和直線的繪製
#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 );  //第一句(窗口句柄,結構指針),返回窗口客戶區DC句柄
    //繪製圖形
    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;
}
#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;
}
#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;
}
#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章