首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MFC C++中的初学者,为什么设备上下文需要创建一个旧的字体/Bitmap/etc指针,然后在最后创建selectObject()呢?

问MFC C++中的初学者,为什么设备上下文需要创建一个旧的字体/Bitmap/etc指针,然后在最后创建selectObject()呢?
EN

Stack Overflow用户
提问于 2015-07-03 00:11:29
回答 1查看 1K关注 0票数 2

例如:

代码语言:javascript
复制
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选择它作为字体?这是一个很好的编程实践,还是这个应用程序真的需要它?

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

当我删除代码的最后一行时,没有什么改变。提前谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 07:56:14

设备上下文

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

在任何时候,都会在设备上下文中选择一个图形对象。由于系统在创建设备上下文时将一组默认对象存储到设备上下文中,所以当设备上下文返回给系统进行清理时,应用程序必须保留该状态。这就是为什么

代码语言:javascript
复制
dc.SelectObject (pOldFont);

对此负有责任。

此要求在SelectObject中有文档记录。

此函数返回以前选定的指定类型的对象。应用程序在完成与新对象的绘图之后,应该始终用原始的默认对象替换新对象。

​

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

​

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31196565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档