Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

Как программно изменить стиль окон и кнопок в XP   Найти похожие ветки 

 
AndreyProg   (2005-05-25 21:57) [0]

Помогите!
Мне нужно, чтобы окна программы, написанной под Windows98 в Delphi5, при запуске в WindowsXP отображались тоже в классическом стиле.
Как это сделать программно? С помощью API или манифестов? Способ?
Заранее спасибо.


 
Gero ©   (2005-05-25 22:18) [1]

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


 
AndreyProg   (2005-05-26 07:02) [2]

Если я ничего не делаю, то окна отображаются в стиле WindowsXP.
????????????


 
Gero ©   (2005-05-26 07:05) [3]


> AndreyProg   (26.05.05 07:02)

Какие окна ты имеешь ввиду?


 
AndreyProg   (2005-05-26 17:08) [4]


> Gero ©   (26.05.05 07:05)

Окна (TForm) моей программы, конечно.

Можно ли, запуская программу в системе с глобальным стилем оформления "стиль WindoewsXP", сделать так, чтобы окна моей (только моей) программы отображались в "классическом стиле", как в Windows98?

Или подскажите, как программно изменить глобальный стиль оформления WindoewsXP.


 
alpet ©   (2005-05-26 17:15) [5]

Обыкновенно, если не вставлять в ресурсы приложения манифест (и не оставлять рядом с exe-файлом), все его окна будут отображаться без применения визуальных стилей.


 
Gero ©   (2005-05-26 17:39) [6]


> alpet ©   (26.05.05 17:15)

Ты ошибаешься.

> AndreyProg   (25.05.05 21:57)

Можно поступить так:

SetWindowTheme(Form.Handle, "  ", "  "); // — в параметрах строки из двух пробелов

Функция находится в модуле UxTheme.


 
Gero ©   (2005-05-26 17:41) [7]

Нет, все же проблемы не обязательны.
Просто пустые строки.


 
Gero ©   (2005-05-26 17:41) [8]


> проблемы

пробелы


 
alpet ©   (2005-05-26 17:53) [9]

У меня по крайней мере так, только заголовок окон остается скругленным, в случае не использования манифеста.


 
Gero ©   (2005-05-26 17:59) [10]


> alpet ©   (26.05.05 17:53)

Не только заголовок, а все элементы окна верхнего уровня рисуются с темами.
Вот о них-то и речь.


 
Игорь Шевченко ©   (2005-05-26 18:04) [11]

А в манифесте убрать common controls ?


 
alpet ©   (2005-05-26 18:05) [12]

Gero ©   (26.05.05 17:59) [10]
Это странное поведение ОС, она не должна применять визуальный стиль к приложению не использующему манифест.


 
Gero ©   (2005-05-26 18:28) [13]


> А в манифесте убрать common controls ?

Нет никакого манифеста.

> alpet ©   (26.05.05 18:05)

Да кто ж спорит.
Вероятно, этому есть какое-то разумное обьяснение.
Наверное это последствие того, что XP перекрывает WindowProc всех топовых окон.


 
Игорь Шевченко ©   (2005-05-26 18:28) [14]

alpet ©   (26.05.05 18:05) [12]

"a visual style can define the overall appearance of controls, and enable an ISV to configure the visual interface to coordinate with their application interface. Additionally, visual styles provide a mechanism for all Windows-based applications to apply visual styles.

....

End users choose how they want the desktop controls to appear by making selections on the Appearance tab of the display option in Control Panel."

И ни слова про необходимость манифеста...


 
Игорь Шевченко ©   (2005-05-26 18:29) [15]

Gero ©   (26.05.05 18:28) [13]

Без манифеста окно отображается в соответсвии с выбранной пользователем темой.


 
Gero ©   (2005-05-26 18:33) [16]


> Игорь Шевченко ©   (26.05.05 18:29)

Окна верхнего уровня — нет.


 
Игорь Шевченко ©   (2005-05-26 18:34) [17]

Gero ©   (26.05.05 18:33) [16]

От сервис-пака не может зависеть ? (XP сейчас под рукой нет, могу только дома посмотреть)


 
Gero ©   (2005-05-26 18:38) [18]


> Игорь Шевченко ©   (26.05.05 18:34)

Нет, не может.

Это не баг, это фича.
Зачем ее ввели — непонятно, но факт остается фактом.


 
Игорь Шевченко ©   (2005-05-26 18:44) [19]

Gero ©   (26.05.05 18:38) [18]

Факт - это тот, что окно приложения, собранного без манифеста, при установленной теме XP отображается в классическом стиле ?


 
alpet ©   (2005-05-26 18:45) [20]

Два куска с той же страницы:

By default, all applications running under the Windows XP operating system use version 5 to maintain compatibility with earlier versions of ComCtl32.dll.

По умолчанию значит все...

If you want your application to use ComCtl32.dll version 6, you must add an application manifest that indicates that version 6 should be used if it is available. Version 6 includes some new controls and new options for other controls, but the biggest change is support for the Windows XP visual styles architecture. See the Using Windows XP Visual Styles for information on how to create application manifests.

То есть если не использовать манифест, система по идее обязана подключить 5 версию. Можно проверить версию загруженной библиотеки, для этого случая.


 
Игорь Шевченко ©   (2005-05-26 18:57) [21]

alpet ©   (26.05.05 18:45) [20]

Во втором сервис-паке ничего не изменилось ? Потому как у меня осталось впечатление, что в нем приложения по умолчанию как раз отобразаются в текущем стиле. В первом XP, без сервис-паков они совершенно точно отображались в классическом стиле.


 
Gero ©   (2005-05-26 19:24) [22]


> Факт - это тот, что окно приложения, собранного без манифеста,
> при установленной теме XP отображается в классическом стиле  ?

Нет, отображается с темами как с манифестом, так и без него.
Если темы включены, ессно.


 
Gero ©   (2005-05-26 19:30) [23]


> Во втором сервис-паке ничего не изменилось ?

Нет, ни один сервис-пак на стили никак не повлиял.
По крайней мере, я не замечал никаких изменений.


 
AndreyProg   (2005-05-26 20:50) [24]


> Gero
,

> Игорь Шевченко
,

> alpet


Классно вы тут поговорили! А мне-то что делать?
SetWindowTheme работает не так как надо.
Мне надо, чтобы и заголовки окон были в классическом стиле. У них размеры другие.

Всё же, как с помощью WinAPI поменять глобальный стиль системы? Как  вызвать ту же проц/функ, которая меняет стиль через  Панель управления/Оформление/Окна и кнопки?


 
Gero ©   (2005-05-26 22:38) [25]


> А мне-то что делать?

Я тебе привел готовый код.

> Мне надо, чтобы и заголовки окон были в классическом стиле.
> У них размеры другие.

Твоих окон?

> Всё же, как с помощью WinAPI поменять глобальный стиль системы?
> Как  вызвать ту же проц/функ, которая меняет стиль через
>  Панель управления/Оформление/Окна и кнопки?

Не советую тебе такое делать, для этого есть пользователь.
Если же уверен, что твоим пользователям это понравится, то:
http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21172764.html


 
Игорь Шевченко ©   (2005-05-26 23:06) [26]

Вот и я добрался до XP. При включенных темах неклиентская часть Popup и Overlapped окон, а также скроллбары в дочерних элементах управления отображаются в соответствии с текущей темой вне зависимости от манифеста. Значит, я неправильно понял пост Gero относительно окон верхнего уровня и мы говорили об одном и том же.

Относительно того, как можно помочь автору - попробовать использовать в его приложении вызов функции SetThemeAppProperties (0) из UxTheme.dll, не знаю, поможет или нет, попробовать уже нет возможности. Вызывать, естественно, нужно с динамической загрузкой UxTheme.Dll при условии, что операционная система - XP. Для того, чтобы проверить, используются ли темы в его приложении, можно вызвать функцию IsAppThemed из той же DLL.


 
Gero ©   (2005-05-26 23:16) [27]


> Игорь Шевченко ©   (26.05.05 23:06)

Да, я имел ввиду то же.

> Относительно того, как можно помочь автору

Вызов SetWindowTheme(Handle, "", ""); — отключит тему для любого произвольного окна.
Динамическая загрузка UxTheme.dll уже реализована в модуле UxTheme.pas, в нем же в комментариях можно найти краткое описание всех входщих в него функций.

Но судя по [24] автор хочет вовсе отключить темы.


 
AndreyProg   (2005-05-27 20:43) [28]


> Gero ©   (26.05.05 23:16) [27]


Повторяю: SetWindowTheme(Handle, "", "");  работает не так как нужно. Да, она отменяет все темы, но всё же заголовок окна (TForm) остается того же размера, что и при теме "стиль WindowsXP". Мне же нужно, чтобы размеры оставались такими же, что и при запуске в Windows98.

А темы я хочу отключить лишь постольку-поскольку не найду иного решения проблемы.


 
gdaujk ©   (2005-05-28 06:27) [29]

А почему тебя напрягают размеры заголовков? Если у тебя в зависимости от них меняются размеры "клиентской" области окна (обычно при написанни на чистом API), просто измени их с учётом высоты заголовка окна = GetSystemMetrics(SM_CYCAPTION).


 
AndreyProg   (2005-05-28 13:42) [30]


> Gero ©   (26.05.05 22:38) [25]

Спасибо за ссылку!


> gdaujk ©   (28.05.05 06:27) [29]

Напрягают потому что хочется сохранить стиль! Из эстетических соображениий и ещё:
у меня несколько приложений, работающих одновременно. Они с окнами одного размера, центрированными по середине экрана, но не занимают всю область экрана. Их окна расположены одно поверх другого. У одного("нижнего") приложения есть заголовоки окон, а у других  - нету (borderstyle=bsnone). В Windows98 у меня все точно выверено и "на поверхности" видно только активное приложение. А в XP  позади торчит полоска заголовка "нижнего"  приложения.
Осюда весь сыр-бор.


 
vidiv ©   (2005-05-28 16:48) [31]

А что еще полезного можно вытянуть из модуля UxTheme ? Можно применить свой индивидуальный стиль для своего приложения?


 
Gero ©   (2005-05-29 17:30) [32]


> AndreyProg   (28.05.05 13:42)

Высота заголовка окна никакого отношения к темам не имеет.

> vidiv ©   (28.05.05 16:48)
> Можно применить свой индивидуальный стиль для своего приложения?

Нет.
UxTheme служит исключительно для работы с текущей темой.


 
AndreyProg   (2005-05-29 20:49) [33]


> Gero ©   (29.05.05 17:30) [32]

Как это не имеет отнощения!
Запусти приложение сначала в классической теме, а затем в теме "стиль XP", и увижишь - заголоки становятся выше! Значит это определено в  теме.


 
Gero ©   (2005-05-29 23:04) [34]


> AndreyProg   (29.05.05 20:49)

Я к тому, что высокий заголовок может быть и без тем.
Поэтому тебе нужно ориентироваться на то, что юзер может выставить любой размер заголовка.


 
AndreyProg   (2005-06-02 09:04) [35]

Просьба!
Кто-нибудь проверял этот код?
http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21172764.html
У меня он не работает. Затыкается на первом же обрашении в методу ole-объекта Manager.

Проверьте, пожалуйста!


 
AndreyProg   (2005-06-06 16:42) [36]

Господа, обратите, пожалуйста, внимание на предыдущий вопрос.


 
MacroDenS ©   (2005-06-06 19:13) [37]

Вот дела... Раньше люди искали компоненты, манифесты и прочее для того, чтобы оформить прогу win98+ как под XP. Росли значит, стремились к современности, а теперь вот полюбуйтесь! Дегродация начинается. ИМХО не к добру все это!


 
NikotiN ©   (2005-06-06 20:30) [38]

Как программно изменить стиль окон и кнопок в XP
а как аппаратно?


 
MacroDenS ©   (2005-06-06 20:33) [39]

Маркером дорисуй


 
Abessalom   (2005-06-06 23:42) [40]

BorderStyle := bsSizeToolWin;
 SetWindowTheme(Handle, "", "");
 
 Очень похоже на старый стиль.
 Кнопки в заголовке, если нужны, рисуй и обрабатывай сам, ничего сложного, а также можно найти компоненты.



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.018 c
14-1122212775
SoftX
2005-07-24 17:46
2005.08.14
Чего хочет программист от своей профессии?


1-1122091776
N!tro
2005-07-23 08:09
2005.08.14
Сохранение TreeView и Data


14-1121789262
atruhin
2005-07-19 20:07
2005.08.14
Почему все известные прокси хранят кэш в файлах а не в БД


14-1122357192
Ega23
2005-07-26 09:53
2005.08.14
С днем рождения! 26 июля


14-1122280171
SLP
2005-07-25 12:29
2005.08.14
добавить нового user-a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский