Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отключить поддержку стиля Win XP в своей программе [D5, WinXP]


Apl ©   (2004-09-18 04:16:00) 

Если в Win XP(и Win 2003) запущена служба тем, то окна имеют вид резко отличающийся от классического.
Можно ли в таком случае окна моей программы сделать в класическом стиле(Пример : окно электронного словаря из пакета Promt XT выглядит одинаково при любой теме)?


wicked   (2004-09-19 17:32:00) [1]

ЗЫ я дико извиняюсь, но местный скрипт, принимающий данные постинга есть суксь и маздай - так испоганить форматирование моих исходников.... :(


wicked   (2004-09-19 17:30:00) [2]

отключить темы для окна hwnd:
SetWindowTheme(hwnd, WideString(" "), WideString(" "));

включить темы для окна hwnd:
SetWindowTheme(hwnd, nil, nil);

сама функция экспортируется dll'кой UxTheme.dll...
прототип функции на си:
typedef HRESULT __stdcall (*theme_func)(HWND hwnd, LPCWSTR AppName, LPCWSTR SubIdList);

то есть, всё вместе будт выглядеть примерно так (пример на си, влом переводить):


// выносим константой имя длл-ки
#define DLL_NAME "\\UxTheme.dll"
#define BUF_LENGTH MAX_PATH + 16
// имя функции
#define PROC_NAME "SetWindowTheme"

// хендл библиотеки
HMODULE uxt_lib;

typedef HRESULT __stdcall (*theme_func)(HWND hwnd, LPCWSTR AppName, LPCWSTR SubIdList);
// указатель на функцию
theme_func SetWindowTheme;

// запускается при старте программы
// (в паскале поместить этот код в секцию Initialization)
void InitStyles(void)
{
#pragma startup InitStyles
char buf[BUF_LENGTH];
uxt_lib = NULL;
SetWindowTheme = NULL;
memset(buf, 0, sizeof(buf));
if(GetSystemDirectory(buf, sizeof(buf) - 1)){
 strcat(buf, DLL_NAME);
 uxt_lib = LoadLibrary(buf);
 if(uxt_lib) SetWindowTheme = (theme_func)GetProcAddress(uxt_lib, PROC_NAME);
}
}

// запускается при выходе из программы
// (в паскале поместить этот код в секцию Finalization)
void DeInitStyles(void)
{
#pragma exit DeInitStyles
if(uxt_lib){
 SetWindowTheme = NULL;
 FreeLibrary(uxt_lib);
 uxt_lib = NULL;
}
}

// собственно сами функции убирания/восстановления стилей окна
void __fastcall RemoveXPStyle(HWND hwnd)
{
if(SetWindowTheme) SetWindowTheme(hwnd, L" ", L" ");
}

void __fastcall RestoreXPStyle(HWND hwnd)
{
if(SetWindowTheme) SetWindowTheme(hwnd, NULL, NULL);
}


Apl   (2004-09-19 03:20:00) [3]

to BorH
Впрочем, попробуй выдрать из ресурсов этого твоего Промта  ресурс, называемый манифестом. Имеет вид текстового XML файла. Он может находиться и в одной папке с главным экзэшником.  И в этом файла, скорее всего, и порыла собака.


нету в каталоге с этим промтом никакого манифеста и в ресурсах тоже... впрочем есть какой - то ресурс с именем 241 содержащий двоичные данные.

to All
Может быть я не правильно выразился, но форма(по умолчанию)создаётся с большим синим заголовком, со скруглёнными краями окон и т.п., вот это-то мне и не нравится.


Kirill   (2004-09-18 17:38:00) [4]

У WinAmp'а и подобных программ вообще нету ни caption'а, ни контролов. Только скины и активные регионы формы


BorH   (2004-09-18 17:33:00) [5]

На Винамп, кстати, скин от этих программ не вешается!! На заметку...


BorH   (2004-09-18 17:32:00) [6]

Насколько я понимаю есть "насильственные" методы нацепить скин - службы типа StyleXP и WindowsBlinds. Вот против них и можно бороться перенастроеным  манифестом. (ИМХО) А без их использования в XP скин насильно не вешается. Проверено.


Kirill   (2004-09-18 16:45:00) [7]

А разве, по-умолчанию, проект создается со стилем темы? К сожалению, проверить сейчас не могу. Создайте пустую форма она уже с видом текущей темы?


BorH   (2004-09-18 15:16:00) [8]

Короче, похоже никто не знает :)..

Впрочем, попробуй выдрать из ресурсов этого твоего Промта ресурс, называемый манифестом. Имеет вид текстового XML файла. Он может находиться и в одной папке с главным экзэшником.  И в этом файла, скорее всего, и порыла собака. Засунь его себе в :) ресурсы с таким же названием как и в Промте.

ИМХО.


Рамиль   (2004-09-18 10:47:00) [9]

Интересный подход. А мне может классика не нравится. Если пользователь захочет, то отключит темы. Если для себя пишешь - аналогично.


Apl   (2004-09-18 05:19:00) [10]

а я класику люблю :)


Palladin   (2004-09-18 04:23:00) [11]

Странно... обычно спрашивают как ее включить... а ты уже выключаешь...


Наверх

Титульная страница Поиск, карта сайта Написать письмо