MFC:绘图基础

2.2 用GDI绘图

2.2.1 画直线和曲线

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 画椭圆/多边形/其他形状

//画椭圆
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()将它选入设备描述表

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画刷并将它选入设备描述表,就可以改变图形的填充颜色

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 画文本

//画文本在屏幕中央
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类

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显式删除

//源.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环境里面选出,以免发生崩溃,最好的办法就是用备用对象来替换我们需要删除的对象

//用备用对象来替换目标对象
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;

猜你喜欢

转载自www.cnblogs.com/k5bg/p/11130409.html