MFC - GDI

MFC - GDI 首页 / MFC入门教程 / MFC - GDI

Windows提供了在设备上下文中使用的各种绘图工具,它提供了用于绘制线条的笔,用于填充内部的画笔以及用于绘制文本的字体,MFC提供了等效于Windows中绘图工具的图形对象类。

Drawing 绘制

设备上下文是Windows数据结构,其中包含有关设备(例如显示器或打印机)的图形属性的信息。所有绘图调用都是通过设备上下文对象进行的,该对象封装了用于绘制线条,形状和文本的Windows API。

设备上下文允许Windows中与设备无关的图形。设备上下文可用于绘制到屏幕,打印机或图元文件。

Lines 线

步骤1 - 让无涯教程看一个简单的示例,创建一个具有 MFCGDIDemo 名称的基于MFC的新单文档项目。

Lines

步骤2 - 创建项目后,进入Solution Explorer并双击Source Files文件夹下的 MFCGDIDemoView.cpp 文件。

链接:https://www.learnfk.comhttps://www.learnfk.com/mfc/mfc-gdi.html

来源:LearnFk无涯教程网

步骤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

步骤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

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 - 运行此应用程序时,将看到以下输出。

折线

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 - 运行此应用程序时,将看到以下输出。

长方形

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
}

运行此应用程序时,将看到以下输出。

方格

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
  • (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

Arcs 圆弧

圆弧是椭圆的一部分或一部分,表示圆弧是不完整的椭圆。要绘制圆弧,可以使用CDC::Arc()方法。

BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);

Arcs

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

Chords 圆弧

到目前为止,无涯教程绘制的弧线被认为是开放图形,因为它们是由具有起点和终点的线组成的, Chords是圆弧,其两端通过直线连接。

和弦

要绘制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
}

运行上述应用程序时,将看到以下输出。

和弦

在此示例中,圆弧方向设置为顺时针方向。

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
}

运行此应用程序时,将看到以下输出。

色彩

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

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

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
}

运行此应用程序时,将看到以下输出。

刷子

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

DevOps实战笔记 -〔石雪峰〕

DDD实战课 -〔欧创新〕

动态规划面试宝典 -〔卢誉声〕

说透5G -〔杨四昌〕

PyTorch深度学习实战 -〔方远〕

遗留系统现代化实战 -〔姚琪琳〕

零基础GPT应用入门课 -〔林健(键盘)〕

结构写作力 -〔李忠秋〕

Rust 语言从入门到实战 -〔唐刚〕

好记忆不如烂笔头。留下您的足迹吧 :)