Windows提供了在设备上下文中使用的各种绘图工具,它提供了用于绘制线条的笔,用于填充内部的画笔以及用于绘制文本的字体,MFC提供了等效于Windows中绘图工具的图形对象类。
Drawing 绘制
设备上下文是Windows数据结构,其中包含有关设备(例如显示器或打印机)的图形属性的信息。所有绘图调用都是通过设备上下文对象进行的,该对象封装了用于绘制线条,形状和文本的Windows API。
设备上下文允许Windows中与设备无关的图形。设备上下文可用于绘制到屏幕,打印机或图元文件。
Lines 线
步骤1 - 让无涯教程看一个简单的示例,创建一个具有 MFCGDIDemo 名称的基于MFC的新单文档项目。
![Lines](http://learnfk.xiuxiandou.com/learnfk_lines1.jpg)
步骤2 - 创建项目后,进入Solution Explorer并双击Source Files文件夹下的 MFCGDIDemoView.cpp 文件。
步骤3 - 如下图所示,在 CMFCGDIDemoView::OnDraw()方法中画线。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->MoveTo(95, 125); pDC->LineTo(230, 125); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
步骤4 - 运行此应用程序。您将看到以下输出。
![Lines](http://learnfk.xiuxiandou.com/learnfk_lines2.jpg)
步骤5 - CDC::MoveTo()方法用于设置行的起始位置。
使用LineTo()时,程序从MoveTo()点开始到LineTo()末尾。
在LineTo()之后,当您不调用MoveTo()并再次调用具有其他点值的LineTo()时,程序将从前一个LineTo()到新的LineTo()点绘制一条线。
步骤6 - 要绘制不同的线条,可以使用此属性,如以下代码所示。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->MoveTo(95, 125); pDC->LineTo(230, 125); pDC->LineTo(230, 225); pDC->LineTo(95, 325); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
步骤7 - 运行此应用程序。您将看到以下输出。
![Lines](http://learnfk.xiuxiandou.com/learnfk_lines3.jpg)
Polylines 折线
折线是一系列连接的线,这些行存储在POINT或CPoint值的数组中,要绘制折线,请使用CDC::Polyline()方法,要绘制折线,至少需要两个点,如果定义两个以上的点,则第一个点之后的每条线将从上一个点画到下一个点,直到所有点都包括在内。
步骤1 - 让无涯教程看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { CPoint Pt[7]; Pt[0] = CPoint(20, 150); Pt[1] = CPoint(180, 150); Pt[2] = CPoint(180, 20); pDC-Polyline(Pt, 3); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
步骤2 - 运行此应用程序时,将看到以下输出。
![折线](http://learnfk.xiuxiandou.com/learnfk_polylines.jpg)
Rectangles 矩形
矩形是由四个构成四个直角的边组成的几何图形,像直线一样,要绘制矩形,您必须定义矩形的起点和终点,要绘制矩形,可以使用CDC::Rectangle()方法。
步骤1 - 让无涯教程看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->Rectangle(15, 15, 250, 160); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
步骤2 - 运行此应用程序时,将看到以下输出。
![长方形](http://learnfk.xiuxiandou.com/learnfk_rectangles.jpg)
Squares 正方形
正方形是由四个侧面组成的几何图形,四个侧面组成四个直角,但每个侧面的长度必须相等。
让无涯教程看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->Rectangle(15, 15, 250, 250); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行此应用程序时,将看到以下输出。
![方格](http://learnfk.xiuxiandou.com/learnfk_squares.jpg)
Pies 椭圆
pie 是椭圆的一部分,由两条线界定,该两条线从椭圆的中心延伸到一侧。要绘制馅饼,可以使用CDC::Pie()方法,如下所示-
BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
(x1,y1)点确定矩形的左上角,代表饼形的椭圆适合该矩形。 (x2,y2)点是矩形的右下角。
![Pies](http://learnfk.xiuxiandou.com/learnfk_pies1.jpg)
(x3,y3)点指定饼图在默认的逆时针方向上的起始角。
(x4,y4)点种类是饼图的终点。
让无涯教程看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->Pie(40, 20, 226, 144, 155, 32, 202, 115); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行此应用程序时,将看到以下输出。
![Pies](http://learnfk.xiuxiandou.com/learnfk_pies2.jpg)
Arcs 圆弧
圆弧是椭圆的一部分或一部分,表示圆弧是不完整的椭圆。要绘制圆弧,可以使用CDC::Arc()方法。
BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
![Arcs](http://learnfk.xiuxiandou.com/learnfk_arcs1.jpg)
CDC类配备了SetArcDirection()方法。
这是语法-
int SetArcDirection(int nArcDirection)
Sr.No. | Value & Orientation |
---|---|
1 |
AD_CLOCKWISE 该图是顺时针绘制的 |
2 |
AD_COUNTERCLOCKWISE 该图是逆时针绘制的 |
第1步-让无涯教程看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->SetArcDirection(AD_COUNTERCLOCKWISE); pDC->Arc(20, 20, 226, 144, 202, 115, 105, 32); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
第2步-运行此应用程序时,将看到以下输出。
![Arcs](http://learnfk.xiuxiandou.com/learnfk_arcs2.jpg)
Chords 圆弧
到目前为止,无涯教程绘制的弧线被认为是开放图形,因为它们是由具有起点和终点的线组成的, Chords是圆弧,其两端通过直线连接。
![和弦](http://learnfk.xiuxiandou.com/learnfk_chords1.jpg)
要绘制Chords,可以使用CDC::Chord()方法。
BOOL Chord(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { pDC->SetArcDirection(AD_CLOCKWISE); pDC->Chord(20, 20, 226, 144, 202, 115, 105, 32); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行上述应用程序时,将看到以下输出。
![和弦](http://learnfk.xiuxiandou.com/learnfk_chords2.jpg)
在此示例中,圆弧方向设置为顺时针方向。
Color 颜色
颜色是最基本的对象之一,可以增强对象的美学外观,颜色是非空间对象,已添加到对象以修改其某些视觉外观, MFC库与Win32 API结合使用,可以提供各种操作,您可以利用这些操作来充分利用颜色的各个方面。
RGB宏的行为类似于一个函数,并允许您传递由逗号分隔的三个数值。每个值都必须介于0到255之间,如以下代码所示。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { COLORREF color = RGB(239, 15, 225); }
看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { COLORREF color = RGB(239, 15, 225); pDC->SetTextColor(color); pDC->TextOut(100, 80, L"MFC GDI Tutorial", 16); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行此应用程序时,将看到以下输出。
![色彩](http://learnfk.xiuxiandou.com/learnfk_colors.jpg)
Fonts 字体
CFont 封装Windows图形设备界面(GDI)字体,并提供用于操纵该字体的成员函数。要使用CFont对象,请构造一个CFont对象并为其添加Windows字体,然后使用该对象的成员函数来操纵该字体。
看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { CFont font; font.CreatePointFont(920, L"Garamond"); CFont *pFont = pDC->SelectObject(&font); COLORREF color = RGB(239, 15, 225); pDC->SetTextColor(color); pDC->TextOut(100, 80, L"MFC GDI Tutorial", 16); pDC->SelectObject(pFont); font.DeleteObject(); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行上述应用程序时,将看到以下输出。
![Fonts](http://learnfk.xiuxiandou.com/learnfk_fonts.jpg)
Pens 钢笔
pen 是用于在设备上下文上绘制直线和曲线的工具。在图形编程中,笔还用于绘制诸如矩形或多边形之类的几何封闭形状的边界, MFC提供了一个 CPen 类,该类封装了Windows图形设备接口(GDI)笔。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { CPen pen; pen.CreatePen(PS_DASHDOTDOT, 1, RGB(160, 75, 90)); pDC->SelectObject(&pen); pDC->Rectangle(25, 35, 250, 125); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行上述应用程序时,将看到以下输出。
![Pens](http://learnfk.xiuxiandou.com/learnfk_pens.jpg)
Brushes 画笔
画笔是一种绘图工具,用于填充封闭的形状或线条内部。画笔的行为就像捡起一桶油漆并将其倒在某处。 MFC提供了一个CBrush类,它封装了Windows图形设备接口(GDI)画笔。
让无涯教程看一个简单的示例。
void CMFCGDIDemoView::OnDraw(CDC* pDC) { CBrush brush(RGB(100, 150, 200)); CBrush *pBrush = pDC->SelectObject(&brush); pDC->Rectangle(25, 35, 250, 125); pDC->SelectObject(pBrush); CMFCGDIDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //TODO: add draw code for native data here }
运行此应用程序时,将看到以下输出。
![刷子](http://learnfk.xiuxiandou.com/learnfk_brushes.jpg)
参考链接
https://www.learnfk.com/mfc/mfc-gdi.html
标签:CMFCGDIDemoView,MFC,CDC,int,OnDraw,无涯,GDI,pDC,pDoc From: https://blog.51cto.com/u_14033984/8773122