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