Windows GDI 教程(五) 填充图形和画刷

填充图形(Filled Shape)是指封闭状态的图形,常见有的矩形、多边形、圆形、椭圆等等。而画刷(Brush)与画笔(Pen)不同,画笔是专门用于绘制线条,而画刷则专门用于填充如矩形、椭圆形等填充图形。

在 DC 中,画刷与画笔一样,都是使用 SelectObject 函数来选中。并且画刷与画笔可以同时存在,互相并不冲突。

Rectangle

本节的重点是矩形(Rectangle)的绘制,而绘制矩形的函数名也就是英文的单词 Rectangle 。该函数用于在目标DC中绘制矩形的函数,只需要传一个DC的句柄以及矩形的左上点坐标和右下点坐标。

BOOL Rectangle(
  _In_  HDC hdc,		// 目标DC句柄
  _In_  int nLeftRect,	// 左
  _In_  int nTopRect,	// 上
  _In_  int nRightRect,	// 右
  _In_  int nBottomRect	// 下
);

绘制空心矩形

#define RED_COLOR RGB(255,0,0)

void Paint(HWND hwnd)
{
	PAINTSTRUCT ps;
	HDC hdc;
	HPEN hpen;
	int i;

	// 创建并选择画笔
	hdc = BeginPaint(hwnd, &ps);
	hpen = CreatePen(PS_SOLID, 1, RED_COLOR);
	SelectObject(hdc,hpen);

	// 绘制矩形
	Rectangle(hdc,80, 50, 300, 200);

	// 清理资源
	DeleteObject(hpen);
	EndPaint(hwnd, &ps);
}

效果图:
绘制空心矩形

PS:如果没有用 SelectObject 指定画笔的话,会使用默认画笔(样式:soild、宽度:1px、黑色)

CreateSolidBrush

创建一个实心填充的画刷。

HBRUSH CreateSolidBrush(
  _In_  COLORREF crColor // 指定画刷颜色
);

绘制实心矩形


#define RED_COLOR RGB(255,0,0)
#define BLUE_COLOR RGB(0,0,255)

void Paint(HWND hwnd)
{
	PAINTSTRUCT ps;
	HDC hdc;
	HBRUSH hbrush;
	HPEN hpen;

	hdc = BeginPaint(hwnd, &ps);

	hpen = CreatePen(PS_SOLID, 10, RED_COLOR);	// 创建红色实心10px粗的画笔
	hbrush = CreateSolidBrush(BLUE_COLOR); // 创建蓝色画刷

	SelectObject(hdc, hpen);	// 指定画笔
	SelectObject(hdc, hbrush);	// 指定画刷

	// 绘制矩形
	Rectangle(hdc,80, 50, 300, 200);

	// 清理资源
	DeleteObject(hpen);
	DeleteObject(hbrush);
	EndPaint(hwnd, &ps);
}

效果图:
绘制实心矩形

填充图形列表

本节并不专门讲解除了矩形以外的其他图形。因此,以下简单的将绘制填充图形的所有的函数列举出来:

  • Rectangle 绘制一个矩形。
  • RoundRect 绘制一个圆角矩形。
  • Ellipse 绘制一个椭圆形。
  • Pie 绘制一个圆饼扇形。
  • Chord 绘制一个切割椭圆。
  • Polygon 绘制多边形。
  • PolyPolygon 绘制同时绘制多个封闭的多边形。
  • FillRect 使用画刷填充一块矩形区域。
  • FrameRect 使用画刷绘制一块矩形区域的边框。
  • InvertRect 将制定的矩形范围内的像素反色。

更多信息详见: Filled Shape Functions on MSDN

CreateHatchBrush

创建影线画刷。

HBRUSH CreateHatchBrush(
  _In_  int fnStyle,		// 影线样式
  _In_  COLORREF clrref 	// 画刷颜色
);

绘制椭圆、圆角矩形、扇形以及切割椭圆实例

// 画刷样式
int ibrushStyle[4] = {
	HS_VERTICAL,	/* ||||| 垂直 */
	HS_HORIZONTAL,	/* ----- 水平 */
	HS_CROSS,		/* +++++ 正十字 */
	HS_DIAGCROSS	/* xxxxx 斜十字 */
};

void Paint(HWND hwnd)
{
	PAINTSTRUCT ps;
	HDC hdc;
	HPEN hPen;
	HBRUSH hBrush[4];
	int i;

	hdc = BeginPaint(hwnd, &ps);

	// 初始化4把画刷
	for(i = 0; i < 4; i++)
		hBrush[i] = CreateHatchBrush(ibrushStyle[i], RGB(0,0,255));

	// 画椭圆
	SelectObject(hdc, hBrush[0]);
	Ellipse(hdc, 0,0, 140,100);
	TextOut(hdc,55,100,"椭圆",strlen("椭圆"));

	// 画圆角矩形
	SelectObject(hdc,hBrush[1]);
	RoundRect(hdc, 160,0,  320,100, 30,30);
	TextOut(hdc, 210,100, "圆角矩形",strlen("圆角矩形"));

	// 画扇形
	SelectObject(hdc,hBrush[2]);
	Pie(hdc, 0,130, 140,230, 50,50, 300,300);
	TextOut(hdc,55,230,"扇形",strlen("扇形"));

	// 画切割椭圆(Chord)
	SelectObject(hdc,hBrush[3]);
	Chord(hdc, 160,130, 320,230, 50,50, 600,300);
	TextOut(hdc,210,230,"Chord",strlen("Chord"));

	// 清理资源
	for(i = 0; i < 4; i++)
		 DeleteObject(hBrush[i]);
	EndPaint(hwnd, &ps);
}

效果图:
绘制填充图形

PS:如果绘制椭圆的时候,设置其区域为正方形,则画出来的就是圆形。扇形也同样如此,画出来的就是圆的扇形。

画刷类型列表

这边再给大家拓展一下所有画刷的列表,虽然教程内没有专门讲解,但是说不定其中就有你心动的功能:

  • CreateSolidBrush 创建一个实心颜色(Solid color)画刷
  • CreateHatchBrush 创建一个影线模式(Hatch pattern)的画刷
  • CreatePatternBrush 创建一个位图模式(Bitmap pattern)的画刷
  • CreateBrushIndirect 根据指定的样式、颜色、模式(pattern)来创建一个画刷
  • CreateDIBPatternBrushPt 根据 DIB 模式(pattern from DIB)创建一个画刷

其他更多操作画刷的函数详见 Brush Functions on MSDN

教程索引

上一讲:Windows GDI 教程(四) 文字与字体
下一讲:Windows GDI 教程(六) DC与加载位图

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s