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;