MFC画图方法汇总
来源:互联网 发布:淘宝哪个店有真葡萄苗 编辑:程序博客网 时间:2024/06/04 17:55
1. 画线
方法I:使用HDC (SDK模式)
HDC hDC;hDC = ::GetDC(m_hWnd); //此处要用全局的::GetDC,否则默认用CDC的。MoveToEx(hDC, point1.x, point1.y, NULL); //MoveToEx,先移到初始点,然后再画线LineTo(hDC, point2.x, point2.y);::ReleaseDC(m_hWnd, hDC); //释放也要用全局::ReleaseDC
方法II:使用CDC(MFC模式)
CDC *pdc=GetDC(); pdc->MoveTo(point1); pdc->LineTo(point2); ReleaseDC(pdc);
方法III:使用CClientDC(CClientDC继承自CDC,不需要手动GetDC和ReleaseDC,传递this或GetParent())
CClientDC dc(GetParent()); //可以在Frame下画线 dc.MoveTo(m_ptOrigin); dc.LineTo(point);
方法IV:使用CWindowDC(CWindowDC继承自CDC,包含客户区和非客户区,可以在整个屏幕下画线 ,不需要手动GetDC和ReleaseDC)
CWindowDC dc(GetDesktopWindow());dc.MoveTo(m_ptOrigin);dc.LineTo(point);
2. 包含画笔(颜色,样式,宽度)
方法1:
CDC *pDC = GetDC();CPen pen(PS_SOLID, 2, RGB(200,200,200)); //定义一个画笔,样式为实线,颜色为灰色,宽度为2像素 CPen *pOldPen = pDC->SelectObject(&pen); //将新画笔选入设备描述表,并返回之前的画笔pDC->MoveTo(m_ptOrign);pDC->LineTo(point);pDC->SelectObject(pOldPen); //还原旧画笔ReleaseDC(pDC);
方法2:
CClientDC dc(this); //不需要ReleaseDCCPen pen(PS_DASH,1,RGB(255,0,0)); //定义一个画笔,样式为破折号,颜色为红色,宽度为1像素 CPen *cOldPen=dc.SelectObject(&pen); //将新画笔选到dc中,并保存之前的画笔 dc.MoveTo(point1); dc.LineTo(point2); dc.SelectObject(cOldPen); //还原旧画笔
方法3:
CWindowDC dc(GetDesktopWindow()); //CWindowDC继承自CDC,包含客户区和非客户区,GetDesktopWindow()获取桌面CPen pen(PS_SOLID, 5, RGB(255,0,0));CPen *pOldPen = dc.SelectObject(&pen);dc.MoveTo(point1);dc.LineTo(point2);dc.SelectObject(pOldPen);
3. 画刷
CBrush brush(RGB(255,0,0));CClientDC dc(this); //CClientDC传递thisdc.FillRect(CRect(point1, point2), &brush); //FillRect填充透明画刷:CClientDC dc(this);CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //创建透明画刷CBrush *pOld = dc.SelectObject(pBrush);dc.Rectangle(CRect(point1, point2)); //画矩形dc.SelectObject(pOld); //最后返还画刷
4. 画圆角矩形
//圆角大小POINT pt;pt.x = 5;pt.y = 5;//窗口尺寸CRect rc;GetClientRect(&rc);//画圆角矩形,然后还原旧画笔CDC *pDC = GetDC();pDC->RoundRect(&rect, pt);pDC->SelectObject(hOldPen);//新画笔:实线,线宽5,红色CPen pen(PS_SOLID, 5, RGB(255, 0, 0));CPen* hOldPen = pDC->SelectObject(&pen);//通过朝CRect的中心移动边以缩小CRect,SM_CXEDGE表示缩小一个边框大小,相反函数nflateRectrect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));//填充颜色CBrush brush(RGB(200,200,200));pDC->FillRect(rect, &brush);brush.DeleteObject();
例如:给窗体加上圆角矩形的窗体
需要重载消息 WM_ERASEBKGND,在函数OnEraseBkgnd(CDC* pDC)中实现,才能保证在窗体被遮盖重现后,窗体上画的线条及加载的图片被正常显示
//绘图BOOL CDelTaskDlg::OnEraseBkgnd(CDC* pDC){// TODO: 在此添加消息处理程序代码和/或调用默认值CDialogEx::OnEraseBkgnd(pDC);CRect rc;GetClientRect(&rc);rc.right -= 1;rc.bottom -= 1;//画圆角矩形POINT pt;pt.x = 5;pt.y = 5;CPen hNewPen(PS_SOLID, 1, RGB(170, 170, 170));CPen* hOldPen = pDC->SelectObject(&hNewPen);pDC->RoundRect(&rc, pt);pDC->SelectObject(hOldPen);return TRUE;}
5. 创建任意线条
(1)创建基于单文档工程:Draw
CDrawView类中添加成员变量:
CPoint m_ptOrigin;BOOL m_bDraw;
(2)CDrawView()中初始化:
m_ptOrigin = point;m_bDraw = false;
(3)添加消息响应函数:
WM_LBUTTONDOWN WM_LBUTTONUP WM_MOUSEMOVE(4)左键按下时:
m_ptOrigin = point;m_bDraw = true;(5)左键抬起:
m_bDraw = false;(6)鼠标移动时:
//画连续线条CClientDC dc(this);if(m_bDraw){ dc.MoveTo(point1); dc.LineTo(point2); m_ptOrigin = point2; //必须的}
//画扇形线条CClientDC dc(this);if(m_bDraw){ dc.MoveTo(m_ptOrigin); dc.LineTo(point);}
//画带外包线的扇形线条析:画带外包线的扇形线条,不光记录初始位置,还要记录鼠标移动上一位置。添加成员变量:CPoint m_ptOld;在鼠标左键按下时初始化:m_ptOld = point;在鼠标移动时进行改变:CClientDC dc(this);if(m_bDraw){ dc.MoveTo(m_ptOrigin); dc.LineTo(m_ptOld); dc.MoveTo(m_ptOld); dc.LineTo(point); m_ptOld = point;}
6. 画矩形
画无边框的矩形:
方法说明:利用FillRect函数填充矩形。填充内容为画刷的内容,即画刷对象的指针
CBrush brush(RGB(5,255,255));CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);
以位图作为画刷的资源:
CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(&bitmap); //定义画刷的同时初始化CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);bitmap.DeleteObject(); //可以调用DeleteObject删除由LoadBitmap加载的位图,否则CBitmap的析构函数将删除该位图对象
或者:
CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush; //先声明brush.CreatePatternBrush(&bitmap); //再初始化CClientDC dc(this);dc.FillRect(CRect(m_ptOrigin,point),&brush);bitmap.DeleteObject(); //可以调用DeleteObject删除由LoadBitmap加载的位图,否则CBitmap的析构函数将删除该位图对象
画有边框的矩形:
方法说明:利用Rectangle方法来画矩形。其中CBrush与CPen类分别负责矩形内部和矩形边框的属性
(1) 画中心为白色的矩形
CClientDC dc(this);dc.Rectangle(CRect(point1,point2));
(2)画中心为透明的矩形(空笔刷)
CClientDC dc(this);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(m_ptOrigin,point));pOldBrush=pBrush;
(3)画中心为透明边为任意颜色的矩形
CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(234,23,53));CPen *pOldPen=dc.SelectObject(&pen);CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH))CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(m_ptOrigin,point));dc.SelectObject(pOldPen);dc.SelectObject(pOldBrush);
总结:
使用画笔:
CClientDC dc(this);CPen pen(PS_SOLID,1,RGB(234,23,53));CPen *pOldPen=dc.SelectObject(&pen);dc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);
使用画刷填充:
CBrush brush(RGB(0,255,0));CClientDC dc(this);CRect rect(point1,point2);dc.FillRect(&rect,&brush);
使用位图创建画刷进行填充:
CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);CBrush brush(&bitmap);CClientDC dc(this);CRect rect(point1,point2);dc.FillRect(&rect,&brush);
使用空笔刷画透明矩形:
CBrush *brush;brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));CClientDC dc(this);CBrush *pOldBrush =dc.SelectObject(brush) ;dc.Rectangle(CRect(point1,point2));dc.SelectObject(pOldBrush) ;
0 0
- MFC画图方法汇总
- CoreDraw画图方法汇总(论文/Paper)
- MFC 画图
- MFC画图
- MFC画图
- MFC画图
- MFC画图
- MFC画图
- MFC画图
- MFC 画图
- MFC画图
- MFC画图
- MFC画图
- MFC 控件贴图方法汇总
- MFC 在一个button上画图画的一些方法
- MFC两种拖动鼠标动态画图的方法
- MFC对话框里获取DC画图的几种方法
- MFC改变鼠标形状的方法汇总
- error: Failed dependencies: cloog-ppl >= 0.15 is needed by gcc-4.4.7-4.el6.x86_64 cpp = 4.4.7-4.el6
- iOS之— NSRegularExpression正则分割字符串
- 什么是存储过程,为何需要存储过程,存储过程的种类
- 设计模式-线程安全单例
- POJ 1026 Cipher (置换群)
- MFC画图方法汇总
- iOS 记录Xcode Mac 快捷键
- 蓝桥杯 - 第二大整数 (逻辑判断 循环语句)
- Java EE 7 教程 第一部分 简介 第2章 使用教程示例 第2.4节 启动和停止Java DB服务器
- sql server 2005的导入数据、导出数据问题集合
- PHP获取当前目录和相对目录的方法
- ionic相关名词记录
- Servlet、Filter、Listener的简介
- [iOS]Xcode4/iOS5调试UncaughtException崩溃First throw call stack不打印方法名的解决方案