Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.026 c
14-1086463065
тихий вовочка
2004-06-05 23:17
2004.06.27
Что почитать?


14-1086196957
DenZ
2004-06-02 21:22
2004.06.27
Как сделать "Матрицу" на фоне своего окна?


4-1084959583
Elysium
2004-05-19 13:39
2004.06.27
Как написать приложение используя WinAPI


6-1083718856
K
2004-05-05 05:00
2004.06.27
WinSock


3-1086076426
ИМХО
2004-06-01 11:53
2004.06.27
Clarion





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский