一、獲得繪圖的視窗控制代碼
方法(詳細參數及其調用可以看考MSDN):
1、 HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2、 HWND WindowFromPoint(POINT& Point)
3、 BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
二、由視窗控制代碼得到裝置環境控制代碼HDC
方法:BeginPaint、GetWindowDC、GetDC。這些函數都需要步驟一中的HWND的控制代碼。調用這些函數後要釋放控制代碼,相應的有EndPaint、ReleaseDC進行清理。
1、 採用BeginPaint擷取HDC
HDC hdc;
PAINTSTRUCT ps;// 儲存
hdc = ::BeginPaint( hwnd, &ps );
// 此處添加繪圖代碼
::EndPaint( hwnd, &ps );
說明:獲得的hdc的有效地區僅限於客戶區無效地區的裝置環境控制代碼,不包括標題列、邊框等。
2、 採用GetWindowDC擷取HDC
HDC hdc = ::GetWindowDC( hwnd );
// 此處添加繪圖代碼
::ReleaseDC( hwnd, hdc );
說明:繪製地區是整個視窗(邊框、標題列、客戶區的總和)。
3、 採用GetDC擷取HDC
HDC hdc = ::GetDC( hwnd );
// 此處添加繪圖代碼
::ReleaseDC( hwnd, hdc );
說明:獲得的hdc的有效地區僅限於客戶區有效地區的裝置環境控制代碼,不包括標題列、邊框等。
三、圖形繪製方法
1、 畫筆CreatePen
繪畫之前先選擇畫筆,畫筆的功能主要是繪製邊框,其函數原型如下:
WINGDIAPI HPEN WINAPI CreatePen(
__in int iStyle, // 畫筆的類型,比如是實線,還是虛線等等。
__in int cWidth, // 線的寬度。
__in COLORREF color // 線的顏色。
);
// iStyle參數可選值:
PS_SOLID = 0;// 實線
PS_DASH = 1;// 段線; 要求筆寬<=1
PS_DOT = 2;// 點線; 要求筆寬<=1
PS_DASHDOT = 3;// 線、點; 要求筆寬<=1
PS_DASHDOTDOT = 4;// 線、點、點; 要求筆寬<=1
PS_NULL = 5;// 不可見
PS_INSIDEFRAME = 6;// 實線; 但筆寬是向裡擴充
傳回值為畫筆類型,SelectObject函數選中。選中後,返回原來畫刷的控制代碼用來恢複時使用。圖形繪製完畢後使用DeleteObject函數將其釋放。
SelectObject函數說明:
函數功能:該函數選擇一對象到指定的裝置上下文環境中,該新對象替換先前的相同類型的對象。
函數原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
參數:
hdc:裝置上下文環境的控制代碼。
hgdiobj:被選擇的對象的句型,該指定對象必須由如下的函數建立。
位元影像:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有記憶體裝置上下文環境可選擇位元影像,並且在同一時刻只能一個裝置上下文環境選擇位元影像)。
畫筆:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。
字型:CreateFont, CreateFontIndirect。
筆:CreatePen, CreatePenIndirect。
地區:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。
傳回值:如果選擇對象不是地區並且函數執行成功,那麼傳回值是被取代的對象的控制代碼;如果選擇對象是地區並且函數執行成功,返回如下一值;
DeleteObject函數說明:
函數功能:該函數刪除一個邏輯筆、畫筆、字型、位元影像、地區或者調色盤,釋放所有與該對象有關的系統資源,在對象被刪除之後,指定的控制代碼也就失效了。
函數原型:BOOL DeleteObject(HGDIOBJ hObject);
參數:
hObject:邏輯筆、畫筆、字型、位元影像、地區或者調色盤的控制代碼。
傳回值:成功,返回非零值;如果指定的控制代碼無效或者它已被選入裝置上下文環境,則傳回值為零。
2、 畫刷
畫刷的功能主要是填充地區內的顏色,建立畫刷的方法如下:
A、CreateSolidBrush函數
函數功能:該函數建立一個具有指定顏色的邏輯刷子。
函數原理:HBRUSH CreateSolidBrush(COLORREF crColor);
參數:
crColor:指定刷子的顏色。
傳回值:如果該函數執行成功,那麼傳回值標識一個邏輯實心刷子;如果函數失敗,那麼傳回值為NULL。
B、GetStockObject函數
函數功能:該函數檢索預定義的備用筆、刷子、字型或者調色盤的控制代碼。
函數原型:HGDIOBJ GetStockObject(int fnObject);
參數:
fnObject:指定對象的類型,該參數可取如下值之一;
BLACK_BRUSH:黑色畫筆;
DKGRAY_BRUSH:暗灰色畫筆;
DC_BRUSH:在Windows98,Windows NT 5.0和以後版本中為純顏色畫筆,預設色為白色,可以用SetDCBrushColor函數改變顏色,更多的資訊參見以下的注釋部分。
GRAY_BRUSH:灰色畫筆;
HOLLOW_BRUSH:空畫筆(相當於HOLLOW_BRUSH);
LTGRAY_BRUSH:亮灰色畫筆;
NULL_BRUSH:空畫筆(相當於HOLLOW_BRUSH);
WHITE_BRUSH:白色畫筆;BLACK_PEN:黑色鋼筆;
DC_PEN:在Windows98、Windows NT 5.0和以後版本中為純色鋼筆,預設色為白色,使用SetDCPenColor函數可以改變色彩,更多的資訊,參見下面的注釋部分。
WHITE_PEN:白色鋼筆;
ANSI_FIXED_FONT:在Windows中為固定間距(等寬)系統字型;
ANSI_VAR_FONT:在Windows中為變間距(比例間距)系統字型;
DEVICE_DEFAUCT_FONT:在WindowsNT中為裝置相關字型;
DEFAULT_GUI_FONT:使用介面物件預設字型,如菜單和對話方塊;
OEM_FIXED_FONT:原始裝置製造商(OEM)相關固定間距(等寬)字型;
SYSTEM_FONT:系統字型,在預設情況下,系統使用系統字型繪製菜單,對話方塊控制和文本;
SYSTEM_FIXED_FONT:固定間距(等寬)系統字型,該對象僅提供給相容16位Windows版本;
DEFAULT_PALETTE:預設調色盤,該調色盤由系統調色盤中的靜態色彩組成。
傳回值:如果成功,傳回值標識聲請的邏輯對象,如果失敗,傳回值為NULL。
C、CreateHatchBrush函數
函數功能:該函數可以建立一個具有指定陰影模式和顏色的邏輯刷子。
函數原型:HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);
參數:
fnStyle:指定刷子的陰影樣式。該參數可以取下列值,這些值的含義為:
HS_BDIAGONAL:表示45度向下,從左至右的陰影;
HS_CROSS:水平和垂直交叉險影;
HS_DIAGCROSS:45度交叉陰影;
HS_FDIAGONAL:45度向上,自左至右陰影;
HS_HORIZONTAL:水平陰影;
HS_VERTICAL:垂直陰影。
cirref:指定用於陰影的刷子的前景色彩。
傳回值:如果函數執行成功,那麼傳回值標識為邏輯刷子;如果函數執行失敗,那麼傳回值為NULL。
畫刷的選中和釋放,請參照畫筆。
3、 點SetPixel
函數功能:該函數將指定座標處的像素設為指定的顏色。
函數原型:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
參數:
hdc:裝置環境控制代碼。
X:指定要設定的點的X軸座標,按邏輯單位表示座標。
Y:指定要設定的點的Y軸座標,按邏輯單位表示座標。
crColor:指定要用來繪製該點的顏色。
傳回值:如果函數執行成功,那麼傳回值就是函數設定像素的RGB顏色值。這個值可能與crColor指定的顏我色有不同,之所以有時發生這種情況是因為沒有找到對指定顏色進行真正匹配造成的;如果函數失敗,那麼傳回值是C1。
4、 直線MoveToEx、LineTo
A、 MoveToEx
函數功能:將當前位置指定為特定的某一點
函數原型:BOOL MoveToEx( __in HDC hdc, __in int X, __in int Y, __out LPPoint lpPoint )
參數:
hdc:裝置環境控制代碼。
X:指定要設定的點的X軸座標,按邏輯單位表示座標。
Y:指定要設定的點的Y軸座標,按邏輯單位表示座標。
lpPoint:指向一個POINT結構,用來接收前一位置,為空白時,當前位置不被返回。
傳回值:執行成功返回非零,否則傳回值為零。
B、 LineTo
函數功能:從當前點到目標點進行畫線。
函數原型:BOOL LineTo( int x, int y )
參數說明:
X:目標點的橫座標。
Y:目標點的縱座標。
傳回值:成功非零,其它返回零。
5、 矩形Rectangle
函數功能:該函數畫一個矩形,用當前的畫筆畫矩形輪廓,用當前畫刷進行填充。
函數原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
參數:
hdc:裝置環境控制代碼。
nLeftRect:指定矩形左上方的邏輯X座標。
nTopRect:指定矩形左上方的邏輯Y座標。
nRightRect:指定矩形右下角的邏輯X座標。
nBottomRect:指定矩形右下角的邏輯Y座標。
傳回值:如果函數調用成功,傳回值非零,否則傳回值為0。
6、 橢圓Ellipse
函數功能:該函數畫一個橢圓形,用當前的畫筆畫矩形輪廓,用當前畫刷進行填充。
函數原型:BOOL Ellipse( HDC hdc, int x1, int y1, int x2, int y2 )
參數:
hdc:裝置環境控制代碼。
x1:指定橢圓形左上方的邏輯X座標。
y1:指定橢圓形左上方的邏輯Y座標。
x2:指定橢圓形右下角的邏輯X座標。
y2:指定橢圓形右下角的邏輯Y座標。
傳回值:如果函數調用成功,傳回值非零,否則傳回值為0。
7、 其它(參考MSDN)
四、舉例
(見代碼)
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/eaglewood2005/archive/2009/04/15/4076392.aspx