Windows GDI 教程(二) 画笔的颜色与样式

以上一节的代码为蓝本,我们所需要关注的仅仅是 Paint 函数内的内容。首先我们来补充说明一下上一讲代码中没有详细说明的问题。

// 创建画笔
hpen = CreatePen(PS_SOLID, 1, RGB(255,0,0));

这里通过 CreatePen 创建了一个画笔。其中:

  • 参数一 PS_SOLID 是指画笔的样式,具体的样式形态会在本文下方详述。
  • 参数二 1 是指明该画笔的宽度即 1px。需要注意的是 px 是像素单位,1px 也可以简单的理解为一个点。由于概念简单这里不做过多赘述,更多的具体信息可以去百度百科。
  • 参数三 RGB(255,0,0) 则是指定画笔的颜色了。具体描述见下文。

RGB 颜色

RGB色彩模式是工业界的一种颜色标准,通过红(Red)、绿(Green)、蓝(Blue)三种颜色搭配可以显示出非常丰富的色彩来。目前我们程序中看到的这种 RGB 其实也可以简单的当做 256 色(0~255)来看。总共能搭配出来的颜色有 256*256*256 = 16777216 种。

我们用最简单的方式来看到这个 RGB 颜色,当其值为 0 的时候,就没有该颜色,当其值为 255 的时候即纯色。这样每个颜色有 2 种状态来看的话,可以搭配出 8 个颜色,如下图:

对应数据如下表格:

RGB描述 绿 十六进制 颜色
RGB(0,0,0) 0 0 0 000000 黑色
RGB(255,0,0) 255 0 0 FF0000 红色
RGB(0,255,0) 0 255 0 00FF00 绿色
RGB(0,0,255) 0 0 255 0000FF 蓝色
RGB(255,255,0) 255 255 0 FFFF00 黄色
RGB(255,0,255) 255 0 255 FF00FF 紫色
RGB(0,255,255) 0 255 255 00FFFF 兰色
RGB(255,255,255) 255 255 255 FFFFFF 白色

如果把每种颜色的状态由浅入深的分为12个状态的话,调配的颜色可以参考下图:
0dd7912397dda1448aa71c91b2b7d0a20cf48662

绘制不同颜色的线条

下面的情况就是每一列画上蓝色从0~255的渐变。然后每一行配上红色从0~255的渐变。这中间其实每一行都画的是一个长度 256px 高度2px 的矩形。

void Paint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc;   // DC(可画图的内存对象) 的句柄
    HPEN hpen; // 画笔
    int red, blue; // 红、绿两色
    int y = 1, x = 1; // 行、列

    // 通过窗口句柄获取该窗口的 DC
    hdc = BeginPaint(hwnd, &ps);

    for (red = 0; red < 256; red++)
    {
        for (blue = 0; blue < 256; blue++)
        {
			// 创建画笔
            hpen = CreatePen(PS_SOLID, 1, RGB(red, 0, blue));
			// 选中画笔
            SelectObject(hdc, hpen);

			// 画一条从 (x, y) 到 (x, y+1) 的垂直的线
            MoveToEx(hdc, x, y, NULL);
            LineTo(hdc, x++, y + 1);

			// 删除画笔
            DeleteObject(hpen);
        }
		// 一行画完 行+1, 列重新置 1
		y += 1;
        x = 1;
    }

    // 关闭DC 结束绘制
    EndPaint(hwnd, &ps);
}

效果如下:
使用线条绘制一个简单的颜色渐变

PS:画完一行之后 y 坐标仅仅只是加1,所以会覆盖上一行的下半部分。其实做这个效果用画点的函数效果会更好,不过为了让大家更容易上手所以这里还是继续使用 LineTo。

画笔的不同样式

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

	// 画笔类型
	int Penstyle[] = {
		PS_SOLID, 		/*   直线   */
		PS_DASH, 		/* -------  */
		PS_DOT, 		/* .......  */
		PS_DASHDOT, 	/* _._._._  */
		PS_DASHDOTDOT, 	/* _.._.._  */
		PS_NULL  		/*          */
	};

	hdc = BeginPaint(hwnd, &ps);

	for(i=0; i < sizeof(Penstyle) / sizeof(Penstyle[0]); i++)
	{
		// 创建画笔
		hpen = CreatePen(Penstyle[i], 1, RGB(0,0,0));
		// 设备选择画笔
		SelectObject(hdc,hpen);

		// 画一条从(30*i+80, 50) 到 (30*i+80, 200) 的线
		MoveToEx(hdc, 30 * i + 80, 50, NULL);
		LineTo(hdc, 30 * i + 80, 200);
	}

	DeleteObject(hpen);
	EndPaint(hwnd, &ps);
}

效果图:
画笔的六种样式

使用 Lineto 绘制一个简单的三角形

lineto 是可以一直连续使用的。

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

	hdc = BeginPaint(hwnd, &ps);

	// 创建画笔
	hpen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
	// 设备选择画笔
	SelectObject(hdc,hpen);

	// 画一条从(30*i+80, 50) 到 (30*i+80, 200) 的线
	MoveToEx(hdc,100, 200, NULL);
	LineTo(hdc, 300, 200);
	LineTo(hdc, 200, 50);
	LineTo(hdc,100, 200);

	DeleteObject(hpen);
	EndPaint(hwnd, &ps);
}

效果图:
Lineto绘制三角形

关于画笔的其他注意点

实际上创建画笔除了 CreatePen 函数 之外还有一个 ExtCreatePen 函数。通过 CreatePen 创建的画笔我们一般称为装饰画笔(Cosmetic Pens),通过 ExtCreatePen 创建的我们一般称之为几何画笔(Geometric Pens)。

装饰画笔:简单、轻便。绘制速度快。不收坐标空间变化影响,所以绘制的线条宽度都是相等。可以设置的属性只有:样式、宽度、颜色。
几何画笔:拓展了更多的功能,绘制速度较慢,收到坐标空间变化的影响,具有多种属性。几何画笔除了包括装饰画笔的三种属性之外,还多了模式(Pattern)、影线(Hatch)、线端(End Cap)、结合方式(jion)等属性。具有更丰富的表现力。不过为了让大家能很容易的学下去我们还是先不讨论几何画笔。

教程索引

上一节:Windows GDI 教程(一) 一个简单的绘图程序
下一节:Windows GDI 教程(三) 绘制函数图像以及多边形

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