Win32-Windows绘制


相关代码

// 颜色点的绘制和获取

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

--------------------------------------------------------------------------------

直线和弧的绘制

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

--------------------------------------------------------------------------------

折线的绘制

// 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[3] = { 0 };
	ptPolyLine[0].x = 100;
	ptPolyLine[0].y = 100;
	ptPolyLine[1].x = 200;
	ptPolyLine[1].y = 100;
	ptPolyLine[2].x = 100;
	ptPolyLine[2].y = 200;
	Polyline( hDC, ptPolyLine, 3 );
	PolylineTo( hDC, ptPolyLine, 3 );
}

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

	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:
		//保存绘制图形类型
		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;
}

--------------------------------------------------------------------------------

Bizer曲线绘制

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

	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:
		//保存绘制图形类型
		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;
}

--------------------------------------------------------------------------------

矩形-椭圆-圆-饼绘制

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

--------------------------------------------------------------------------------

弦和多边形绘制-画笔

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

--------------------------------------------------------------------------------

画刷

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

效果展示