例如:
void CMainWindow::OnPaint ()
{
CRect rect;
GetClientRect (&rect);
CPaintDC dc (this);
dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
dc.SetBkMode (TRANSPARENT);
for (int i=0; i<3600; i+=150) {
LOGFONT lf;
::ZeroMemory (&lf, sizeof (lf));
lf.lfHeight = 160;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = i;
lf.lfOrientation = i;
::lstrcpy (lf.lfFaceName, _T ("Arial"));
CFont font;
font.CreatePointFontIndirect (&lf);
CFont* pOldFont = dc.SelectObject (&font);
dc.TextOut (0, 0, CString (_T (" Hello, MFC")));
//WHY THIS LINE?
dc.SelectObject (pOldFont);
}
}代码在原点周围的圆圈中打印“Hello,MFC”(它被移动到窗口的中心)。

为什么要创建CFont指针,然后dc选择它作为字体?这是一个很好的编程实践,还是这个应用程序真的需要它?
我在网络上看到了类似的代码,使用位图和其他设备上下文对象。目的是什么?
当我删除代码的最后一行时,没有什么改变。提前谢谢你的帮助。
发布于 2015-07-03 07:56:14
设备上下文是定义一组图形对象及其相关属性以及影响输出的图形模式的结构。图形对象包括用于线条绘制的笔、用于绘制和填充的画笔、用于复制或滚动屏幕部分的位图、用于定义可用颜色集的调色板、用于裁剪和其他操作的区域以及用于绘制和绘图操作的路径。
在任何时候,都会在设备上下文中选择一个图形对象。由于系统在创建设备上下文时将一组默认对象存储到设备上下文中,所以当设备上下文返回给系统进行清理时,应用程序必须保留该状态。这就是为什么
dc.SelectObject (pOldFont);对此负有责任。
此要求在SelectObject中有文档记录。
此函数返回以前选定的指定类型的对象。应用程序在完成与新对象的绘图之后,应该始终用原始的默认对象替换新对象。
注意:这与MFC无关,而是与Windows有关。MFC仅仅实现了一个自动资源管理包装器。状态管理仍然需要显式代码。
https://stackoverflow.com/questions/31196565
复制相似问题