Відображення 32-бітних іконок ціною порушення відображення контролю

Ситуацію, що склалася, можна назвати битвою з 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 inState) then DrawHot lese if (cdsSelected in State) then DrawSelected else DrawNormal; end;

Де DrawHot, DrawSelected і DrawNormal – процедури, що оперують з бітмапом і потім просто копіюють його на Canvas тулбара. Повторю, працюють вони правильно, ось тільки за наявності маніфесту DrawSelected не викликається.

Так, щось мабуть складно загорнув.

Пояснюю коротше: мені потрібно навчитися малювати іконки, серед яких можуть бути 32-бітові (з альфа-каналом, для Windows XP). Зробити це необхідно без застосування manifest.

Або потрібно пояснити дивну поведінку тулбарів, вірніше їх кнопок із призначеним DropdownMenu. За наявності маніфесту натиснутий стан малюється як ненатиснутий.

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

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

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

Так, і, до речі, меню теж тримає альфаканал.

Взагалі DrawIconEx, якщо не помиляюся, малює іконку нормально, навіть якщо маніфест не підключений. Головне, щоб XP була. А ImageList ручками краще.