點的繪制和擷取
繪制: COLORREF SetPixel(
HDC hdc, //DC句柄
int X, //x坐标
int Y, //y坐标
COLORREF crColor ); // 點的顔色
擷取: COLORREF GetPixel(
HDC hdc, //DC句柄
int XPos, //x坐标
int nYPos ); //y坐标
傳回指定坐标位置的點的顔色
直線的繪制
MoveToEx 移動目前點到指定位置
LineTo 從目前點繪制直線到指定位置
弧的繪制
Arc和AngleArc提供不同的繪制弧的方式:
BOOL Arc( HDC hdc,
int nLeftRect, // 外切矩形的坐标
int nTopRect,//外切矩形的坐标
int nRightRect,//外切矩形的坐标
int nBottomRect,//外切矩形的坐标
int nXStartArc,//起始切割半徑的X坐标
int nYStartArc,//起始切割半徑的Y坐标
int nXEndArc, //終止切割半徑的X坐标
int nYEndArc ); //終止切割半徑的X坐标
可以使用SetArcDirection函數,設定Arc函數
切割方向:順時針和逆時針.
BOOL AngleArc(
HDC hdc, // handle to device context
int X, //圓心的X坐标
int Y, //圓心的Y坐标
DWORD dwRadius,//圓的半徑
FLOAT eStartAngle,//開始角度
FLOAT eSweepAngle );//夾角
折線
BOOL Polyline(
HDC hdc, //DC句柄
CONST POINT *lppt,//Polyline頂點的坐标數組
int cPoints ); //頂點數組的長度
PolylineTo 與Polyline類似, 隻是在
繪制Polyline前,從目前點使用LineTo繪
制直線到Polyline的第一個頂點.
繪制多組折線 PolyPolyline
BOOL PolyPolyline( HDC hdc,
CONST POINT *lppt,//所有點的數組
CONST DWORD *lpdwPolyPoints,//每組點的數量
DWORD cCount );//分組的數量
例如:
DWORD nGroup[] = { 4, 3 };
PolyPolyline( hDC, ptPolyLine,nGroup, 2 );
Bizer曲線
BOOL PolyBezier(HDC hdc,
CONST POINT *lppt,//點數組,最少4個點
DWORD cPoints );//點的數量
4個點: 1和4是端點,2.3點是控制點
7個點: 1.4.7是端點,其餘是控制點
多樣式的線條
BOOL PolyDraw( HDC hdc,
CONST POINT *lppt,//各個點的數組
CONST BYTE *lpbTypes, //從某點到下一點的繪制方式 pointer to line and curve identifiers
int cCount); //點的數量
lpbTypes - PT_MOVETO 移動到該點
PT_LINETO 繪直線
PT_BIZERTO Biezer曲線
矩形的繪制
普通矩形 Rectangle
帶圓角的矩形
BOOL RoundRect( HDC hdc,
int nLeftRect, //左上X坐标
int nTopRect, //左上Y坐标
int nRightRect,//右下X坐标
int nBottomRect, //右下Y坐标
int nWidth, //生成圓角的橢圓的寬度
int nHeight );//生成圓角的橢圓的高度
橢圓和圓
BOOL Ellipse( HDC hdc,
int nLeftRect, //外切矩形左上X坐标
int nTopRect,//外切矩形左上Y坐标
int nRightRect, //外切矩形右下X坐标
int nBottomRect); //外切矩形右下Y坐标
餅Pie
BOOL Pie( HDC hdc,
int nLeftRect, //外切矩形左上X坐标
int nTopRect, //外切矩形左上Y坐标
int nRightRect, //外切矩形右下X坐标
int nBottomRect, //外切矩形右下Y坐标
int nXRadial1,//切割起始半徑X坐标
int nYRadial1,//切割起始半徑Y坐标
int nXRadial2,//切割終止半徑X坐标
int nYRadial2 );//切割終止半徑Y坐标
弦
BOOL Chord( HDC hdc,
int nLeftRect, //外切矩形左上X坐标
int nTopRect, //外切矩形左上Y坐标
int nRightRect, //外切矩形右下X坐标
int nBottomRect, //外切矩形右下Y坐标
int nXRadial1,//切割起始半徑X坐标
int nYRadial1,//切割起始半徑Y坐标
int nXRadial2,//切割終止半徑X坐标
int nYRadial2 );//切割終止半徑Y坐标
多邊形
BOOL Polygon( HDC hdc,
CONST POINT *lpPoints, //多邊形的頂點
int nCount ); //頂點的數量
PolyPolygon 可以繪制多組多邊形
GDI繪圖對象 - 畫筆
2.1 畫筆的作用
可以控制線條的顔色、樣式、寬度。
2.2 畫筆的使用
2.2.1 建立畫筆 CreatePen
HPEN CreatePen(
int fnPenStyle, //畫筆的樣式
int nWidth, //畫筆的寬度
COLORREF crColor);//畫筆的顔色
2.2.2 置成目前DC可以使用的畫筆
HGDIOBJ SelectObject(
HDC hdc, // 目前DC的句柄
HGDIOBJ hgdiobj );//要使用的GDI對象句柄
傳回目前DC原來使用的同類型的GDI對象句柄。
2.2.3 繪制圖形
2.2.4 從目前DC中取出畫筆,即将舊畫筆
放入目前DC中
SelectObject( hDC, hOldPen );
2.2.5 銷毀畫筆
DeleteObject( hPen );
畫筆使用時,由于繪圖資源有限,一定要
注意釋放。
GDI繪圖對象 - 畫刷
3.1 畫刷的作用
填充封閉圖形,包括樣式、顔色等。
3.2 畫刷的使用
3.2.1 建立畫刷
CreateSolidBrush 建立實心畫刷
CreateHatchBrush 建立陰影線的畫刷
3.2.2 置成目前DC可以使用的畫刷
SelectObject 和畫筆使用方式類似
3.2.3 繪制圖形
3.2.4 取出畫刷
SelectObject 和畫筆使用方式類似
3.2.5 銷毀畫刷
DeleteObject 和畫筆使用方式類似
GDI繪圖對象 - 位圖
1 位圖 - 通過儲存圖像上每個點的顔色,生成相應
的位圖檔案。
光栅圖 - 可以了解為圖像點陣的儲存
矢量圖 - 可以了解為繪圖指令的儲存
2 位圖資源的使用
2.1 加載位圖資源
HBITMAP LoadBitmap(
HINSTANCE hInstance, //位圖資源所在應用程式句柄
LPCTSTR lpBitmapName ); //位圖資源ID字元串
傳回位圖句柄HBITMAP
2.2 建立放置位圖的DC
HDC CreateCompatibleDC( HDC hDC );
建立一個和指定的hDC相比對的DC(DC中
包含資訊一緻)
2.3 将位圖放入建立的DC中
SelectObject
2.4 繪制位圖到目前DC中
BOOL BitBlt(
HDC hdcDest, //繪制的目的DC句柄
int nXDest, //繪制的目的左上x坐标
int nYDest, //繪制的目的左上y坐标
int nWidth, //繪制的目的寬
int nHeight, //繪制的目的高
HDC hdcSrc, //需要繪制的DC句柄
int nXSrc, //需要繪制的原圖的起始X坐标
int nYSrc, //需要繪制的原圖的起始y坐标
DWORD dwRop); //繪圖方式
BOOL StretchBlt(
HDC hdcDest, //繪制的目的DC句柄
int nXOriginDest,//繪制的目的左上x坐标
int nYOriginDest, //繪制的目的左上y坐标
int nWidthDest,//繪制的目的寬
int nHeightDest, //繪制的目的高
HDC hdcSrc, //需要繪制的DC句柄
int nXOriginSrc,//需要繪制的原圖的起始X坐标
int nYOriginSrc,//需要繪制的原圖的起始y坐标
int nWidthSrc,//需要繪制的原圖的寬
int nHeightSrc,//需要繪制的原圖的高
DWORD dwRop ); //繪圖方式
2.5 取出位圖
SelectObject
2.6 删除建立的DC
DeleteDC
2.7 删除位圖
DeleteObject
2.8 擷取位圖資訊
int GetObject(
HGDIOBJ hgdiobj,//GDI對象句柄,這裡就是HBITMAP
int cbBuffer,//位圖資訊的BUFF的大小
LPVOID lpvObject ); //位圖資訊的BUFF指針
位圖的BUFF類型為 BITMAP 結構
文字和字型
1 文字的繪制
1.1 TextOut
1.2 DrawText
int DrawText(
HDC hDC,//DC句柄
LPCTSTR lpString, //字元串
int nCount,//字元串長度
LPRECT lpRect,//繪制字元串的矩形區域
UINT uFormat ); //繪制方式
DT_CENTER - 水準居中
DT_VCENTER - 垂直居中
DT_SINGLELINE - 單行顯示不換行
DT_NOCLIP - 超出矩形框不剪切
DT_WORDBREAK - 換行
1.3 ExtTextOut
繪制字元時,可以設定字元間距.
對于漢字字元,由于一個字元占2個位元組,
是以漢字字元之間的間距應該為0;
CHAR szText2[12] = "E你xtTex好";
INT nText[10] = { 30, 0, 30, 30, 30,
30, 30, 30, 0, 10 };
ExtTextOut( hDC, 100, 300, ETO_OPAQUE,
NULL, szText2, strlen(szText2), nText );
1.4 字元繪制的相關屬性
SetTextColor 設定字元的顔色
SetBkColor 設定背景色
SetBkMode 繪制的方式
2 字型的使用
2.1 建立字型
HFONT CreateFont(
int nHeight, //字型邏輯高
int nWidth, //字型邏輯寬度
int nEscapement, //切斜度
int nOrientation,//旋轉
int fnWeight,//加粗
DWORD fdwItalic,//斜體
DWORD fdwUnderline,//下劃線
DWORD fdwStrikeOut,//删除線
DWORD fdwCharSet,//字元集
DWORD fdwOutputPrecision, //輸出
DWORD fdwClipPrecision, //剪切
DWORD fdwQuality, //輸出品質
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace ); //字型名稱
2.2 設定字型
SelectObject
2.3 繪圖
2.4 取出字型
SelectObject
2.5 删除字型
DeleteObject
2.6 建立字型常使用TrueType字型.
上述繪圖方法有很多簡單重複的地方,是以我隻寫了幾個有代表性的代碼示例:
//擷取客戶區DC
CDC* pClientDC = GetDC();
/點/
//繪制點
pClientDC->SetPixel(10, 20, RGB(255, 0, 0));
//得到點的顔色
COLORREF clPixel = pClientDC->GetPixel(10, 20);
/線/
//繪制線
pClientDC->MoveTo(0, 0);
pClientDC->LineTo(100, 100);
/矩形/畫刷的使用
//建立畫刷
CBrush brs;
brs.CreateHatchBrush(HS_CROSS,RGB(0,255,0));//++類型,綠色畫刷
//載入畫刷
CBrush* pOldBrs = pClientDC->SelectObject(&brs);
//繪制矩形
pClientDC->Rectangle(50, 50, 100, 100);
//載出畫刷
pClientDC->SelectObject(pOldBrs);
//删除畫刷
brs.DeleteObject();
///位圖的使用///
//建立位圖
CBitmap bmpCar;
bmpCar.LoadBitmapW(IDB_BMP_CAR);
//建立記憶體DC
CDC MemClientDC;
MemClientDC.CreateCompatibleDC(pClientDC);
//位圖加載到記憶體DC上
MemClientDC.SelectObject(bmpCar);
//将記憶體DC繪制到客戶區
pClientDC->BitBlt(0, 0, 400, 200, &MemClientDC, 0, 0, SRCCOPY);
//删除記憶體DC和位圖
MemClientDC.DeleteDC();
bmpCar.DeleteObject();
//字型的繪制
//建立字型
CFont font;
font.CreatePointFont(200, _T("宋體"));
//載入字型
CFont* pOldFont;
pOldFont = pClientDC->SelectObject(&font);
//繪制字
pClientDC->TextOutW(450, 50, _T("你好"));
//載出字型
pClientDC->SelectObject(pOldFont);
//删除字型
font.DeleteObject();
ReleaseDC(pClientDC);