在上篇中我们实现了画直线的功能,现在我们来实现画彩色线条和使用绘图画刷和透明画刷。
在上次建的工程中继续修改。
一、首先实现绘制彩色线条。
首先需要创建一个特定的颜色的画笔,然后将此画笔选入设备描述表中, 可以利用MFC提供的类CPen来创建画笔对象,其的一个构造函数
CPen(int nPenStyle,int nWidth,COLORREF crColor);
其中nPenStyle 指定比的线型(实现、点线、虚线等),nWidth 指定比的宽度,crColor指定比的颜色,利用RGB这个宏可以构建这种类型的值。
另外,构造一个GDI对象后,该对象并不会立即生效,必须选入设备描述表,它才会在以后的绘制操作中生效。利用SelectObject 函数可以实现吧GDI对象选入设备描述表中,并且该函数会返回指定先前被选对象的指针。着主要是为了再完成当前绘制操作后,还原设备描述表用的。
在void CDraw1View::OnLButtonUp(UINT nFlags, CPoint point) 的消息处理函数中修改代码:
值得注意的是:当画笔的宽度要小于等于1是,虚线线型才有效。
二、使用画刷绘图
1、简单画刷
void FillRect(LPCRECT lpRect,CBrush* pBrush);
参数说明:lpRect指向一个RECT结构体或CRect对象指针
pBrush指向用于填充矩形的画刷对象的指针。
2、位图画刷
首先要给程序增加一个位图资源。
就创建了一个默认名称为IDB_BITMAP1的位图资源,并编辑此位图。创建了位图资源后,就可以利用代码来创建位图画刷了。
在void CDraw1View::OnLButtonUp(UINT nFlags, CPoint point) 消息处理函数中修改代码:
三、透明画刷
我们首先来看看利用DCD的Rectangle 函数绘制一个矩形,代码如下:
运行结果如下,我们可以很明显的看到先前画的矩形会被后来画饿矩形所覆盖掉,那么我们要怎么来实现透明呢。
因为设备描述表中有一个默认的白色画刷,在绘图时,它会利用这个画刷来填充矩形的内部,就导致了上面我们看到的结果。
我们可以利用GetStockObject 这个函数来实现。但是利用GetStockObject 函数获取的是一个画刷句柄,而我们在进行绘制操作时需要的是一个画刷对象,这是我们可以利用CBrush 类提供的一个FromHandle 函数来实现从画刷句柄转化为画刷对象这个功能。
static DCD* PASCAL FromHandle(HDC hDC);
实现代码如下:
运行结果: