65.9K
CodeProject 正在变化。 阅读更多。
Home

在位图上渲染文本

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.23/5 (22投票s)

2004年3月1日

CPOL

2分钟阅读

viewsIcon

74325

downloadIcon

1267

在位图上渲染文本

Sample Image - GDITest.jpg

引言

我很少需要用到与GDI相关的东西。事实上,在过去的13年里,我用一只手就能数清需要用到GDI的次数。我说的不是Windows GUI应用程序日常会做的那些普通事情,而是那些更复杂的与笔、画笔、线条、位图、DC等相关的事情。如果这是你每天都在做的事情,那么你已经远远超出了本文的范围。我把这篇文章归类为“中等”,但它实际上应该介于“初级”和“中等”之间,更像是“初级+”的级别。

无论如何,这是一个有趣且具有教育意义的练习,它需要在位图上渲染一些文本。一个这样的例子可以在这里找到。作为一个“小题大做”的例子,我最初的想法是如何手动创建位图结构,添加文本的相应位,并将结果保存到文件中。我想这是可行的,但是这种方法的代价与结果不成比例。

我的下一个想法是,也许GDI+ API中存在一些方便的功能。我确实找到了`Image`和`Graphics`类,它们似乎有合适的方法。我的第一次尝试失败了,所以我最后尝试了一下,只使用GDI。

结果

首先要将位图图像加载到与显示DC兼容的设备上下文(DC)中。这是使用……完成的

HBITMAP hBitmap = (HBITMAP) LoadImage(0, 
  _T("somefile.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (NULL != hBitmap)
{
    CBitmap Bitmap;
    Bitmap.Attach(hBitmap);

    CDC dcCompatible;
    dcCompatible.CreateCompatibleDC(pDC);

    CBitmap *pOldBitmap = dcCompatible.SelectObject(&Bitmap);
}

此时,一个临时DC存在并包含加载的位图。下一步是在同一个DC上渲染一些文本。这是使用……完成的

dcCompatible.TextOut(x, y, _T("Some text here"));

现在我们在位图上有了文本。要将结果渲染到显示器,我们需要将临时DC的内容复制到显示DC。这是使用……完成的

pDC->BitBlt(0, 0, width, height, &dcCompatible, 0, 0, SRCCOPY);

就是这样!我还做了一些其他的事情,但它们更多的是为了示例项目,而不是本文的上下文。例如打印预览、处理没有定义壁纸的桌面以及查询网络和工作站以获取有用的信息。

参考文献

我不得不参考多个网站和USENET新闻组才能找到我需要的信息。特别感谢Mike Sutton和Johan Rosengren。

© . All rights reserved.