MFC(三)(作图)

MFC绘图方法总结
本文介绍了MFC中实现绘图功能的四种主要方法:直接调用API、使用CDC类、利用CClientDC对象以及通过CWindowDC进行绘图。此外,还详细讲解了如何改变画笔和画刷的属性来绘制不同样式的图形。

MFC中作图主要有两种方式:

 

其一,直接调用API,如下:

 

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

//      this->MessageBox("鼠标左键被按下了。");

         m_ptOrigin=point;

         CView::OnLButtonDown(nFlags, point);

}

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

 

         //所有从cwnd类继承过来的子类都有这个窗口句柄m_hWnd

         HDC hdc;

    //调用全局的MFC 的API函数前面加::表示是全局的而不是类自己的

         hdc=::GetDC(m_hWnd);

         //将当前鼠标位置移动到之前的位置

         MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);

        

         LineTo(hdc,point.x,point.y);

         ::ReleaseDC(m_hWnd,hdc);

 

        

         CView::OnLButtonUp(nFlags, point);

}

 

其二:用MFC给我们封装好的CDC类(MFC将所有作图有关的功能封装在CDC类中,就如所有与窗口有关的函数都封装在Cwnd类中一样),实例如下:

 

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

//      this->MessageBox("鼠标左键被按下了。");

         m_ptOrigin=point;

         CView::OnLButtonDown(nFlags, point);

}

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

 

CDC *cdc;

//注意此处的getDC函数不加::表明调用的是Cwnd类封装的GetDC函数

cdc=GetDC();

cdc->MoveTo(m_ptOrigin);

cdc->LineTo(point);

ReleaseDC(cdc);

 

        

         CView::OnLButtonUp(nFlags, point);

}

 

第三种方式,用CClient对象进行画图(其为CDC类的子类),如下:

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

//其中CClientDC类的构造函数传递的是窗口类句柄Cwnd而不是窗口类对象Hwnd

CClientDC client(this);

client.MoveTo(m_ptOrigin);

client.LineTo(point);

 

        

         CView::OnLButtonUp(nFlags, point);

}

 

第四种方式CWindowDC,如果初始化的是Frame类的窗口句柄则可以把图形画在整个窗口,包括客户区和非客户区:

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

 

//CWindowDC dc(this);

//在View类中获取父窗口Frame类的的窗口对象

CWindowDC dc(GetParent());

//获取桌面窗口的窗口对象,可以将图画到桌面

//CWindowDC dc(GetDesktopWindow());

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

 

        

         CView::OnLButtonUp(nFlags, point);

}

 

改变画笔颜色、样式、宽度等各项属性画图:

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

 

CPen pen(PS_DOT,3,RGB(255,0,0));

CClientDC dc(this);

//将创建的画笔对象传到设备环境,并返回之前的画笔对象

CPen *oldPen=dc.SelectObject(&pen);

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

dc.SelectObject(oldPen);

        

CView::OnLButtonUp(nFlags, point);

}

 

改变画刷去填充:

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

 

CBrush brush(HS_CROSS,RGB(255,0,0));

CClientDC dc(this);

 

dc.FillRect(CRect(m_ptOrigin,point),&brush);

 

        

CView::OnLButtonUp(nFlags, point);

}

 

位图画刷:

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

 

 

CBitmap bitmap;

bitmap.LoadBitmap(IDB_BITMAP1);

CBrush brush(&bitmap);

 

CClientDC dc(this);

 

dc.FillRect(CRect(m_ptOrigin,point),&brush);

 

        

CView::OnLButtonUp(nFlags, point);

}

 

透明的画刷:

 

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)

{

         // TODO: Add your message handler code here and/or call default

         //其中GetStockObject()函数是取得一个透明的画刷的句柄,且必须进行强制类型转换,因为取得的是一个CObject类型的句柄。然后用FromHandle函数将画刷句柄转化为画刷对象

         //FromHandle是CBrush类的静态方法

CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

 

CClientDC dc(this);

CBrush *oldBrush=dc.SelectObject(brush);

//画矩形

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

 

dc.SelectObject(oldBrush);

        

CView::OnLButtonUp(nFlags, point);

}

 

设置绘图模式,就要是设置绘图的前景色和屏幕已有的颜色的混合模式来调整画笔的颜色:

dc.SetROP2(R2_XORPEN);

转载于:https://www.cnblogs.com/totem1990/archive/2012/03/27/2420358.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值