1

一个例子:

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 选择它作为字体?这只是良好的编程实践还是这个应用程序真的需要它?

我在网上看到过类似的代码,它使用位图和其他设备上下文对象执行此操作。目的是什么?

当我删除最后一行代码时,没有任何变化。在此先感谢您的帮助。

4

1 回答 1

5

设备上下文

设备上下文是一种结构,它定义了一组图形对象及其相关属性,以及影响输出的图形模式。图形对象包括用于画线的笔、用于绘画和填充的画笔、用于复制或滚动屏幕部分的位图、用于定义可用颜色集的调色板、用于剪切和其他操作的区域以及用于绘画和绘图操作。

在任何时候,只有一个图形对象被选入设备上下文。由于系统在创建设备上下文时将一组默认对象存储到设备上下文中,因此当设备上下文被交回系统进行清理时,应用程序必须保留该状态。那是什么

dc.SelectObject (pOldFont);

为...负责。

此要求记录在SelectObject下:

此函数返回先前选择的指定类型的对象。应用程序在使用新对象完成绘制后,应始终将新对象替换为原始默认对象。


注意:这与 MFC 无关,而是与 Windows GDI 有关。MFC 仅仅实现了一个自动资源管理包装器。状态管理仍然需要显式代码。

于 2015-07-03T07:56:14.337 回答