MFC:绘图基础
2.2 用GDI绘图
2.2.1 画直线和曲线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | CPaintDC dc( this ); //画线,(0,0)为屏幕左上角 dc.MoveTo(0,0); //起点 dc.LineTo(0,100); //终点 //画方框 POINT aPoint[5]={0,0, 0,100, 100,100, 100,0, 0,0}; dc.Polyline(aPoint,5); dc.MoveTo(0,0); POINT aPoint[4]={0,100, 100,100, 100,0, 0,0}; dc.PolylineTo(aPoint,4); //画弧形 CRect rect(0,0,200,100); CPoint point1(0,100); CPoint point2(200,100); dc.Arc(rect,point1,point2); //画贝塞尔曲线 POINT aPoint1[4]={120,100, 120,200, 250,150, 500,40}; dc.PolyBezier(aPoint1,4); |
2.2.2 画椭圆/多边形/其他形状
1 2 3 4 5 6 7 8 | //画椭圆 dc.Ellipse(0,0,100,100); CRect rect(0,0,100,100); dc.Ellipse(rect); //画矩形 dc.Rectangle(0,0,800,400); |
2.2.3 GDI画笔和CPen类
默认画笔是一个像素点宽的黑色实线,如果需要创建一个GDI画笔,就必须CDC::SelectObject()将它选入设备描述表
1 2 3 4 5 6 7 8 9 | CPen pen(PS_SOLID,1,RGB(255,0,0)); //画笔样式:PS_SOLID PS_DASH PS_DOT PS_DASHDOT PS_DASHDOTDOT PS_NULL PS_INSIDEFRAME CPen pen; pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); //RGB主要颜色 黑色(0,0,0) 白色(255,255,255) 红色(192,0,0) 黄色(192,192,0) 绿色(0,192,0) 青色(0,192,192) 蓝色(0,0,192) |
2.2.4 GDI画刷和CBrush类
默认下画出的封闭图形填充着是白色像素点,通过创建GDI画刷并将它选入设备描述表,就可以改变图形的填充颜色
1 2 3 4 5 6 7 | CBrush brush(RGB(255,0,0)); CBrush brush; brush.CreateSolidBrush(RGB(255,0,0)); //画刷样式:HS_BDIAGONAL HS_FDIAGONAL HS_CROSS HS_HORIZONTAL HS_DIAGCROSS HS_VERTICAL CBrush brush(HS_DIAGCROSS,RGB(255,255,255)); |
2.2.5 画文本
1 2 3 4 5 6 7 8 9 10 | //画文本在屏幕中央 CRect rect; GetClientRect(&rect); dc.DrawText(_T( "Hello,MFC" ),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); dc.TextOut(0,0,CString(_T( "Hello MFC" ))); //改变文本属性 dc.SetTextAlign(TA_RIGHT); dc.SetTextColor()/dc.SetBkColor() |
2.2.6 GDI字体和CFont类
1 2 3 4 5 | CFont font; font.CreatePointFont(120,_T( "Times New Roman" )); CPaintDC dc( this ); dc.SelectObject(&font); |
2.2.7 光栅字体与TrueType字体
TrueType字体能够任意缩放尺寸:Times New Roman/Arial/Courier New/Symbol
2.2.8 旋转字体
2.2.9 备用对象
windows内部有一些现成备用的对象(如画笔/画刷/字体等),这样就不用我们自己创建了
2.2.10 删除GDI对象
与CGdiObject相关联的GDI对象可以通过调用CGdiObject::DeleteObject显式删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //源.cpp //第一行添加 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //在函数结尾添加 _CrtDumpMemoryLeaks(); //检查VS调试信息,里面会有文件第几行有内存泄漏 |
2.2.11 取消对GDI对象的选定
在我们要删除GDI对象的时候,最好把该GDI对象从DC环境里面选出,以免发生崩溃,最好的办法就是用备用对象来替换我们需要删除的对象
1 2 3 4 5 6 7 8 9 10 11 | //用备用对象来替换目标对象 CPen pen(PS_SOLID,1,RGB(255,0,0)); dc.SelectObject(&pen); CBrush brush(RGB(0,0,255)); dc.SelectObject(&brush); ... dc.SelectStockObject(BLACK_PEN); dc.SelectStockObject(WHITE_BRUSH); delete pen; delete brush; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)