Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Определение типа отрисовки контролов(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 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
14-1086522662
Артем К.
2004-06-06 15:51
2004.06.27
Компоненты различных измерительных уст-тв


3-1085831410
AlexG
2004-05-29 15:50
2004.06.27
Непонятная проблема с передачей double чисел в Excel...


9-1078085062
miek
2004-02-29 23:04
2004.06.27
Что делать?


8-1081487287
HydraMarat
2004-04-09 09:08
2004.06.27
Сглаживание иконок а-ля WinXP


8-1081334219
ЁПРСТ
2004-04-07 14:36
2004.06.27
Как нарисовать на форме текст без фона?