14.2.2 CDC类(5)
创建画笔
CBrush类的对象封装了Windows画笔。可以把画笔定义成纯色、阴影线或者有图案的画笔。画笔实际上是一个8×8的像素块,它在要填充的区域上重复应用。
要定义纯色的画笔,可以在创建画笔对象时指定颜色。例如,
- CBrush aBrush(RGB(255,0,0)); // Define a red brush
这个语句定义了红色画笔。传递到这个构造函数的值必须是COLORREF类型,这是由RGB()宏返回的类型,所以在指定颜色时,这是一种好方法。
可以使用另一种构造函数定义阴影线画笔。这需要指定两个参数,和以前一样,第一个参数定义阴影线的类型,第二个参数指定颜色。阴影线参数可以是下列符号常量之一,见表14-3。
表 14-3
|
阴影线类型 |
说 明 |
|
HS_HORIZONTAL |
水平阴影线 |
|
HS_VERTICAL |
垂直阴影线 |
(续表)
|
阴影线类型 |
说 明 |
|
HS_BDIAGONAL |
从左到右的45°下行阴影线 |
|
HS_FDIAGONAL |
从左到右的45°上行阴影线 |
|
HS_CROSS |
水平和垂直交叉阴影线 |
|
HS_DIAGCROSS |
45°交叉阴影线 |
因此,要获得红色的45°交叉阴影线画笔,可以利用下列语句定义CBrush对象:
- CBrush aBrush(HS_DIAGCROSS, RGB(255,0,0));
在初始化CBrush对象时,也可以使用类似于初始化CPen对象时的方式,对纯色画笔使用CBrush类的CreateSolidBrush()成员函数,对阴影线画笔使用这个类的CreateHatchBrush()成员函数。它们需要的参数和对应的构造函数相同。例如,可以利用下列语句创建和前面一样的阴影线画笔:
- CBrush aBrush; // Define a brush object
- aBrush.CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,0));
使用画笔
要使用画笔,应当按照与钢笔类似的方式调用CDC类的SelectObject()成员函数,把画笔选入设备上下文中。为了把画笔对象选入设备上下文中,将重载这个成员函数。在选择以前定义的画笔时,只需要编写下列语句:
- CBrush* pOldBrush = pDC->SelectObject(&aBrush); // Select the brush into the DC
SelectObject()函数返回指向旧画笔的指针,如果操作失败,则返回NULL。函数执行完成之后,使用返回的此指针可以将旧画笔存储在设备上下文中。
有7种标准画笔可用。每种标准画笔都由预定义的符号常量标识。它们分别是:
|
GRAY_BRUSH |
LTGRAY_BRUSH |
DKGRAY_BRUSH |
|
BLACK_BRUSH |
WHITE_BRUSH |
|
|
HOLLOW_BRUSH |
NULL_BRUSH |
|
这些画笔名称的含义不言自明。要使用画笔,需要调用CDC类的SelectStockObject()成员函数,把想要使用的画笔的符号名称作为参数进行传递。要使用不填充闭合形状内部的空画笔,可以编写下列语句:
- CBrush* pOldBrush = dynamic_cast<CBrush*>(pDC->SelectStockObject(NULL_BRUSH));
和以前一样,pDC是指向CDC对象的指针。在SelectStockObject()函数中还可以使用标准钢笔之一。标准钢笔的符号是BLACK_PEN、NULL_PEN (不进行任何绘制)和WHITE_PEN。因为这个函数处理各种各样的对象-- 如本章中介绍过的钢笔和画笔,不过它也处理字体-- 所以返回的指针的类型是CGdiObject*。CGdiObject类是所有GDI对象的基类,因而指向这个类的指针可以用于存储任何GDI对象的地址。可以将SelectObject()或SelectStockObject()返回的指针存储为CGdiObject*类型,并在想要还原时传递给SelectObject()。但是,最好将返回的指针值强制转换成适当的类型,以便跟踪在设备上下文中还原的对象类型。
对于使用备用画笔,然后在完成绘图后还原以前的画笔这种情况,典型的编码方式是:
- CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
- // draw something...
- pDC->SelectObject(pOldBrush); // Restore the old brush
在本章后面的示例中将使用这样的代码。