MFC 简单绘图

本文介绍了如何使用MFC进行简单图形绘制,包括使用MFC的CDC类、CClientDC类和CWindowDC类画线,改变画笔颜色,填充矩形,以及绘制曲线等操作。示例代码详细展示了在鼠标点击和移动事件中实现图形绘制的方法。
摘要由CSDN通过智能技术生成

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 m_ptOrigin = point;
 m_bDraw = true;
 CView::OnLButtonDown(nFlags, point);
}

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
//  //1.
利用SDK全局函数实现画线功能
//  //
首先获得窗口的设备描述表
//  HDC hdc;
//  hdc = ::GetDC(m_hWnd);   //
获得设备描述表句柄,平台sdk函数必须加::,否则被认为是CWnd函数
//       //CWnd
类都有一个成员变量m_hWnd保存窗口句柄,CDrawView继承CWind因此同样有m_hWnd
// 
//移动到线条的起点
//  MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
//  //
画线
//  LineTo(hdc, point.x, point.y);
//  //
释放设备描述表
//  ::ReleaseDC(m_hWnd,hdc);

//  //2.利用mfcCDC类实现画线功能
//  CDC * pDc;   
//  pDc = GetDC();  //
获得当前窗口的设备描述表指针
//  pDc->MoveTo(m_ptOrigin);
//  pDc->LineTo(point);
//  ReleaseDC(pDc);

// //3.利用mfcCClientDC类实现画线功能
// //CClientDC
派生于CDC类,可自动获取,释放设备描述表资源
//  CClientDC dc(this);  //
构造函数需要一个CWnd指针
//  // CClientDC dc(GetParent()); //
获得View的父窗口句柄也就是Frame,此时画线可以画到工具栏内
//  dc.MoveTo(m_ptOrigin);
//  dc.LineTo(point);

//  //4.利用mfcCWindowDC类实现画线功能
// //CWindowDCC
派生于CDC类,也可自动获取,释放设备描述表资源
//  CWindowDC dc(this);
//  //CWindowDC dc(GetParent()); //
此时可以将线画到菜单栏,标题栏
//  //CWindowDC dc(GetDesktopWindow()); //
获得桌面窗口句柄
//  dc.MoveTo(m_ptOrigin);
//  dc.LineTo(point);

//  //5.改变画笔颜色
//  CPen pen(PS_SOLID,10,RGB(255,0,0));
//  CClientDC dc(this);
//  CPen *pOldPen = dc.SelectObject(&pen); //
将画笔选择到设备描述表中
//  dc.MoveTo(m_ptOrigin);
//  dc.LineTo(point);
//  dc.SelectObject(pOldPen); //
画完后改为最初的画笔
 
//  //6.
画刷创建
//  CBrush brush(RGB(0,255,0));
//  CClientDC dc(this);
//  dc.FillRect(CRect(m_ptOrigin,point),&brush);//
此处用指定的画刷去填充,
//             //
所以不需要将画刷选择到设备描述表

//  //7.位图画刷
//  //
事先插入资源类型为bitmap的位图(idIDB_BITMAP1
//  CBitmap bitmap;
//  bitmap.LoadBitmap(IDB_BITMAP1);
//  CClientDC dc(this);
//  CBrush brush(&bitmap); //
bitmap创建画刷
//  dc.FillRect(CRect(m_ptOrigin,point),&brush);

//  //8.画矩形
//  CClientDC dc(this);
//  dc.Rectangle(CRect(m_ptOrigin,point));//
画矩形函数,此时如果矩形重合,新矩形会覆盖原矩形的边
//             //
原因是由于默认画刷为白色且会自动填充矩形内部

//  //9.画内部透明的矩形
//  CClientDC dc(this);
//  CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
//      // GetStockObject
函数返回类型为HGDIOBJ,需强制转换为FromHandle的参数类型HBRUSH
//   CBrush* pOldBrush= dc.SelectObject(pBrush); //
下面画矩形的函数中不能指定画刷,所以需要为设备描述表选择画刷
//  dc.Rectangle(CRect(m_ptOrigin,point));
//  dc.SelectObject(pOldBrush);
//  //dc.FillRect(CRect(m_ptOrigin,point),pBrush); //
如果不是选择画刷再画矩形,直接通过这种方式是画不出矩形边框的

 //10.画曲线相关
 m_bDraw = false;

 CView::OnLButtonUp(nFlags, point);
}

void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
 CClientDC dc(this);
 if (true == m_bDraw) //
判断鼠标是否已经按下
 {
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  m_ptOrigin = point;  //
将起始点 改为现在鼠标的位置
 }
 CView::OnMouseMove(nFlags, point);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值