首页 > 开发 > 综合 > 正文

IFontDisp和CFontHolder的使用问题

2024-07-21 02:29:22
字体:
来源:转载
供稿:网友

最近处理一个控件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? 天晓得。

注册会员,创建你的web开发资料库,
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表