Форум: "WinAPI";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизОпределение типа отрисовки контролов(visual style) под WinXP Найти похожие ветки
← →
Viman © (2004-05-14 10:17) [0]Можно ли как-то узнать в runtime как отрисовываются контролы на форме при подключенном/отключенном манифесте, не проверяя наличие самого мнифеста. Т.е. как отображаются контролы: стандартно или согласно стилю. Вызов нескольких функций стандартной uxtheme.dll(кажеться так называется) ничего мне не дал.
← →
Игорь Шевченко © (2004-05-14 10:18) [1]IsAppThemed,
GetThemeName
и т.д.
← →
Viman © (2004-05-14 10:55) [2]И я так же думал. Ситуация такая. Сам по себе визуальный стиль в системе включен. И соответственно, IsAppThemed возвращает true всегда - неважно при этом подключен манифест или нет.
← →
DVM © (2004-05-14 11:01) [3]
> Viman © (14.05.04 10:55) [2]
Т.е. Вы хотите узнать есть ли у вашей собственной программы манифест? Если он внутри в ресурсе, то это и так ясно, если же его подложил кто-то извне, то можно проверить наличие файла. В сочетани с [1] достаточно, чтобы выяснить, как будут отрисованы контролы.
← →
Viman © (2004-05-14 11:11) [4]Я же написал в вопросе "...не проверяя манифест...". Что такое стили, манифест и как он может подключаться, я знаю. А если файл с манифестом глючный? Винда будет рисовать стандартно, а прога будет думать, что рисуется по стилю, так что ли получается? Может не очень красиво получиться...
← →
Игорь Шевченко © (2004-05-14 11:13) [5]Viman © (14.05.04 10:55)
Я, кстати, ошибся, не GetThemeName, а GetCurrentThemeName.
Кстати, одним из вариантов является получение версии ComCtl32 использующейся в программе. GetComCtlVersion в Comctrls.pas
← →
DVM © (2004-05-14 11:14) [6]
> Viman © (14.05.04 11:11) [4]
> А если файл с манифестом глючный? Винда будет рисовать стандартно,
> а прога будет думать, что рисуется по стилю, так что ли
> получается? Может не очень красиво получиться...
Так внедрить его в ресурс. И будет он использован, а не глючный сторонний. И еще, не знаю поможет ли - вроде бы, если контрол рисуется с учетом темы, то за его отрисовку отвечает CommonControls, а если без учета тем, то User32.dll.
← →
Viman © (2004-05-14 11:36) [7]> DVM
Все бы ничего, естественно, самый простой способ - зашить манифест в тело. Потом проверить его наличие в связке с IsAppThemed. Но, создается компонент и полагаться, что кто-то любезно расстрарается и включит манифест наждежды мало, а принуждать к этому тоже как-то не очень... И как же я узнаю кто меня рисует, user или другой? В этом то и суть.
>Игорь Шевченко ©
GetCurrentThemeName тоже вернет текущую для тему для приложения, но это не значит, что контролы будут обязательно рисоваться по стилю(при отсутсвии манифеста).
"Кстати, одним из вариантов является получение версии ComCtl32 использующейся в программе. GetComCtlVersion в Comctrls.pas" - а вот это нужно попробовать.
Спасибо.
← →
Игорь Шевченко © (2004-05-14 11:38) [8]Также можно попробовать GetWindowTheme применительно к окну (компонента, формыи т.д.)
← →
Viman © (2004-05-18 11:08) [9]Из всего выше оговоренного получилась вот эта функция. Она уже реально покажет как рисуются стандарные контролы в текущем приложении, без проверок манифеста и т.п..
Вернет true, если контролы будут отрисовываться по умолчанию согласно стилю(естественно только под XP и выше).function IsDrawingWithVStyle: Boolean;
const Comctl32Dll = "comctl32"; UxThemeDll = "uxtheme";
funcIsAppThemed = "IsAppThemed";
var fviSize, fviSize2: Cardinal; fviData, fviData2: Pointer;
OVI: TOsVersionInfo; LibHandle: THandle;
IsAppThemed: function : Boolean;stdcall;
begin
result:= false;
OVI.dwOSVersionInfoSize := Sizeof( OVI );
GetVersionEx( OVI );
if (OVI.dwMajorVersion >= 6)
or ((OVI.dwMajorVersion >= 5) and (OVI.dwMinorVersion >= 1)) then
begin
LibHandle:= LoadLibrary(UxThemeDll);
if LibHandle <> 0 then
begin
try
@IsAppThemed:= GetProcAddress(LibHandle, funcIsAppThemed);
if (@IsAppThemed <> nil) and IsAppThemed then
begin
fviSize:= GetFileVersionInfoSize(Comctl32Dll, fviSize);
if fviSize<>0 then
begin
GetMem(fviData, fviSize);
try
result:= GetFileVersionInfo(Comctl32Dll, 0, fviSize, fviData)
and VerQueryValue(fviData, "\", fviData2, fviSize2)
and ((PVSFixedFileInfo(fviData2)^.dwFileVersionMS shr 16) > 5);
finally
FreeMem(fviData, fviSize);
end;
end;
end;
finally
FreeLibrary(LibHandle);
end;
end;
end;
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c