MFC - GDI



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

绘图

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

设备环境允许在 Windows 中进行设备无关绘图。设备环境可用于绘制到屏幕、打印机或图元文件。

CDC 是在 MFC 中进行绘图的最基本类。CDC 对象提供成员函数来执行基本的绘图步骤,以及用于处理与窗口客户区关联的显示环境的成员。

序号 名称及描述
1

AbortDoc

终止当前打印作业,擦除应用程序自上次调用 StartDoc 成员函数以来写入设备的所有内容。

2

AbortPath

关闭并丢弃设备环境中的任何路径。

3

AddMetaFileComment

将注释从缓冲区复制到指定的增强格式图元文件。

4

AlphaBlend

显示具有透明或半透明像素的位图。

5

AngleArc

绘制一条线段和一条弧线,并将当前位置移动到弧线的结束点。

6

Arc

绘制椭圆弧。

7

ArcTo

绘制椭圆弧。此函数类似于 Arc,但会更新当前位置。

8

Attach

将 Windows 设备环境附加到此 CDC 对象。

9

BeginPath

在设备环境中打开路径括号。

10

BitBlt

从指定的设备环境复制位图。

11

Chord

绘制弦(由椭圆和线段的交点界定的封闭图形)。

12

CloseFigure

关闭路径中的开放图形。

13

CreateCompatibleDC

创建一个与另一个设备环境兼容的内存设备环境。您可以使用它来准备内存中的图像。

14

CreateDC

为特定设备创建设备环境。

15

CreateIC

为特定设备创建信息环境。这提供了一种快速获取有关设备信息而不创建设备环境的方法。

16

DeleteDC

删除与此 CDC 对象关联的 Windows 设备环境。

17

DeleteTempMap

CWinApp 空闲时间处理程序调用,以删除由 FromHandle 创建的任何临时 CDC 对象。还分离设备环境。

18

Detach

将 Windows 设备环境从此 CDC 对象分离。

19

DPtoHIMETRIC

将设备单位转换为 HIMETRIC 单位。

20

DPtoLP

将设备单位转换为逻辑单位。

21

Draw3dRect

绘制一个三维矩形。

22

DrawDragRect

在矩形被拖动时擦除并重绘它。

23

DrawEdge

绘制矩形的边缘。

24

DrawEscape

访问视频显示的绘图功能,这些功能无法通过图形设备接口 (GDI) 直接获得。

25

DrawFocusRect

以用于指示焦点的样式绘制矩形。

26

DrawFrameControl

绘制框架控件。

27

DrawIcon

绘制图标。

28

DrawState

显示图像并应用视觉效果以指示状态。

29

DrawText

在指定的矩形中绘制格式化文本。

30

DrawTextEx

使用其他格式在指定的矩形中绘制格式化文本。

31

Ellipse

绘制椭圆。

32

EndDoc

结束由 StartDoc 成员函数启动的打印作业。

33

EndPage

通知设备驱动程序页面即将结束。

34

EndPath

关闭路径括号并将括号定义的路径选入设备环境。

35

EnumObjects

枚举设备环境中可用的笔和画刷。

36

Escape

允许应用程序访问特定设备无法通过 GDI 直接获得的功能。还允许访问 Windows 转义函数。应用程序发出的转义调用将被翻译并发送到设备驱动程序。

37

ExcludeClipRect

创建一个新的剪辑区域,该区域由现有剪辑区域减去指定的矩形组成。

38

ExcludeUpdateRgn

通过从窗口的剪辑区域中排除更新区域来阻止在窗口的无效区域内绘制。

39

ExtFloodFill

使用当前画刷填充区域。提供比 FloodFill 成员函数更多的灵活性。

40

ExtTextOut

使用当前选定的字体在矩形区域内写入字符字符串。

41

FillPath

关闭当前路径中的任何开放图形,并使用当前画刷和多边形填充模式填充路径的内部。

42

FillRect

使用特定画刷填充给定矩形。

43

FillRgn

使用指定的画刷填充特定区域。

44

FillSolidRect

用纯色填充矩形。

45

FlattenPath

将路径中选定的任何曲线转换为当前设备环境,并将每个曲线转换为一系列线。

46

FloodFill

用当前画刷填充区域。

47

FrameRect

在矩形周围绘制边框。

48

FrameRgn

使用画刷在特定区域周围绘制边框。

49

FromHandle

在给定设备环境句柄时返回指向 CDC 对象的指针。如果 CDC 对象未附加到句柄,则会创建一个临时 CDC 对象并将其附加。

50

GetArcDirection

返回设备环境的当前弧方向。

51

GetAspectRatioFilter

检索当前纵横比过滤器的设置。

52

GetBkColor

检索当前背景颜色。

53

GetBkMode

检索背景模式。

54

GetBoundsRect

返回指定设备环境的当前累积边界矩形。

55

GetBrushOrg

检索当前画刷的原点。

56

GetCharABCWidths

检索给定范围内连续字符的宽度(以逻辑单位为单位),这些字符来自当前字体。

57

GetCharABCWidthsI

检索给定范围内连续字形索引的宽度(以逻辑单位为单位),这些字形索引来自当前 TrueType 字体。

58

GetCharacterPlacement

检索有关字符字符串的各种类型的信息。

59

GetCharWidth

检索给定范围内连续字符的分数宽度,这些字符来自当前字体。

60

GetCharWidthI

检索给定范围内连续字形索引的宽度(以逻辑坐标为单位),这些字形索引来自当前字体。

61

GetClipBox

检索当前剪辑边界的紧密边界矩形的尺寸。

62

GetColorAdjustment

检索设备环境的颜色调整值。

63

GetCurrentBitmap

返回指向当前选定的 CBitmap 对象的指针。

64

GetCurrentBrush

返回指向当前选定的 CBrush 对象的指针。

65

GetCurrentFont

返回指向当前选定的 CFont 对象的指针。

66

GetCurrentPalette

返回指向当前选定的 CPalette 对象的指针。

48

GetCurrentPen

返回指向当前选定的 CPen 对象的指针。

67

GetCurrentPosition

检索笔的当前位置(以逻辑坐标为单位)。

68

GetDCBrushColor

检索当前画刷颜色。

69

GetDCPenColor

检索当前笔颜色。

70

GetDeviceCaps

检索有关给定显示设备的功能的指定类型的设备特定信息。

71

GetFontData

从可缩放字体文件检索字体度量信息。要检索的信息通过指定字体文件中的偏移量和要返回的信息长度来识别。

72

GetFontLanguageInfo

返回有关指定显示环境的当前选定字体的信息。

73

GetGlyphOutline

检索当前字体中轮廓字符的轮廓曲线或位图。

74

GetGraphicsMode

检索指定设备环境的当前图形模式。

75

GetHalftoneBrush

检索半色调画刷。

76

GetKerningPairs

检索指定设备环境中当前选定的字体的字符间距对。

77

GetLayout

检索设备环境 (DC) 的布局。布局可以是左到右(默认)或右到左(镜像)。

78

GetMapMode

检索当前映射模式。

79

GetMiterLimit

返回设备环境的斜接限制。

80

GetNearestColor

检索给定设备可以表示的与指定逻辑颜色最接近的逻辑颜色。

81

GetOutlineTextMetrics

检索 TrueType 字体的字体度量信息。

82

GetOutputCharWidth

使用输出设备上下文从当前字体中检索连续字符组中各个字符的宽度。

83

GetOutputTabbedTextExtent

计算输出设备上下文上字符字符串的宽度和高度。

84

GetOutputTextExtent

使用当前字体计算输出设备上下文上文本行的宽度和高度,以确定尺寸。

85

GetOutputTextMetrics

从输出设备上下文中检索当前字体的度量。

86

GetPath

检索定义选中到设备上下文中的路径中找到的线条端点和曲线控制点的坐标。

87

GetPixel

检索指定点处的像素的 RGB 颜色值。

88

GetPolyFillMode

检索当前的多边形填充模式。

89

GetROP2

检索当前的绘图模式。

90

GetSafeHdc

返回m_hDC,即输出设备上下文。

91

GetStretchBltMode

检索当前的位图拉伸模式。

92

GetTabbedTextExtent

计算属性设备上下文上字符字符串的宽度和高度。

93

GetTextAlign

检索文本对齐标志。

94

GetTextCharacterExtra

检索字符间距量的当前设置。

95

GetTextColor

检索当前的文本颜色。

96

GetTextExtent

使用当前字体计算属性设备上下文上文本行的宽度和高度,以确定尺寸。

97

GetTextExtentExPointI

检索指定字符串中将在指定空间内适合的字符数,并填充一个数组,其中包含每个字符的文本范围。

98

GetTextExtentPointI

检索指定字形索引数组的宽度和高度。

99

GetTextFace

将当前字体的字体名称复制到缓冲区中,作为以 null 结尾的字符串。

100

GetTextMetrics

从属性设备上下文中检索当前字体的度量。

101

GetViewportExt

检索视口的 x 和 y 范围。

102

GetViewportOrg

检索视口原点的 x 和 y 坐标。

103

GetWindow

返回与显示设备上下文关联的窗口。

104

GetWindowExt

检索关联窗口的 x 和 y 范围。

105

GetWindowOrg

检索关联窗口原点的 x 和 y 坐标。

106

GetWorldTransform

检索当前的世界空间到页面空间的转换。

107

GradientFill

使用渐变颜色填充矩形和三角形结构。

108

GrayString

在给定位置绘制暗淡(灰色)文本。

109

HIMETRICtoDP

将 HIMETRIC 单位转换为设备单位。

110

HIMETRICtoLP

将 HIMETRIC 单位转换为逻辑单位。

111

IntersectClipRect

通过形成当前区域和矩形的交集来创建一个新的剪裁区域。

112

InvertRect

反转矩形的内容。

113

InvertRgn

反转区域中的颜色。

114

IsPrinting

确定设备上下文是否用于打印。

115

LineTo

从当前位置绘制一条线到某个点,但不包括该点。

116

LPtoDP

将逻辑单位转换为设备单位。

117

LPtoHIMETRIC

将逻辑单位转换为 HIMETRIC 单位。

118

MaskBlt

使用给定的掩码和光栅运算组合源和目标位图的颜色数据。

119

ModifyWorldTransform

使用指定的模式更改设备上下文的全局转换。

120

MoveTo

移动当前位置。

121

OffsetClipRgn

移动给定设备的剪裁区域。

122

OffsetViewportOrg

相对于当前视口原点的坐标修改视口原点。

123

OffsetWindowOrg

相对于当前窗口原点的坐标修改窗口原点。

124

PaintRgn

使用选定的画刷填充区域。

125

PatBlt

创建位模式。

126

Pie

绘制一个扇形。

127

PlayMetaFile

在给定设备上播放指定元文件的内容。PlayMetaFile 的增强版本显示存储在给定增强格式元文件中的图片。元文件可以播放任意次数。

128

PlgBlt

执行源设备上下文中的指定矩形中的颜色数据位到给定设备上下文中的指定平行四边形的位块传输。

129

PolyBezier

绘制一个或多个贝塞尔曲线。当前位置既不使用也不更新。

130

PolyBezierTo

绘制一个或多个贝塞尔曲线,并将当前位置移动到最后一个贝塞尔曲线的结束点。

131

PolyDraw

绘制一组线段和贝塞尔曲线。此函数更新当前位置。

132

Polygon

绘制一个由两点或更多点(顶点)组成的多边形,这些点由线连接。

133

Polyline

绘制一组连接指定点的线段。

134

PolylineTo

绘制一条或多条直线,并将当前位置移动到最后一条线的结束点。

135

PolyPolygon

创建两个或多个多边形,这些多边形使用当前的多边形填充模式填充。多边形可以是不相交的,也可以是重叠的。

136

PolyPolyline

绘制多个系列的连接线段。此函数既不使用也不更新当前位置。

137

PtVisible

指定给定点是否在剪裁区域内。

138

RealizePalette

将当前逻辑调色板中的调色板条目映射到系统调色板。

139

Rectangle

使用当前笔绘制矩形,并使用当前画刷填充它。

140

RectVisible

确定给定矩形的任何部分是否位于剪裁区域内。

141

ReleaseAttribDC

释放m_hAttribDC,即属性设备上下文。

142

ReleaseOutputDC

释放m_hDC,即输出设备上下文。

143

ResetDC

更新 m_hAttribDC 设备上下文。

144

RestoreDC

将设备上下文恢复到以前使用SaveDC保存的状态。

145

RoundRect

使用当前笔绘制一个圆角矩形,并使用当前画刷填充它。

146

SaveDC

保存设备上下文的当前状态。

147

ScaleViewportExt

相对于当前值修改视口范围。

148

ScaleWindowExt

相对于当前值修改窗口范围。

149

ScrollDC

水平和垂直滚动位矩形。

150

SelectClipPath

选择当前路径作为设备上下文的剪裁区域,使用指定的模式将新区域与任何现有剪裁区域组合。

151

SelectClipRgn

使用指定的模式将给定区域与当前剪裁区域组合。

152

SelectObject

选择 GDI 绘图对象(如笔)。

153

SelectPalette

选择逻辑调色板。

154

SelectStockObject

选择 Windows 提供的预定义库存笔、画刷或字体之一。

155

SetAbortProc

设置程序员提供的回调函数,如果必须中止打印作业,Windows 将调用该函数。

156

SetArcDirection

设置用于圆弧和矩形函数的绘图方向。

157

SetAttribDC

设置 m_hAttribDC,即属性设备上下文。

158

SetBkColor

设置当前背景颜色。

159

SetBkMode

设置背景模式。

160

SetBoundsRect

控制指定设备上下文的边界矩形信息的累积。

161

SetBrushOrg

指定将选入设备上下文的下一个画刷的原点。

162

SetColorAdjustment

使用指定的值设置设备上下文的颜色调整值。

163

SetDCBrushColor

设置当前画刷颜色。

164

SetDCPenColor

设置当前笔颜色。

165

SetGraphicsMode

设置指定设备上下文的当前图形模式。

166

SetLayout

更改设备上下文 (DC) 的布局。

167

SetMapMode

设置当前映射模式。

168

SetMapperFlags

更改字体映射器在将逻辑字体映射到物理字体时使用的算法。

169

SetMiterLimit

设置设备上下文斜接连接长度的限制。

170

SetOutputDC

设置 m_hDC,即输出设备上下文。

171

SetPixel

将指定点处的像素设置为指定颜色的最接近近似值。

172

SetPixelV

将指定坐标处的像素设置为指定颜色的最接近近似值。SetPixelVSetPixel 快,因为它不需要返回实际绘制的点的颜色值。

173

SetPolyFillMode

设置多边形填充模式。

175

SetROP2

设置当前绘图模式。

176

SetStretchBltMode

设置位图拉伸模式。

177

SetTextAlign

设置文本对齐标志。

178

SetTextCharacterExtra

设置字符间距量。

179

SetTextColor

设置文本颜色。

180

SetTextJustification

在字符串中的换行符中添加空格。

181

SetViewportExt

设置视口的 x 和 y 范围。

182

SetViewportOrg

设置视口原点。

183

SetWindowExt

设置关联窗口的 x 和 y 范围。

184

SetWindowOrg

设置设备上下文的窗口原点。

185

SetWorldTransform

设置当前的世界空间到页面空间的转换。

186

StartDoc

通知设备驱动程序新的打印作业已开始。

187

StartPage

通知设备驱动程序新的页面已开始。

188

StretchBlt

将位图从源矩形和设备移动到目标矩形,如果需要,则拉伸或压缩位图以适合目标矩形的尺寸。

189

StrokeAndFillPath

关闭路径中任何打开的图形,使用当前笔描绘路径轮廓,并使用当前画刷填充其内部。

190

StrokePath

使用当前笔呈现指定的路径。

191

TabbedTextOut

在指定位置写入字符字符串,将制表符扩展到制表位位置数组中指定的值。

192

TextOut

使用当前选定的字体在指定位置写入字符字符串。

193

TransparentBlt

将颜色数据位块从指定的源设备上下文传输到目标设备上下文,在传输中渲染指定的颜色透明。

194

UpdateColors

通过逐像素地将客户端区域中的当前颜色与系统调色板匹配,更新设备上下文的客户端区域。

195

WidenPath

将当前路径重新定义为如果使用当前选定到设备上下文中的笔描绘路径将绘制的区域。

线条

步骤 1 - 让我们通过创建一个名为MFCGDIDemo的新基于 MFC 的单文档项目来了解一个简单的示例。

Lines

步骤 2 - 项目创建完成后,转到解决方案资源管理器,双击“源文件”文件夹下的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

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

折线

折线是一系列连接的线。这些线存储在 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 - 运行此应用程序时,您将看到以下输出。

Polylines

矩形

矩形是由四个构成四个直角的边组成的几何图形。与线条一样,要绘制矩形,必须定义其起始位置和结束位置。要绘制矩形,可以使用 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 - 运行此应用程序时,您将看到以下输出。

Rectangles

正方形

正方形是由四个构成四个直角的边组成的几何图形,但每条边的长度必须相等。

让我们来看一个简单的例子。

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
}

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

Squares

扇形

扇形是由椭圆的一小部分和从椭圆中心延伸到每一侧的两条线限定的。要绘制扇形,可以使用 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
}

步骤 2 - 运行此应用程序时,您将看到以下输出。

Pies

弧线

弧线是椭圆的一部分或一段,这意味着弧线是不完整的椭圆。要绘制弧线,可以使用 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)

序号 值和方向
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

要绘制弦,可以使用 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
}

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

Chords

此示例中的弧线方向设置为顺时针方向。

颜色

颜色是增强对象美观外观的最基本对象之一。颜色是非空间对象,添加到对象以修改其某些视觉方面。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
}

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

Colors

字体

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

画笔

画笔是用于在设备上下文中绘制线条和曲线的工具。在图形编程中,画笔也用于绘制几何闭合形状(如矩形或多边形)的边界。Microsoft Windows 考虑两种类型的画笔 - 装饰几何

当画笔只能绘制固定宽度(小于或等于 1 像素)的简单线条时,称为装饰画笔。当画笔可以采用不同的宽度和各种端点时,称为几何画笔。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

画刷

画刷是一种绘图工具,用于填充闭合形状或线条的内部。画刷的行为就像拿起一桶油漆并将其倒在某个地方。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
}

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

Brushes
广告