IFontDisp和CFontHolder的使用问题

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个使用 ArcGIS Engine 添加文字的示例代码: ```csharp using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.SystemUI; // 创建一个添加文字的方法 public void AddText(IActiveView activeView, string text, IPoint point) { // 创建文本元素 ITextElement textElement = new TextElementClass(); // 设置文本内容 textElement.Text = text; // 设置文本颜色 IRgbColor textColor = new RgbColorClass(); textColor.Red = 0; textColor.Green = 0; textColor.Blue = 0; ITextSymbol textSymbol = new TextSymbolClass(); textSymbol.Color = textColor; // 设置文本字体和大小 IFontDisp font = new StdFont() as IFontDisp; font.Name = "Arial"; font.Size = 12; textSymbol.Font = font; // 创建文本元素的元素对象 textElement.Symbol = textSymbol; // 创建一个元素容器并添加文本元素 IGraphicsContainer graphicsContainer = activeView as IGraphicsContainer; graphicsContainer.AddElement(textElement, 0); // 刷新地图视图以显示添加的文本元素 activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } // 调用添加文字方法的示例代码 public void AddTextExample(AxMapControl mapControl) { // 获取当前地图视图的活动视图 IActiveView activeView = mapControl.ActiveView; // 创建一个坐标点来确定文本位置 IPoint point = new PointClass(); point.X = 100; // 文本的 X 坐标 point.Y = 100; // 文本的 Y 坐标 // 调用添加文字方法,传入文本内容和坐标点 AddText(activeView, "Hello, World!", point); } ``` 你可以将上述代码添加到 ArcGIS Engine 的应用程序中,并调用 `AddTextExample()` 方法来添加指定位置的文本。请注意,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。希望对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值