Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Отрисовка 32-битных иконок ценой нарушения отрисовки контрола   Найти похожие ветки 

 
RIMMER ©   (2004-05-02 23:35) [0]

Сложивщуюся у меня ситуацию можно назвать битвой с UxTheme.dll.
Имеется на форме тулбар (VCL) с единственной кнопкой, которой назначен Dropdown Menu. В этом меню нужно отображать 32-битные иконки, которые я на ходу гружу в ImageList. Пришлось слегка поправить исходник TCustomImageList и добавить к проге манифест. Поскольку больше ничего мне от Uxtheme не нужно (а то есть побочные эффекты, о которых ниже), я в Form.OnCreate пишу SetThemeAppProperties(STAP_ALLOW_NONCLIENT).

Дело в том, что еще этот тулбар отрисовывается мною через событие OnCustomDrawButton (прога поддерживает скины). Там, как и полагается, 3 состояния: горячее, нажатое и нормальное. Так вот, без манифеста прога нормально обрабатывает отрисовку тулбара, но не рисует правильно иконки (вместо теней черное поле) - тут все верно, об этом предупреждают в Platform SDK. А если добавить манифест - начинается, пардон, ёк: каким-то макаром кнопка тулбара, будучи нажатой, меню показывает, а как нажатая не рисуется... Иногда рисуется - буквально на одно мгновение, потом снова рисуется как нормальная, не нажатая. (Тут надо сказать, что до применения SetThemeAppProperties был ваще полный ёк - размеры и характер отрисовки кнопки были уж как то совсем неадекватными).

И все эти страдания - ради иконок с мягкими тенями... Подскажите, люди добрые, что я не так делаю? Есть ли какие-нибудь альтернативные методы отрисовки 32-битных иконок? Windows же ведь это как-то делает, хотя бы и завернуто это в Common Controls. Или может в процедуре отрисовки кнопки тулбара что-то не так? На всякий случай код:

procedure TMyForm.ToolBar1CustomDrawButton(Sender: TToolBar;
 Button: TToolButton; State: TCustomDrawState; var DefaultDraw: Boolean);

// кусок кода пропущен
....

begin
 If (cdsHot in State) then DrawHot
 else if (cdsSelected in State) then DrawSelected
      else DrawNormal;
end;


Где DrawHot, DrawSelected и DrawNormal - процедуры, оперирующие с битмапом и потом просто копирующие его на Canvas тулбара. Повторю, работают они верно, вот только при наличии манифеста DrawSelected не вызывается.


 
RIMMER ©   (2004-05-04 00:14) [1]

Так, чё то видать сложно завернул.

Объясняю короче: мне нужно научиться рисовать иконки среди которых могут быть 32-битные (с альфа-каналом, для Windows XP). Сделать это нужно без применения manifest.

Или нужно объяснить странное поведение тулбаров, вернее их кнопок с назначенным DropdownMenu. При наличии манифеста нажатое сотояние отрисовывается как ненажатое.


 
Islander   (2004-05-04 09:27) [2]

Не надо париться, уважаемые. Проблема не в тулбаре, тулбар держит альфаканал. Проблема в ImageList. ImageList надо взять не стандартный дельфевый, а создать ручками на WinAPI с флагом поддержки 32-х битных иконок. А затем через SendMessage присвоить его тулбару


 
Islander   (2004-05-04 10:33) [3]

Да, и кстати, меню тоже держит альфаканал.


 
DVM ©   (2004-05-04 13:32) [4]

Вообще то DrawIconEx, если не ошибаюсь, отрисовывает иконку нормально, даже если манифест не подключен. Главное, чтобы XP была. А ImageList ручками лучше.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.035 c
6-1080652780
Новичёк
2004-03-30 17:19
2004.05.16
Использование буфера при ClientRead.


14-1082656341
Seldon
2004-04-22 21:52
2004.05.16
MulDiv


8-1077984929
Spartak
2004-02-28 19:15
2004.05.16
TMediaPlayer


1-1083561991
Ivolg
2004-05-03 09:26
2004.05.16
Компонента


14-1083050640
VID
2004-04-27 11:24
2004.05.16
Виртуальная MIDI клавиатура.





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