|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……成绩比来处置一个控件Bug,发明COM组件字体读取风趣成绩。
Bug形貌:
简体中文下的使用编写:
ocx.Font.Name="宋体"对控件的字体初始化
text1.text=ocx.CellFont(1,1,KDS_FontProp_Name)读取单位格1,1的字体
控件申明:当响应单位格未设置字体时,将利用控件的字体设置。
成绩:
在繁体中文下运转,text1失掉字体名为乱码。
剖析:
先简化成绩:
实验:在简体操纵体系下
ocx.Font.Name=“abcd”
MsgboxKDS12.CellFont(1,1,KDS_FontProp_Name)
失掉输入:abcd。
呵呵,这明显不合错误。
MsgBoxKDS12.Font.Name
输入:Arial
嗯,这才是对的,哪有甚么abcd字体啊。
好了,成绩找到了,"宋体"两个字到繁体中文下,固然会酿成乱码啦。
因而,开端断定是CellFont接口的成绩。
检察代码:
取字体的办法以下:
CFontHolder&rFontHolder=pControl->InternalGetFont();
HFONThFont=rFontHolder.GetFontHandle();
LOGFONTlf;
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?天知道。
效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。 |
|