最近處理一個控件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? 天曉得。
新聞熱點
疑難解答