2011-01-19 5 views
1

У меня есть addin для Office 2007, который добавляет панель инструментов с некоторыми кнопками и обработчиками для своих событий OnClick. Когда пользователь нажимает на кнопки, некоторые диалоги показывают. Но эти диалоги имеют устаревший вид Windows 98 с прямоугольными кнопками даже в Windows 7.Office COM add-in, диалоги не имеют темы luna/aero (они выглядят как классический вид Windows 98)

Я знаю, что для включения тематики вам нужен файл манифеста, но это добавление создается с помощью Visual Studio 2008 и добавляет манифест автоматически, которая выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Что нужно изменить, чтобы сделать мой диалог использовать текущую тему вместо Windows 98 выглядеть? Я читал об осознании изоляции, но это тоже не работало.

ответ

4

Как вы обнаружили, добавление манифеста - это только половина битвы. Вы также должны позвонить InitCommonControlsEx function, когда ваша надстройка инициализируется, прежде чем будут созданы какие-либо элементы управления. Это необходимо для регистрации классов окон для общих элементов управления, которые вы используете.

И на всякий случай, если вы скептически относитесь к документации, Microsoft Raymond Chen отправила article on his blog, а затем обратилась именно к этой проблеме.

Если у вас есть какие-либо другие вопросы, проверить эту статью: How to apply Windows XP themes to Office COM add-ins

+0

я добавил InitCommonControlsEx в конструкторе моего класса надстройку, но, похоже, не будет никакого эффекта. Я делаю что-то неправильно? Cconnect :: Cconnect() { \t INITCOMMONCONTROLSEX initcommctrl = {SizeOf (initcommctrl), 0xffffffff}; \t InitCommonControlsEx (& initcommctrl); \t MessageBox (0,0,0,0); } Показанный здесь MessageBox не является тематическим. – sashoalm

+0

Я также добавил #define ISOLATION_AWARE_ENABLED 1 Наверху моего stdafx, но все еще не повезло. – sashoalm

+0

Я только что понял, что InitCommonControlsEx не возвращает FALSE, но быстро публикует сообщение на форуме, объясняя, что проблема возникает из манифеста, и что я должен добавить эту прагму в свой код: #pragma comment (linker, "/ manifestdependency : \ "type = 'win32' name = 'Microsoft.Windows.Common-Controls'" "version = '6.0.0.0' processorArchitecture = '*' publicKeyToken = '6595b64144ccf1df' language = '*' \" ") Это сделал трюк :) На самом деле оказывается, что INITCOMMONCONTROLSEX не нужен в конце концов, возможно, что-то с файлом манифеста было неправильным в моем проекте. Но спасибо вам все равно :) – sashoalm

 Смежные вопросы

  • Нет связанных вопросов^_^