Dialog имеет современный дизайн времени, но старый взгляд на время выполнения (с помощью Visual C++ и редактора ресурсов)



Я создаю диалог с редактором ресурсов Visual C++.

Когда я запускаю кнопку test редактора, компоненты диалога отображаются с современным видом, в то время как при запуске приложения, которое создает и показывает диалог, он отображается со старым видом...Я просто использую вызовы WINAPI для отображения диалогового окна, а не MFC.
Вот скриншот (верхнее изображение-это пример пользовательского интерфейса во время разработки, другое-это пользовательский интерфейс во время выполнения):



Ссылка текст



Кто-нибудь знает, что я делаю не так???

Заранее спасибо,

Генри

668   6  

6 ответов:

Указывает ли манифест приложения, что вы хотите использовать comctl32.dll версия 6? Это одно из требований использования визуальных стилей и более современного вида в windows XP.

Чтобы создать манифест и разрешить приложению использовать визуальные стили.

Ссылка на comctl32, связанной.lib и вызов InitCommonControls (см. документацию Platform SDK в библиотеке MSDN).

Добавьте файл YourApp.exe.манифест для вашего исходного дерева, которое имеет следующее Формат XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity
  version="1.0.0.0"
  processorArchitecture="X86"
  name="CompanyName.ProductName.YourApp"
  type="win32"
 />
 <description>Your application description here.</description>
 <dependency>
  <dependentAssembly>
   <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    processorArchitecture="X86"
    publicKeyToken="6595b64144ccf1df"
    language="*"
   />
  </dependentAssembly>
 </dependency>
</assembly>

Добавьте манифест в файл ресурсов вашего приложения следующим образом

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
Примечание: при добавлении предыдущей записи в ресурс необходимо отформатировать ее в одну строку. Кроме того, файл XML-манифеста можно поместить в тот же каталог, что и исполняемый файл приложения. Операционная система сначала загрузит манифест из файловой системы, а затем проверит раздел ресурсов исполняемого файла. Приоритет имеет версия файловой системы.

У вас есть манифест, правильно настроенный для использования версии 6 commctl32.DLL в свой проект? Если нет, вы не получите тематические элементы управления.

В более поздних версиях Visual Studio это обычно делается с помощью # pragma, например (это для x86, скопировано из нового проекта, созданного с помощью VS2005):

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

Если вы добавляете его в один из исходных файлов проекта и перестраиваете, манифест будет сгенерирован компоновщиком и добавлен в приложение. Для другого процессора архитектуры, вам нужно будет изменить значение" processorArchitecture". (Почему ВС не может разобраться в этом сам-загадка, которую читателю остается разгадать...)

(Как отметили некоторые другие, вы также можете вручную создать манифест и добавить его в список .файл rc. Это более многословно, но дает вам полный контроль над содержанием манифеста.)

Некоторые элементы управления Windows Forms примут свое новое обличье, как только приложение будет привязано к версии 6.0 Comctl32.файл DLL.
и как вы можете достичь этого описано в разделе Использование визуальных стилей Windows XP с элементами управления в Windows Forms

У меня есть решение для VC6, но я не уверен, что оно будет работать в VS 2008.
(также проверьте Эту статью на предмет того, что вызывает проблему)

Вот пример простого файла манифеста, который я использовал для его решения:

Создайте следующий XML-файл,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
                 manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="Microsoft.Windows.YourApplication"
    type="win32"
/>
<description>YourApplication</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Во-первых, давайте добавим две строки к ресурсу.H файл. Просто скопируйте и вставьте следующее:

#define IDR_MANIFEST  1
#define RT_MANIFEST  24

Теперь откройте файл пользовательских ресурсов приложения. Обычно он находится в каталоге res; расширение по умолчанию: .алгоритм RC2. Вручную добавьте следующую строку:

// Add manually edited resources here...
IDR_MANIFEST RT_MANIFEST MOVEABLE PURE
             "res\\ApplicationManifestXMLFile"

Замените ApplicationManifestXMLFile фактическим именем файла (XML, который вы создали).

Вопрос задает C++, а этот другой вопрос показывает, как сделать это более чисто.

Для .Net 2.0+, пожалуйста, смотрите > эту статью MSDN о том, как это сделать с одной строкой кода, а именно:

Main() 
{
    Application.EnableVisualStyles();
}

Я надеюсь, что это поможет кому-то найти эту тему.

Расширение существующих ответов...

MSDN: требования к сборке общих элементов управления Windows Vista

Опуская следующее в stdafx.h хорошо работал для меня и помог отобразить во время выполнения тонкую стилизацию границ, показанную в Редакторе ресурсов диалогового окна VS:

#ifdef UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

Comments

    Ничего не найдено.