IFontDisp和CFontHolder的使用问题
2006-03-29 00:58
260 查看
最近处理一个控件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? 天晓得。
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? 天晓得。
相关文章推荐
- C#中Font转stdole.IFontDisp问题
- duilib中CWebBrowserUI的使用问题解决
- Spring RestTemplate的使用(解决put,delete方法无返回值问题)
- 使用css样式 解决input 设置disabled="true"属性后变为灰色问题
- Ubuntu 14.04中使用sublime text 3无法输入中文的问题
- 使用SQL遇到的一些问题记录
- 同时使用ADO与Excel类库冲突的问题
- Caffe框架使用类相关问题整理
- 使用bootstrap返回空白页面问题
- C#中使用存储过程返回值的问题
- Win7+IE8如何使用VS2005调试问题
- vuejs路由使用的问题Error in render function: "TypeError: Cannot read property 'matched' of undefined"
- VS2017使用Docker Compose遇到的问题
- 车辆监控系统使用常见问题
- Android Studio 3.0.0以上butterknife使用问题
- ubuntu 10.04 usb wifi 使用wpa_supplicant无法连网问题
- 关于在Js中使用ThinkPHP的U方法传递参数的问题
- 字符串类string使用的相关问题
- PowerMock使用遇到的问题——2
- Xcode 升级后, 插件无法使用的问题( PluginLoading: Required plug-in compatibility UUID.... )