在位图上渲染文本






3.23/5 (22投票s)
在位图上渲染文本
引言
我很少需要用到与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。