#vsto
#vsto
Вопрос:
Я создаю надстройку Outlook2010, которая будет отображать, сколько электронных писем в папке, назовем ее foo, и у нее много вложенных папок (во время загрузки ленты я суммировал все количество элементов из foo и его вложенных папок. У меня нет проблем с этой частью. Однако, если пользователь перетащит электронное письмо, скажем, из папки «Входящие», в папку foo или любую из ее подпапок или наоборот, количество элементов на пользовательской ленте отражаться не будет.
Я пытался использовать событие folder beforeitemmove, но мне не удалось запустить его, а также поскольку пользователь может создать столько вложенных папок в foo, сколько захочет. Я не думаю, что событие beforeitemmove сработает.
Есть ли способ обновить элемент управления лентой (кнопку)
Ответ №1:
http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/9da68794-a026-49b7-b919-651dc231846c/
Вызов invalidate может сработать?
Ответ №2:
Для Word я только что обнаружил, что вызов Office:: IRibbonUI::Invalidate() приводит к утечке объекта GDI. Для всех моих кнопок ленты вызывается соответствующий обратный вызов getImage. Похоже, что Word не освобождает старые изображения.
Я еще не нашел способ включать / отключать кнопки ленты «на лету».
Комментарии:
1. Вы можете включать / отключать кнопки ленты «на лету», используя метод обратного вызова getEnabled для соответствующей кнопки. И вы можете обновить состояние, в котором включена кнопка ленты, вызвав RibbonUI. Метод аннулирования.
Ответ №3:
Да, аннулирование работает. Но при использовании в сочетании с обратным вызовом getImage для кнопки это приведет к утечке объектов GDI (по 2 объекта GDI на обновление для каждой кнопки).
Я только что получил рабочий код, хотя:
Используйте глобальный обратный вызов для загрузки образа:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad" loadImage="OnLoadImage">
Определяется как:
STDMETHOD(OnLoadImage)(BSTR imageName, IPictureDisp** ppdispImage);
соответственно.
[
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.