Диалог имеет современный дизайн времени, но старый взгляд на время выполнения (с использованием Visual C ++ и редактора ресурсов) - PullRequest
6 голосов
/ 22 июня 2009

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

текст ссылки

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

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

Ответы [ 6 ]

5 голосов
/ 22 июня 2009

Правильно ли настроен манифест для использования версии 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». (Почему VS не может понять это для себя - загадка, которую читатель должен решить ...)

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

4 голосов
/ 22 июня 2009

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

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

Ссылка на ComCtl32.lib и вызов InitCommonControls (см. Документацию Platform SDK в библиотеке MSDN).

Добавьте файл с именем YourApp.exe.manifest в дерево исходных текстов в следующем формате 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 в тот же каталог, что и исполняемый файл вашего приложения. Операционная система сначала загрузит манифест из файловой системы, а затем проверит раздел ресурсов исполняемого файла. Версия файловой системы имеет приоритет.

1 голос
/ 22 июня 2009

У меня есть решение для 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>

Сначала добавим две строки в файл resource.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).

1 голос
/ 22 июня 2009

Некоторые элементы управления Windows Forms примут новый облик, как только приложение будет связано с версией 6.0 Comctl32.dll.
и способы достижения этого описаны в Использование визуальных стилей Windows XP С элементами управления в Windows Forms
0 голосов
/ 18 июля 2016

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

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
0 голосов
/ 22 января 2013

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

Для .Net 2.0+ см. > эту статью MSDN <</a>, чтобы узнать, как сделать это с помощью одной строки кода, например:

Main() 
{
    Application.EnableVisualStyles();
}

Надеюсь, это поможет кому-то, кто ищет эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...