Добавление настоящих прозрачных кнопок 32x32 из растрового изображения на плоскую панель инструментов - PullRequest
0 голосов
/ 21 сентября 2018

Мое приложение создает панель инструментов и добавляет к ней пользовательские кнопки.У меня есть выбор, чтобы добавить кнопки 16x16, 24x24 или 32x32.Согласно MSDN:

Чтобы создать прозрачную панель инструментов, все, что вам нужно сделать, это добавить TBSTYLE_FLAT или TBSTYLE_TRANSPARENT к параметру стиля окна CreateWindowEx.

Непонятно, должен ли я использовать какой-то определенный цвет для прозрачности, или я должен использовать 32-битные растровые изображения, где альфа = 255 указывает на прозрачность.Как элемент управления панели инструментов узнает о цвете прозрачности?Задание стилей TBSTYLE_FLAT или TBSTYLE_TRANSPARENT работает для растровых изображений 16x16, 24x24, где RGB (0xC0, 0xC0, 0xC0) - это цвет прозрачности.но в 32x32 не работали ни RGB (0xC0, 0xC0, 0xC0), ни 32-битное растровое изображение с альфа = 255.Я погуглил и потратил на это целый день, но не смог найти четкого решения.Некоторые предлагали использовать GB (0xF0, 0xF0, 0xF0) в 24-битных растровых изображениях, что является цветом фона кнопок.Это не настоящая прозрачность, я переключился на высококонтрастную тему и заметил, что в кнопках 16x16 и 24x24 прозрачность панели инструментов (цвет # C0C0C0) работает нормально, но для кнопок 32x32 не работает.Кто-нибудь может мне помочь?Заранее спасибо mr.abzadeh

РЕДАКТИРОВАТЬ: я использовал TB_ADDBITMAP, чтобы добавить растровое изображение на панель инструментов.Это только показало 1/4 изображения 32bpp без прозрачности.Я переключился на TB_SETIMAGELIST, и все было в порядке.

1 Ответ

0 голосов
/ 22 сентября 2018

Проблема возникает, когда я использую TB_ADDBITMAP следующим образом:

TBADDBITMAP tb;
tb.hInst = GetModuleHandleW(nullptr);
tb.nID = IDR_TOOLBAR32;
unsigned uCount = 10;
SendMessageW(hwndTB, TB_ADDBITMAP, uCount, (LPARAM)&tb);

путем переключения на ImageList, все работает нормально.Мой новый код такой:

const int cpWidth = 32;
const int iCount = 10;
const int idResource = IDR_TOOLBAR32;
HINSTANCE hInstance = GetModuleHandleW(nullptr);
HIMAGELIST hImageList = ImageList_Create(cpWidth, cpWidth,
    ILC_COLOR32 | ILC_MASK,
    iCount, 0
);
if (!hImageList) return -1;
HBITMAP hBitmapImage = (HBITMAP)LoadImageW(hInstance,
    MAKEINTRESOURCEW(idResource),
    IMAGE_BITMAP, iCount * cpWidth, cpWidth,
    LR_COPYFROMRESOURCE | LR_SHARED
);
if (!hBitmapImage) return -1;
ImageList_Add(hImageList, hBitmapImage, NULL);
SendMessageW(hwndTB, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...