您的位置:首页 > 其它

MFC简单绘图(二)

2010-05-15 12:54 239 查看
在上篇中我们实现了画直线的功能,现在我们来实现画彩色线条和使用绘图画刷和透明画刷。

在上次建的工程中继续修改。

一、首先实现绘制彩色线条。

首先需要创建一个特定的颜色的画笔,然后将此画笔选入设备描述表中, 可以利用MFC提供的类CPen来创建画笔对象,其的一个构造函数

CPen(int nPenStyle,int nWidth,COLORREF crColor);

其中nPenStyle 指定比的线型(实现、点线、虚线等),nWidth 指定比的宽度,crColor指定比的颜色,利用RGB这个宏可以构建这种类型的值。

另外,构造一个GDI对象后,该对象并不会立即生效,必须选入设备描述表,它才会在以后的绘制操作中生效。利用SelectObject 函数可以实现吧GDI对象选入设备描述表中,并且该函数会返回指定先前被选对象的指针。着主要是为了再完成当前绘制操作后,还原设备描述表用的。

在void CDraw1View::OnLButtonUp(UINT nFlags, CPoint point) 的消息处理函数中修改代码:

CPen pen(PS_SOLID,1,RGB(255,0,0));
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);


值得注意的是:当画笔的宽度要小于等于1是,虚线线型才有效。

二、使用画刷绘图

1、简单画刷

//创建一个红色画刷
CBrush brush(RGB(255,0,0));
//创建并获得设备描述表
CClientDC dc(this);
//利用红色画刷填充鼠标拖曳过程中形成的矩形区域
dc.FillRect(CRect(m_ptOrigin,point),&brush);


void FillRect(LPCRECT lpRect,CBrush* pBrush);

参数说明:lpRect指向一个RECT结构体或CRect对象指针

pBrush指向用于填充矩形的画刷对象的指针。

2、位图画刷

首先要给程序增加一个位图资源。



就创建了一个默认名称为IDB_BITMAP1的位图资源,并编辑此位图。创建了位图资源后,就可以利用代码来创建位图画刷了。

在void CDraw1View::OnLButtonUp(UINT nFlags, CPoint point) 消息处理函数中修改代码:

//创建位图对象
CBitmap bitmap;
//加载位图资源
bitmap.LoadBitmap(IDB_BITMAP1);
//创建位图画刷
CBrush brush(&bitmap);
//创建并获得设备描述表
CClientDC dc(this);
//利用位图画刷填充鼠标拖曳过程中形成的矩形区域
dc.FillRect(CRect(m_ptOrigin,point),&brush);


三、透明画刷

我们首先来看看利用DCD的Rectangle 函数绘制一个矩形,代码如下:

CClientDC dc(this);
dc.Rectangle(CRect(m_ptOrigin,point));


运行结果如下,我们可以很明显的看到先前画的矩形会被后来画饿矩形所覆盖掉,那么我们要怎么来实现透明呢。



因为设备描述表中有一个默认的白色画刷,在绘图时,它会利用这个画刷来填充矩形的内部,就导致了上面我们看到的结果。

我们可以利用GetStockObject 这个函数来实现。但是利用GetStockObject 函数获取的是一个画刷句柄,而我们在进行绘制操作时需要的是一个画刷对象,这是我们可以利用CBrush 类提供的一个FromHandle 函数来实现从画刷句柄转化为画刷对象这个功能。

static DCD* PASCAL FromHandle(HDC hDC);

实现代码如下:

CClientDC dc(this);
//创建一个空画刷
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//将空画刷选入设备描述表
CBrush *pOldBrush = dc.SelectObject(pBrush);
//绘制一个矩形
dc.Rectangle(CRect(m_ptOrigin,point));
//恢复先前的画刷
dc.SelectObject(pOldBrush);


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: