我在C#中创建了一个COM Interop Control,用于我的PB应用程序。如果我将一个ole控件添加到我的userobject并在画家中选择我的C#对象,则会创建一个 olecustomcontrol ,并且一切都按预期工作。但是,为了在为64位平台构建项目时使用64位版本的对象(在PB Classic 12.6中),我添加了一个ole控件但在被要求选择对象时点击取消,所以 olecontrol 已创建,我可以使用InsertClass在运行时选择我的对象。这对我有用,但我有一个问题:当用户点击我的控件,激活它时,MDI窗口上的工具栏图标就会消失。从我所做的研究来看,听起来PB可能期望ole对象提供菜单和工具栏,但我的PB菜单项不受影响,它只是工具栏。我的控件确实包含一个工具栏(控件是我创建的富文本编辑器,用于解决内置控件的一些缺点)但我也尝试创建一个新的Interop Control,其上只有一个纯文本框,并得到相同的结果。实际上我也尝试使用我系统上安装的Microsoft控件之一(Microsoft InkEdit Control),并再次得到相同的结果。
有谁知道如何修复此工具栏问题? (我不知所措,但我猜测我可能需要告诉PB忽略OLE工具栏和/或告诉我的C#对象不要宣传工具栏。)
答案 0 :(得分:1)
啊,我们必须支持几十年的遗留代码......
以下将进行一些研究,最终可能无法解决问题,但我会试一试。我将实现一个“代理”COM对象,它作为.NET OLE控件和OLE容器之间的额外层。这样的对象将作为OLE控件暴露给PB运行时,并作为OLE容器暴露给.NET控件,并转发两者之间的COM方法调用。使用C ++ / ATL对这个图层进行编码要容易得多,但它也应该适用于裸C#。
然后我会观察IOleInPlaceFrame
和IOleInPlaceUIWindow
接口上的调用,并阻止那些导致不希望的工具栏行为的行为(如果有的话)。我还将暴露给PB运行时的OLE控制接口集限制在最低限度。
答案 1 :(得分:1)
这似乎是个错误。我创建了一个非常简单的应用程序,它将数据检索到ole控件中,并且在任何菜单项中都没有代码。一旦获取数据并且ole控件获得焦点,主MDI工具栏就会消失。有人应该向SAP报告该错误。
https://answers.sap.com/questions/300798/toolbar-disappear-when-ole-control-get-focus.html