Hi, people! Подскажите plz. как мне, честному программеру, использовать XP-шный стиль для контролов? Т.е. как создать дельфийский аналог XPManifest?
собственно, нужен XP Manifest в ресурсах (#24), либо отдельным файлом (AppName.exe.manifest), плюс вызов InitCommonControls в коде при инициализации UI (чем раньше, тем лучше). пример файла манифеста - в любой XP программе, есть проги для генерации такого манифеста (в PE Explorer'e), делфовый также подойдёт
В ресурс-скрипте пишеш строчку 1 24 "xpstyle.xml" Содержимое xpstyle.xml: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0] <assemblyIdentity type="win32" name="Masm32" version="1.0.0.0" processorArchitecture="*"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/> </dependentAssembly> </dependency> </assembly>
IceStudent как раз в том то и дело, что нужен во-первых, очень часто программеры пакуют свои творения во-вторых, если прога VB, то без InitCommonControls не обойтись к тому же совсем не факт, что в проге по умолчанию есть вызовы comctl32
пишем приложение, которое выводит только MessageBox и все, компилируем, запускаем - все по старому, ложим рядом файлик с именем программки (допустим test.exe) соотв. оформленный test.exe.manifest - оппа, стили работают. Что я делаю не так?
PE Explorer генерирует манифест с указанным значением целевой архитектуры (x86), на XP64 это уже не заработает. "Кроссплатформенный" манифест: processorArchitecture="*". По идее, и "win32" должно быть препятствием, но это не так, работает. masquer Не знаю. Проверил - работает и так (манифест хоть рядом, хоть в ресурсах). Хотя помню, были глюки какие-то. Знаю точно, что если не указать нужный класс в InitCommonControlsEx, то прога сбойнёт (если этот класс в ресурсах диалога, то диалог не создастся).
это уже частности и к стилям никоим боком не относится, а так да, для многих контролов, типа дерева, списка, тулбаров надо их перед созданием инициализировать с соотв. флагами. у меня х86 в манифесте на х64 было все со стилями в том месаджбоксе
Thanks for info,Guys! Покапался в инфе на msdn.com - нашёл файлик http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp /html/xptheming.asp в котором есть общее описание манифестов. Потом нашел ещё http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shell cc/platform/commctls/userex/cookbook.asp где уже поподробнее расказано оструктуре манифеста. Осталось только поэкспериментировать . . .
Расклад. Уроки Iczelion'а. Урок 18. Common Control'ы. Убрал "call InitCommonControls", скомпилил - ProgressBar работает. Далее. "masm32\examples\exampl05\menudemo\". Убрал "call InitCommonControls", скомпилил - все работает. Пробовал на Win2k и W'XP. Вопрос. Вызов InitCommonControls на что-то влияет?
Влияет на линкер, который связывает библиотеку comctl32 с объектником. Линкер игнорирует неиспользуемый импорт, если ф-ю не вызывать, и не импортирует библиотеку, т.к. к ней нет ни одного вызовова. Поэтому вызывая эту ф-ю мы обманываем линкер. /В фасме проще - ничего можно не вызывать, а сделать вид что мы используем хоть одну ф-ю из этой библы, например/ Код (Text): tempVar = InitCommonControls И импорт будет сожержать данную ф-ю даже если мы её не используем.