Як програмно змінити стиль вікон та кнопок у XP

Допоможіть! Мені потрібно, щоб вікна програми, написаної під Windows98 в Delphi5, при запуску в WindowsXP відображалися також у класичному стилі. Як це зробити програмно? За допомогою API чи маніфестів? Спосіб? Заздалегідь дякую.

Якщо я нічого не роблю, вікна відображаються в стилі WindowsXP. .

> AndreyProg (26.05.05 07:02)Які вікна ти маєш на увазі?

Чи можна, запускаючи програму в системі з глобальним стилем оформлення "стиль WindoewsXP", зробити так, щоб вікна моєї (тільки моєї) програми відображалися в "класичному стилі", як у Windows98?

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

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

SetWindowTheme(Form.Handle, " ", " "); // - У параметрах рядка з двох прогалин

Функція знаходиться у модулі UxTheme.

Ні, все ж таки проблеми не обов'язкові. Просто порожні рядки.

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

А в маніфесті прибрати common controls?

"Вигляд стилю може визначити різновид керування параметрами, а також здатний до ISV налаштовувати visual interface на відповідність зі своїми пристроями.

Натисніть, щоб вибрати, як вони ведуть робочі рамки до з'ясування відповідно до вибору кнопок на з'єднання клавіатури для відображення опції в Control Panel."

І жодного слова про необхідність маніфесту.

Без маніфесту вікно відображається відповідно до обраного користувачатемою.

Від сервіс-паку не може залежати? (XP зараз під рукою немає, можу тільки вдома подивитись)

Це не баг, це фіча. Навіщо її ввели — незрозуміло, але факт залишається фактом.

Факт - це те, що вікно програми, зібраного без маніфесту, при встановленій темі XP відображається в класичному стилі ?

Два шматки з тієї ж сторінки:

Залежно від того, всі програми керування під операційною системою Windows XP використовують версію 5 до maintain compatibility with earlier versions ofComCtl32.dll.

За замовчуванням все означає.

Якщо ви використовуєте ComCtl32.dll версію 6, виmust addapplication manifest, що вказує на те, що версія 6 повинна бути використана, якщо вона є наявною. У версії 6 входять деякі нові керування і нові можливості для інших контролів, але загальна зміна є підтримкою для Windows XP visual styles architecture. Для використання Windows XP Visual Styles for information on how to create application manifests.

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

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

> Факт - це те, що вікно програми, зібраного без маніфесту, > при встановленій темі XP відображається в класичному стилі ?Ні, відображається з темами як з маніфестом, так і без нього. Якщо теми включені, звичайно.

> У другому сервіс-паку нічого не змінилося? Ні, жоден сервіс-пак на стилі ніяк не вплинув. Принаймні, я не помічавніяких змін.

Добре ви тут поговорили! А мені-то що робити? SetWindowTheme працює не так як треба. Мені треба, щоб і заголовки вікон були в класичному стилі. Вони мають розміри інші.

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

> А мені що робити?Я тобі навів готовий код.> Мені треба, щоб і заголовки вікон були у класичному стилі. > У них розміри інші.Твоїх вікон?Все ж таки, як за допомогою WinAPI поміняти глобальний стиль системи? > Як викликати ту ж відсоток/функцію, яка змінює стиль через > Панель керування/Оформлення/Вікна та кнопки?Не раджу тобі таке робити, для цього є користувач. Якщо ж впевнений, що твоїм користувачам це сподобається, то: http:/ /www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21172764.html

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

Повторюю: SetWindowTheme(Handle, "", ""); працює не так, як потрібно. Так, вона скасовує всі теми, але все ж таки заголовок вікна (TForm) залишається того ж розміру, що і при темі "стиль WindowsXP". Мені ж потрібно, щоб розміри залишалися такими ж, як і при запуску в Windows98.

А теми я хочу відключити лише доти не знайду іншого вирішення проблеми.

А чому тебе напружують розміри заголовків? Якщо в тебе в залежності від них змінюються розміри "клієнтської"області вікна (зазвичай при написанні на чистому API) просто зміни їх з урахуванням висоти заголовка вікна = GetSystemMetrics(SM_CYCAPTION).

А що ще корисного можна витягнути з модуля UxTheme? Чи можна застосувати свій індивідуальний стиль для своєї програми?

> AndreyProg (29.05.05 20:49)Я до того, що високий заголовок може бути і без тим. Тому тобі потрібно орієнтуватися на те, що користувач може виставити будь-який розмір заголовка.

Прохання! Хтось перевіряв цей код? http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21172764.html У мене він не працює. Затикається на першому ж запрошенні методом ole-об'єкта Manager.

Панове, зверніть, будь ласка, увагу на попереднє запитання.

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

Як програмно змінити стиль вікон та кнопок у XP а як апаратно?

BorderStyle := bsSizeToolWin; SetWindowTheme(Handle, "", "");

Дуже схожий на старий стиль. Кнопки в заголовку, якщо потрібні, малюй та обробляй сам, нічого складного, а також можна знайти компоненти.

Ще можна так: procedure TForm1.FormResize(Sender: TObject); begin SetWindowRgn(Handle,CreateRectRgn(0, 0, Width, Height),true); end;

Abessalom (06.06.05 23:42) [40] Кнопки в заголовку, якщо потрібні, малюй і обробляй сам, нічого складного, а також можна знайти компоненти.У класичній темі, дійсно , немає проблем, але як у XP отримати розмір кнопок у заголовку?

Чому тоді у мене все відображається нормально, начебто всі апдейти є (Windows XPProf.Edition, складання 2600.xpsp_sp2_grd.050301-1519: Service Pack 2). Чи це стосується лише окремих комп'ютерів?

Гей, хтось, перевірить код http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21172764.html ? Мені треба дізнатися, як запустити цей менеджер.

Abessalom (07.06.05 22:54) [44] Так само як і класичній темі)))Ні. GetSystemMetrics продовжує заперечувати розміри кнопок без теми, а треба дізнатися про розміри тематичних.

Всім дякую! (Особливо Gero)

Abessalom (14.06.05 21:36) [47] Які ваші докази?)))Я дивився. У тебе є приклад цього?