初学者在 MFC C++ 中,为什么设备上下文需要创建一个旧的 Font/Bitmap/etc 指针,然后在最后选择对象()?

Moe*_*673 1 mfc gdi visual-c++ cbitmap

案例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

代码在围绕原点(移动到窗口中心)的圆圈中打印“Hello, MFC”。

输出

为什么创建 CFont 指针然后 dc 选择它作为字体?这只是良好的编程习惯还是这个应用程序真的需要它?

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

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

IIn*_*ble 5

设备上下文

设备上下文是定义一组图形对象及其相关属性以及影响输出的图形模式的结构。该图形对象包括画线笔,绘画和填充,位图用于复制或滚动屏幕,用于定义所述一组可用的颜色,对限幅和其它操作的区域的调色板,和用于路径的一部分的一个刷绘画和绘图操作。

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

dc.SelectObject (pOldFont);
Run Code Online (Sandbox Code Playgroud)

为...负责。

此要求记录在SelectObject下:

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


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