凌阳大学计划论坛
凌阳科技大学计划论坛

发表新主题 回复该主题
本主题被查看2351次, 共4个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: 【分享】MicroWin下绘制任意大小的字体
本主题由 版主 lameck 于 2008-5-6 11:29:00 执行 移动主题 操作
超级版主
UID: 30216
来自: 水泊
精华: 3
积分: 10099
帖子: 5701
注册: 2005-3-19 22:10:00
状态: 离线
威望: 8765.00
金钱: 13738.50 元
只看楼主 2008-04-17 16:18
【分享】MicroWin下绘制任意大小的字体
同事在做一款游戏,游戏中的用于显示分数的字体比较大,但是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^

My Blog(http://www.mculee.cn)

#1  
超级版主
UID: 30216
来自: 水泊
精华: 3
积分: 10099
帖子: 5701
注册: 2005-3-19 22:10:00
状态: 离线
威望: 8765.00
金钱: 13738.50 元
只看楼主 2008-04-17 16:35
回复: 【分享】MicroWin下绘制任意大小的字体
效果图:

 附件: 您所在的用户组无法下载或查看附件

My Blog(http://www.mculee.cn)

#2  
让我们以有限追求无限
超级版主
UID: 63311
来自: 大海
精华: 1
积分: 1210
帖子: 989
注册: 2006-11-2 11:12:00
状态: 离线
威望: 431.00
金钱: 830.65 元
2008-06-05 13:45
回复:【分享】MicroWin下绘制任意大小的字体

******************************************
我为人人,人人为我
******************************************
#3  
小学生
UID: 97002
来自:
精华: 0
积分: 2
帖子: 2
注册: 2009-3-26 21:16:00
状态: 离线
威望: 0
金钱: 0.35 元
2009-06-12 12:29
回复:【分享】MicroWin下绘制任意大小的字体
请问一下版主为什么MicroWin下创建的按钮和窗口不支持汉字啊?是不是要加一个汉字字库啊。是的话请问一下怎么加啊。谢谢
#4  
发表新主题 回复该主题
本主题被查看2351次, 共4个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2010-03-10 22:55:32
京ICP备05061966号

版权所有 凌阳科技大学计划  
         Powered by Discuz!NT 1.0.2656    Copyright © 2001-2010 Comsenz Inc.
Processed in 0.128 seconds