Форум: "Основная";
Текущий архив: 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.039 c