IFontDisp和CFontHolder的使用问题

王朝other·作者佚名  2006-03-30
窄屏简体版  字體: |||超大  

最近处理一个控件Bug,发现COM组件字体读取有趣问题。

Bug描述:

简体中文下的应用编写:

ocx.Font.Name = "宋体" '对控件的字体初始化

text1.text = ocx.CellFont(1,1, KDS_FontProp_Name) '读取单元格1,1的字体

控件说明:当相应单元格未设置字体时,将使用控件的字体设置。

问题:

在繁体中文下运行,text1得到字体名为乱码。

分析:

先简化问题:

尝试:在简体操作系统下

ocx.Font.Name = “abcd”

Msgbox KDS12.CellFont(1,1, KDS_FontProp_Name)

得到输出:abcd。

呵呵,这显然不对。

MsgBox KDS12.Font.Name

输出:Arial

嗯,这才是对的,哪有什么abcd字体啊。

好了,问题找到了,"宋体"两个字到繁体中文下,当然会变成乱码啦。

因此,初步确定是CellFont接口的问题。

查看代码:

取字体的方法如下:

CFontHolder &rFontHolder = pControl->InternalGetFont();

HFONT hFont = rFontHolder.GetFontHandle();

LOGFONT lf;

CFont *pFont = CFont::FromHandle(hFont);

pFont->GetLogFont(&lf);

OK,明白了,是通过LOGFONT取字体信息。

再试一下,不管你输入什么字体名,它取出来就是啥。嘿。

尝试换种方式取字体信息:

(代码不完全,未处理出错情况,只是举例)

IFont * pIFont = NULL;

rFontHolder.GetFontDispatch()->QueryInterface(&pIFont)))

然后,用IFont的接口取信息,如:get_Name(&bstrTemp)

试试,这下取出是正确应用的字体,当设置错误时,会取出默认值。

错误排除。

似乎的结论:

采用 IFontDisp接口方式设置的字体信息,

当采用pControl->InternalGetFont()取回CFontHolder后,

如果通过GetFontHandle 取出Windows句柄,然后获取字体信息,并

不一定是真实的应用值(即例子中,一旦出错,并不取出系统默认值,而是

错误的设置值,其中保存的似乎是一个临时值,而非实际的最终应用值)

如果采用GetFontDispatch 取出IFontDisp,然后再取出IFont来取值,

才是正确地。

Why? 天晓得。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航