Главная страница
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.48 MB
Время: 0.022 c
7-1081419272
Aleksandr
2004-04-08 14:14
2004.05.16
Как запустить из программы виндовый Dial-Up с заданным именем сое


1-1083230142
Dysan
2004-04-29 13:15
2004.05.16
как текст перекодировать из ISO в win-1251


1-1083163974
Andrew_Rostov
2004-04-28 18:52
2004.05.16
Чтение данных из текстового файла


7-1080809595
Tornado
2004-04-01 12:53
2004.05.16
Диалог


14-1082981418
Андрей Сенченко
2004-04-26 16:10
2004.05.16
Код на оценку. Update INI-файлов