C ++ / Win32: Визуальные стили XP - элементы управления не отображаются? - PullRequest
3 голосов
/ 30 мая 2010

Хорошо, так что я довольно новичок в C ++ и Windows API, и я просто пишу небольшое приложение. Я хотел, чтобы мое приложение использовало визуальные стили как в XP, Vista, так и в Windows 7, поэтому я добавил эту строку в начало моего кода:

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

Казалось, что он отлично работает на моей машине с Windows 7 и Vista. Но когда я попробовал приложение в XP, приложение не загружало какие-либо элементы управления (например, кнопки, метки и т. Д.) - даже окна сообщений не отображались.

Это изображение показывает небольшое тестовое приложение, которое я только что собрал, чтобы продемонстрировать то, что я пытаюсь объяснить: http://img704.imageshack.us/img704/2250/myapp.png

В этом тестовом приложении я не использую какой-либо необычный или сложный код. Я просто взял самый простой пример кода из библиотеки MSDN (http://msdn.microsoft.com/en-us/library/ff381409.aspx)) и добавил раздел в сообщение WM_CREATE, чтобы создать кнопку:

MyBtn = CreateWindow(L"Button", L"My Button", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 25, 25, 100, 30, hWnd, NULL, hInst, 0);

Но я просто не могу понять, что происходит и почему это не работает. Есть идеи, ребята? Спасибо заранее.

(Кстати, приложение работает в XP, если я удаляю секцию манифеста сверху - очевидно, без визуальных стилей. Однако я должен также упомянуть, что приложение было создано с использованием Visual C ++ 2010 Express на компьютере с Windows 7 - если что имеет значение?)

Ответы [ 4 ]

1 голос
/ 21 марта 2011

Я тоже столкнулся с этой проблемой сегодня после обновления до Win7 и VC ++ 2010 pro.

Сначала я подумал, что, возможно, мой манифест поврежден, и что еще хуже, так это то, что это был мой второй проект в VC ++ 2010, и первый работал нормально на Win7 и XP.

Итак, я пришел к выводу, что включение InitCommonControls () в начале моей программы исправило эту проблему, почему?

Итак, я добавил это вверху моего кода:

#include <Commctrl.h>
#pragma comment (lib, "Comctl32.lib")

И это в моем коде инициализации:

InitCommonControls();

Кроме того, в дополнение к моему поиску ответов, в VC + 2010 теперь есть элемент управления SysLink в списке элементов управления, и по этой причине мой первый проект работает нормально. Добавьте один из них в диалоговое окно, и если для обработки уведомления добавлен код, Comctl32.lib и InitCommonControls или InitCommonControlsEx не нужны? Встроенная программа будет также работать в Win7 и XP, если встроен манифест с общими элементами управления!

1 голос
/ 07 марта 2011
#pragma comment(linker,"/manifestdependency:\"type='win32'...
1 голос
/ 30 мая 2010

Вы звоните InitCommonControlsEx? Подробности здесь .

0 голосов
/ 30 мая 2010

Ганс Пассант:

Идея включения «манифеста» в исполняемый файл состоит в том, чтобы не вызывать InitCommonControls.

Без манифеста ОС автоматически инициализирует использование самых «общих» элементов управления comomn. И если манифест найден в исполняемых ресурсах - именно эти элементы управления инициализируются.

Ну, я не знаю точную причину проблемы, я могу только попытаться угадать.

  • Может быть, общие элементы управления версии 6.0 не поддерживаются в Windows XP (?)
  • Возможно, манифест должен включать все необходимые элементы управления, а не только версию. Vista и может Wnd7 автоматически инициализировать все «общие» общие элементы управления указанной версии, тогда как Windows XP может не
...