凌阳科技大学计划论坛

首页 » eCos技术讨论专区 » eCos下的GUI程序设计 » 【分享】MicroWin下绘制任意大小的字体
leajian - 2008-4-17 16:18:00
同事在做一款游戏,游戏中的用于显示分数的字体比较大,但是MicroWin内的字体大小太死板,无法直接输出需要的字体大小。当然可以为MicroWin再添加其他的字库,甚至添加TrueType字库等,但是目前的项目没必要搞的这么麻烦,所以就想到了MicroWin提供的一个非常有用的函数:StretchBlt

StretchBlt函数可以将一个HDC的绘图内容任意比例缩放到另外一个HDC内显示,这就为我们使用固定大小的系统字体来得到任意大小的字体提供了基础。先来看代码吧:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDc;
PAINTSTRUCT ps;
HDC hMemDC;
HBITMAP hMemBMP, hOldBMP;
RECT FontSize = {0,0,0,0};
char strDisplay[] = "1234564564";
switch(message)
{
  case WM_PAINT:
  hDc = BeginPaint(hWnd, &ps);
  DrawText(hDc, strDisplay, -1, &FontSize, DT_CALCRECT);
  hMemDC = CreateCompatibleDC(hDc);
  hMemBMP = CreateCompatibleBitmap(hMemDC, FontSize.right, FontSize.bottom);
  hOldBMP = SelectObject(hMemDC, hMemBMP);
  SetTextColor(hMemDC, RGB(255,0,255));
  SetBkMode(hMemDC, TRANSPARENT);
  TextOut(hMemDC, 0, 0, strDisplay, -1);
  StretchBlt(hDc,0, 0, FontSize.right * 3, FontSize.bottom * 3, hMemDC, 0, 0, FontSize.right, FontSize.bottom - 1, MWROP_SRCINVERT);
  EndPaint(hWnd, &ps);
  break;
  default:
  return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


上面的代码是最简单的一个窗口回调函数,里面对WM_PAINT消息做了处理,在WM_PAINT消息中绘制了一个字符串。

接下来看看它是怎么工作的:

首先,在获取到当前窗口的HDC后,使用CreateCompatibleDC函数创建了一个与之匹配的内存设备,用于在内存虚拟屏幕中绘制图像。这个过程是为了临时创建一个虚拟的屏幕,然后使用系统字体输出字符串,然后将这个屏幕的内容copy至目标屏幕上;

接下来,使用CreateCompatibleBitmap函数为内存虚拟屏幕创建一个位图,位图的大小应该与使用系统字体显示的字符串所占用的区域一致,所以,在创建位图之前,首先使用DrawText函数测量出了字符串需要占用的区域大小;

然后,为了让字符的背景透明,使用了SetBkMode函数设置了透明模式;

最后,在内存虚拟屏幕上先使用系统字体把字符串画出来,然后利用StretchBlt函数“放大”到原来的3倍显示在屏幕上即可~~~

^o^
leajian - 2008-4-17 16:35:00
效果图:

 附件: 您所在的用户组无法下载或查看附件
woodstar123 - 2008-6-5 13:45:00
:D
 1 
查看完整版本: 【分享】MicroWin下绘制任意大小的字体