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;

 

posted @   言午丶  阅读(469)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示