一.繪制線條&使用畫刷
繪制線條和使用畫刷等都是先獲得視窗裝置環境句柄,然後選取一個繪圖的工具,使用繪圖工具在裝置環境中繪圖 下面有線條和畫刷的使用方法:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
COLORREF color = RGB(0, 255, 0);
HPEN hpen = CreatePen(PS_SOLID, 20, color);
HBRUSH hbrush = CreateSolidBrush(color);
PAINTSTRUCT ps;
switch (message)
{
<p> case WM_PAINT:</p> //采用BeginPaint方法擷取裝置環境句柄
hdc = BeginPaint(hWnd, &ps);
//選取繪圖使用的工具
SelectObject(hdc, hpen);
//移動焦點
MoveToEx(hdc, 0, 0, NULL);
//畫線
LineTo(hdc, 1000, 1000);
//選擇畫刷作為繪圖工具
SelectObject(hdc, hbrush);
//繪制方形函數
Rectangle(hdc, 150, 200, 200, 250);
//繪圖結束釋放裝置環境
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
CleanUp();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
運作程式,結果如下:
二.繪制位圖
位圖,即bitmap類型的圖像,在windows平台下結尾為.bmp。GDI支援最好的就是位圖。據說GDI+支援png等格式的圖像,但是GDI+是對GDI的封裝,效率不怎麼樣。是以在這裡還是使用GDI繪制位圖。 繪制位圖有4個步驟: 1)加載位圖
HANDLE LoadImage(
HINSTANCE hinst,//如果是從硬碟加載可以置為NULL
LPCTSTR lpszName,//圖像的路徑及檔案名
UINT uType,//類型
int cxDesired,//寬度(如果為0則按照圖像原大小加載)
int cyDesired,//高度(如果為0則按照圖像原大小加載)
UINT fuLoad//加載方式
);
2)建立相容DC HDC CreateCompatibleDC(HDC hdc); 在記憶體中建立一個和螢幕DC相容的記憶體環境 3)選取位圖對象 HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); 前面使用畫筆畫刷時也使用過這個函數,其實就是選取一個用來繪圖的工具,在這裡就是選取位圖作為畫筆 4)繪圖 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);//光栅操作标示符,詳情可以查閱MSDN 代碼如下:
void Init(HWND hwnd)//加載部分
{
g_hdc = GetDC(hwnd);//獲得裝置環境句柄
g_hbitmap = (HBITMAP)LoadImage(NULL, L"xie.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//加載位圖,步驟(1)
g_mdc = CreateCompatibleDC(g_hdc);//建立相容記憶體裝置環境步驟(2)
ReleaseDC(hwnd, g_hdc);//釋放裝置
}
void Paint(HWND hwnd)//貼圖部分
{
g_hdc = GetDC(hwnd);
SelectObject(g_bufdc, g_hbitmap);//選取位圖作為繪圖工具,步驟(3)
BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);//貼圖操作,步驟(4)
ReleaseDC(hwnd, g_hdc);
}
運作結果如下: