恼火!高分求助用CreateFontIndirect自定义字体时字体尺寸的问题!
时间:2011-11-06
来源:互联网
因为我要在PictureBox中显示纵向的文字,所以用CreateFontIndirect自定义字体后用TextOut显示上去,核心代码如下:
VB code
我遇到的问题是:我在显示字符串前需要精确知道这个字符串在PictureBox中占的尺寸(以设置对齐),但是用TextOut显示出来的字符串尺寸与用PictureBox.TextWidth(S)算出来的长度总是有一点差异,我研究了一下问题出在LogF.lfHeight = nObj.TextHeight("A"): LogF.lfWidth = nObj.TextWidth("A")这句代码上。比如PictureBox.TextWidth("A")的值是27时,PictureBox.TextWidth("字")的值却是53,而并不是27*2=54,TextOut在输出时好像简单的把汉字当做两个英文字母的宽带来计算了,造成显示的宽度偏大。而我要显示的字符串既有全角汉字又有半角英文,该如何解决这个宽度问题啊?
VB code
Private Sub ShowStr(nObj As Object, nStr As String, ByVal X As Long, ByVal Y As Long, Optional J As Single) '在对象 nObj 上用自定义字体显示字符串 nStr 'nObj:可以是 Form,PictureBox 等拥有 hdc 属性的对象 'J:旋转角度 Dim mFont As Long, nFont As Long, LogF As LOGFONT, s As Long Dim X1 As Long, Y1 As Long '设置自定义字体的属性 LogF.lfEscapement = J * 10 '旋转角度:单位为 1/10 度,所以要乘10 LogF.lfHeight = nObj.TextHeight("A"): LogF.lfWidth = nObj.TextWidth("A") LogF.lfWeight = nObj.Font.Weight '字符的权重:默认400,粗体和斜粗体是 700。设置值>550 转换为700,否则转换为400 LogF.lfFaceName = nObj.Font.Name & vbNullChar '字体名 LogF.lfItalic = nObj.Font.Italic '斜体 LogF.lfUnderline = nObj.Font.UnderLine '下划线 LogF.lfStrikeOut = nObj.Font.Strikethrough '删除线 LogF.lfCharSet = nObj.Font.Charset '字符集 s = CreateFontIndirect(LogF) '用 LogF 创建一种逻辑字体 nFont nFont = SelectObject(nObj.hdc, s) '将字体 mFont 选入到对象 nObj s = LenB(StrConv(nStr, vbFromUnicode)) '中英混合字符串字节数 Zhuan1 ctP180 - J / 180 * ctP180, X, Y, X, Y - LogF.lfHeight * 0.5, X1, Y1 'x1, y1 返回旋转后字符串左上角坐标 TextOut nObj.hdc, X1, Y1, nStr, s '显示字符串 s = SelectObject(nObj.hdc, nFont) '选中字体 nFont DeleteObject s '删除字体 nFont,即:恢复对象的原字体 End Sub
我遇到的问题是:我在显示字符串前需要精确知道这个字符串在PictureBox中占的尺寸(以设置对齐),但是用TextOut显示出来的字符串尺寸与用PictureBox.TextWidth(S)算出来的长度总是有一点差异,我研究了一下问题出在LogF.lfHeight = nObj.TextHeight("A"): LogF.lfWidth = nObj.TextWidth("A")这句代码上。比如PictureBox.TextWidth("A")的值是27时,PictureBox.TextWidth("字")的值却是53,而并不是27*2=54,TextOut在输出时好像简单的把汉字当做两个英文字母的宽带来计算了,造成显示的宽度偏大。而我要显示的字符串既有全角汉字又有半角英文,该如何解决这个宽度问题啊?
作者: yxr_2008 发布时间: 2011-11-06
又发现一个恼火的问题:
LogF.lfFaceName = nObj.Font.Name & vbNullChar
无论设置哪种字体名称,显示出来的字体都大同小异接近于宋体,是怎么回事啊?
LogF.lfFaceName = nObj.Font.Name & vbNullChar
无论设置哪种字体名称,显示出来的字体都大同小异接近于宋体,是怎么回事啊?
作者: yxr_2008 发布时间: 2011-11-06
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28