Главная страница
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.027 c
3-1082525479
guest_Dmitry
2004-04-21 09:31
2004.05.16
Изменить формулу вычисления поля Computed Source


4-1080228728
Prov
2004-03-25 18:32
2004.05.16
SetWindowText - поменять Caption елементов управления


14-1082968229
}|{yk
2004-04-26 12:30
2004.05.16
XML + XPATH


6-1080039228
V@LER@N
2004-03-23 13:53
2004.05.16
Сниффер - не сниффер...


4-1080725400
DmitryNekl
2004-03-31 13:30
2004.05.16
Как вставить иконку?