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

Вниз

Отрисовка 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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.034 c
7-1080737806
Xtz
2004-03-31 16:56
2004.05.16
My ТoolBar on Internet Explorer????????????/


3-1082189318
Koba
2004-04-17 12:08
2004.05.16
База данных


1-1083398451
tlan
2004-05-01 12:00
2004.05.16
Трудности с разжатием потока (ZLib)


1-1083230319
Петя
2004-04-29 13:18
2004.05.16
Автоскрол в TRichEdit


1-1083529948
KEBZ
2004-05-03 00:32
2004.05.16
Text





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