Windows程式設計 畫刷使用和建立
阿新 • • 發佈:2018-12-15
填充繪製的封閉的繪製的圖形需要用到畫刷
winAPI自帶畫刷建立:
HBRUSH hBrush;
HDC hdc;
hdc = GetDC(hwnd);
hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); //表示獲取系統灰色畫刷
SelectObject(hdc,hBrush);
Rectangle(hdc,100,100,300,300);//繪製一個填充為灰色的矩形
RelaseDC(hwnd,hdc);
t同時也可以自定義畫刷:
1.CreateSolidBrush
//建立一個用實現填充的畫刷
WINGDIAPI HBRUSH WINAPI CreateSolidBrush(
_In_ COLORREF color //RGB顏色
);
hBrush = (HBRUSH)CreateSolidBrush(RGB(60,38,99)); //表示獲取系統灰色畫刷 SelectObject(hdc,hBrush); Rectangle(hdc,100,100,300,300);//繪製一個填充為RGB(60,38,99)的矩形
2.CreateHatchBrush
WINGDIAPI HBRUSH WINAPI CreateHatchBrush(
_In_ int iHatch, //模式
_In_ COLORREF color //RGB顏色
);
iHatch模式有以下這幾種:
#define HS_HORIZONTAL 0 /* ----- */
#define HS_VERTICAL 1 /* ||||| */
#define HS_FDIAGONAL 2 /* \\\\\ */
#define HS_BDIAGONAL 3 /* ///// */
#define HS_CROSS 4 /* +++++ */
#define HS_DIAGCROSS 5 /* xxxxx */
下面附上一段例子程式碼
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; POINT pt[5]{ {200,200},{280,450},{80,300},{320,300},{120,450} },apt[10]; POINT pt2[5]{ { 600,200 },{ 680,450 },{ 480,300 },{ 720,300 },{ 520,450 } }; static POINT aptFigure[10]{ 10,70,50,70,50,10,90,10,90,50,30,50,30,90,70,90,70,30,10,30 }; static int cxClient, cyClient; HDC hdc; static HBRUSH hBrush; //畫刷控制代碼 用來填充圖形 static int i; switch (msg) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); SetBkMode(hdc, TRANSPARENT);//設定背景模式不透明 OPAQUE不透明 TRANSPARENT透明 /*hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH); SelectObject(hdc, hBrush);*/ hBrush = (HBRUSH)CreateHatchBrush(HS_HORIZONTAL, RGB(160, 165, 200)); SelectObject(hdc, hBrush); //SelectObject(hdc, GetStockObject(NULL_PEN));//NULL不含邊框 //RoundRect(hdc, 60, 60, 200, 300, 30, 30); SetPolyFillMode(hdc,ALTERNATE);//設定polygon填充模式 Polygon(hdc, pt, 5); //自動將最後一個與第一個相連 hBrush = (HBRUSH)CreateSolidBrush(RGB(36,200,168)); SelectObject(hdc,hBrush); SetPolyFillMode(hdc, WINDING);//設定polygon填充模式 Polygon(hdc, pt2, 5); //自動將最後一個與第一個相連 //*************************************************************************** return 0; case WM_DESTROY: DeleteObject(hBrush); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); }
執行結果: