VSTO:刷新Outlook2010功能区按钮控件标签

时间:2011-05-13 22:31:03

标签: vsto

我正在创建一个Outlook2010加载项,该加载项将显示文件夹中有多少电子邮件将其称为foo,并且它有多个子文件夹(在功能区加载期间,我汇总了所有项目计数来自foo及其子文件夹。我对此部分没有任何问题。但是,如果用户将一封电子邮件拖放到foo文件夹或其任何子文件夹中,或者反之亦然,那么项目将在自定义功能区不会反映。

我尝试使用文件夹preitemmove事件,但我还没有解决它,因为用户可以根据需要在foo下创建尽可能多的子文​​件夹。我不认为beforeitemmove事件会奏效。

有没有办法更新功能区控件(按钮)

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

对于我刚发现的Word,调用Office :: IRibbonUI :: Invalidate()会产生GDI对象泄漏。对于我的所有功能区按钮,将调用相应的getImage回调。似乎Word不会释放旧图像。

我还没有找到一种方法来动态启用/禁用功能区按钮。

答案 2 :(得分:1)

是的,无效的作品。但是当与按钮的getImage回调结合使用时,这将泄漏GDI对象(每个按钮每次刷新2个GDI对象)。

我刚刚获得了正常工作的代码:

使用全局加载图片回调:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad" loadImage="OnLoadImage">

定义为:

STDMETHOD(OnLoadImage)(BSTR imageName,IPictureDisp ** ppdispImage);

RESP。

[
    object,
    uuid(CE895442-9981-4315-AA85-4B9A5C7739D8),
    dual,
    nonextensible,
    helpstring("IRibbonCallback Interface"),
    pointer_default(unique)
]
interface IRibbonCallback : IDispatch{
    [id(0x00000001),helpstring("OnLoad Callback")] HRESULT OnLoad([in]IDispatch* pRibbonUIDispatch);
    [id(0x00000002),helpstring("Button Callback")] HRESULT RibbonButtonClicked([in]IDispatch* pRibbon);
    [id(0x00000003),helpstring("ToggleButton Callback")] HRESULT RibbonToggleButtonClicked([in]IDispatch* pRibbon,[in] VARIANT_BOOL *pvarfPressed);
    [id(0x00000004),helpstring("GetSmallCustomImage Callback")] HRESULT GetSmallCustomImage([in]IDispatch* pRibbon, [out, retval] IPictureDisp** ppdispImage);
    [id(0x00000005),helpstring("GetLargeCustomImage Callback")] HRESULT GetLargeCustomImage([in]IDispatch* pRibbon, [out, retval] IPictureDisp** ppdispImage);
    [id(0x00000006),helpstring("GetLabel Callback")] HRESULT GetCustomLabel([in]IDispatch* pRibbon, [out, retval] BSTR* pbstrLabel);
    [id(0x00000007),helpstring("ShowLabel Callback")] HRESULT GetShowLabel ([in]IDispatch* pRibbon, [out, retval] VARIANT_BOOL *pvarShowLabel);
    [id(0x00000008),helpstring("GetEnabled Callback")] HRESULT GetEnabled ([in]IDispatch* pRibbon, [out, retval] VARIANT_BOOL *pvarEnabled);
    [id(0x00000009),helpstring("GetVisible Callback")] HRESULT GetVisible ([in]IDispatch* pRibbon, [out, retval] VARIANT_BOOL *pvarVisible);
    [id(0x0000000A),helpstring("GetItemPressed Callback")] HRESULT GetItemPressed ([in]IDispatch* pRibbon, [out, retval] VARIANT_BOOL *pvarChecked);
    [id(0x0000000B),helpstring("GetScreentip Callback")] HRESULT GetScreentip ([in]IDispatch* pRibbon, [out, retval] BSTR *pbstrScreentip);
    [id(0x0000000C),helpstring("GetGroupImage Callback")] HRESULT GetGroupImage([in]IDispatch* pRibbon, [out, retval] IPictureDisp** ppdispImage);
    [id(0x0000000D),helpstring("OnLoadImage Callback")] HRESULT OnLoadImage([in]BSTR imageName, [out, retval] IPictureDisp** ppdispImage);
};

看来,当通过全局loadImage回调加载图像时,没有资源泄漏。但是当图像被按钮的getImage回调加载时,新图像被正确加载但我获得了GDI对象泄漏。