Как нарисовать выделенное / выбранное растровое изображение в Windows? - PullRequest
1 голос
/ 14 ноября 2011

Я пишу программу, используя стандартный Win32 API. Когда пользователь выбирает изображение в моей программе, я хочу нарисовать растровое изображение так, чтобы оно было выделено / выделено. Используя стандартную метафору Windows, это означает рисование версии растрового изображения, которая была закрашена цветом подсветки системы (я не уверен, что термин «заштрихован» - это технически правильный термин, но посмотрите мой пример ниже). Я пробовал несколько способов сделать это с помощью BitBlt и подобных функций, но я не могу понять, какие именно шаги мне нужны. Если есть стандартная функция Win32, которая обрабатывает это, я не смог ее найти. Кто-нибудь знает, как мне это сделать?

Невыбранное изображение должно выглядеть так:

Unselected image

Выбранное изображение должно выглядеть так:

Selected image

Ответы [ 4 ]

2 голосов
/ 20 ноября 2011

Похоже, что GDI AlphaBlend () должен делать эту работу; создайте маленькое сплошное растровое изображение, используя цвет выделения, используйте AlphaBlend для наложения его на исходное растровое изображение, используя поле BLENDFUNCTION.SourceConstantAlpha для указания прозрачности.

2 голосов
/ 19 ноября 2011

Я не мог понять, как это сделать напрямую (например, с помощью BitBlt и друзей), но объект списка изображений сделает это за вас:

HBITMAP hBitmapImage = ...; // cookie monster
HBITMAP hBitmapMask = ...; // all black
HIMAGELIST hImageList = ImageList_Create(width, height, ILC_COLOR32 | ILC_MASK, 1, 0);
ImageList_Add(hImageList, hBitmapImage, hBitmapMask);
ImageList_Draw(hImageList, 0, hDC, x, y, ILD_SELECTED);

Результат (оригинал слева, выбран справа):

Result

0 голосов
/ 16 ноября 2011

Вы также можете инвертировать ваше изображение, чтобы показать выделение, используя одну из операций инвертирования. Например, чтобы инвертировать то, что уже присутствует на HDC, передайте координаты области для инвертирования:

BitBlt(HDc, XPos, YPos, Width, Height, NULL, 0, 0, DSTINVERT);
0 голосов
/ 14 ноября 2011

Так как именно вы хотели бы выделить его?Это может быть рамка вокруг изображения, в этом случае вам просто нужно FrameRect вокруг.Или вы можете PatBlt изображение.Или посмотрите в этой статье другую идею с примером кода: Эффекты свечения и тени с использованием Windows GDI .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...