Windows API一日一练(30)GetTextMetrics函数

来源:互联网 发布:linux安全狗安装 编辑:程序博客网 时间:2024/05/21 03:17
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
 
函数GetTextMetrics声明如下:
 
#ifndef NOTEXTMETRIC
 
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
#ifdef UNICODE
#define GetTextMetrics GetTextMetricsW
#else
#define GetTextMetrics GetTextMetricsA
#endif // !UNICODE
 
hdc是当前设备的句柄。
lptm是获取当前字体属性的保存结构。它的结构定义如下:
typedef struct tagTEXTMETRICW
    {
    LONG tmHeight;
    LONG tmAscent;
    LONG tmDescent;
    LONG tmInternalLeading;
    LONG tmExternalLeading;
    LONG tmAveCharWidth;
    LONG tmMaxCharWidth;
    LONG tmWeight;
    LONG tmOverhang;
    LONG tmDigitizedAspectX;
    LONG tmDigitizedAspectY;
    WCHAR tmFirstChar;
    WCHAR tmLastChar;
    WCHAR tmDefaultChar;
    WCHAR tmBreakChar;
    BYTE tmItalic;
    BYTE tmUnderlined;
    BYTE tmStruckOut;
    BYTE tmPitchAndFamily;
    BYTE tmCharSet;
    }     TEXTMETRICW;
 
调用这个函数的例子如下:
#001 //
#002 //界面显示输出.
#003 //
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
#005 //
#006 void CCaiWinMsg::OnDraw(HDC hDC)
#007 {
#008  //
#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
#010  
#011  //设置输出字符串的颜色.
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
#013 
#014  RECT rcText;   
#015 
#016  //设置新字体.
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
#018 
#019  //获取当前字体的高度.
#020  TEXTMETRIC tmFont;
#021  if (GetTextMetrics(hDC,&tmFont))
#022  {
#023         rcText.left = 10;
#024         rcText.top = 40;
#025         rcText.right = 300;
#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
#027  }
#028  else
#029  {
#030         rcText.left = 10;
#031         rcText.top = 40;
#032         rcText.right = 300;
#033         rcText.bottom = 80;
#034  }
#035 
#036  //创建黑色的画刷,
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
#038 
#039  //用黑色的画刷填充四边形的颜色.
#040  FillRect(hDC,&rcText,hbrush);
#041 
#042  //删除画刷.
#043  DeleteObject(hbrush);
#044        
#045  //设置透明背景
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
#047 
#048  //显示字符串在四边形的中间位置.
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
#051 
#052  //恢复原来的字体.
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
#054  DeleteObject(hFont);
#055 
#056  //恢复原来的模式.
#057  SetBkMode(hDC,nOldMode);
#058 
#059  //恢复原来的颜色.
#060  SetTextColor(hDC,crOld);
#061 }
#062 
 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有刘鑫这样的闺蜜该怎么办 电脑开机网络初始化失败怎么办 电脑放音乐没有声音怎么办 苹果手机gprs信号弱怎么办 苹果导航gprs信号弱怎么办 au没有波形 没有声音怎么办 屏幕驱动板坏了怎么办 安吉星流量超了怎么办 网络被伪基站覆盖怎么办 骨头渣子卡嗓子里怎么办 执法仪记录仪关不了机怎么办 执法记录仪开不了机怎么办 华为警务通丢了怎么办 华德安执法记录仪死机怎么办 行车仪内存满了怎么办 海康威视摄像头没有通道怎么办 电脑屏膜变大了怎么办 手机2g模块坏了怎么办 腾讯大王卡是2g怎么办 华为手机4g坏了怎么办 优盘中毒打不开怎么办 vr头戴链接不起怎么办 人在缺氧的时候怎么办 脑缺氧供血不足怎么办 睡多了大脑缺氧怎么办 吃了过期的东西怎么办 吃了过期的牛肉怎么办 生存战争肉腐烂了怎么办? 家里进了蝙蝠找不到了怎么办 方舟手游恐龙找不到了怎么办 这是我的战争怎么办 小孩吃坏东西呕吐发烧怎么办 睿芽密码忘了怎么办 做绿豆糕太稀了怎么办 自热火锅吃完后怎么办 自煮火锅吃完了怎么办 自热火锅没熟怎么办 厕所被米饭堵了怎么办 减完肥肉特别松怎么办 新开的熟食店没人光顾怎么办 吃剩的软炸里脊怎么办