填充繪製的封閉的繪製的圖形需要用到畫刷
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);
}
運行結果: