我正在创建C#
COM
ActiveX
控件。现在坚持一件事而且无法理解它。
当我创建stdole.IFontDisp类型的属性时,在控件初始化或我们尝试从客户端代码访问它时,不会调用此属性的Set
部分。也没有错误消息。它什么也没做。
此前IFontDisp
已转换为stdFont
,但我通过手动修改TypeLib / IDL解决了这个问题。感谢:C# and COM, IFontDisp getting converted to StdFont
财产实施(C#):
public stdole.IFontDisp Font_Design_Time_Only
{
get
{
System.Drawing.Font fnt = new System.Drawing.Font(base.Font.Name,
base.Font.Size, base.Font.Style, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
return ActiveXCtrlHelper.GetIFontDispFromFont(base.Font);
}
set
{
// _stdFont = value;
_TestFont = value;
base.Font = this.ctrl_test.Font= ActiveXCtrlHelper.GetFontFromIFontDisp(value);
this.ctrl_test.Invalidate();
base.Invalidate();
}
}
IDL:
[id(0x60020018), propput, bindable]
HRESULT Font_Design_Time_Only([in] IFontDisp* ppFontDisp);
[id(0x60020018), propget, bindable]
HRESULT Font_Design_Time_Only([out, retval] IFontDisp** ppFontDisp);
[id(0x60020018), propputref, bindable]
HRESULT Font_Design_Time_Only([in] IFontDisp* ppFontDisp);
VBA:
此代码无效。永远不会调用Set
访问者。
Me.Dummy_Control.Font_Design_Time_Only.Bold = True
但也没有引起任何错误。
以下代码在哪里工作并调用Set
部分
Dim x As IFontDisp
Set Me.Dummy_Control.Font_Design_Time_Only = x
为什么我会出现这种行为?
提前谢谢。
更新:
IFontDisp实施:
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(Ictrl_testEvents))]
[Guid("C04102EB-5DE2-4CC0-9DC7-C82498FC9AFE")]
public partial class ctrl_test : UserControl, Ictrl_test, IObjectSafety, IFontDisp{
// ......其他代码
#region IFontDisp Impelmentation
public bool Bold
{
get { return _FBold; }
set { _FBold = value; }
}
//rest of the implementation