Ravi Teja Ответов: 1

Как создать узор кисти с помощью PNG-изображения.


У меня есть изображение с черными точками на белом фоне, которое я использую для создания кисти Паттена и изменения цвета черных точек с помощью SetTextColor. Я создал CBitmap с помощью PNG-изображения(я использовал CPngImage, чтобы получить HBITMAP и прикрепил его к CBitmap ). Теперь я создал PatternBrush с помощью(CreatePatternBrush) с этим растровым изображением, проблема в том, что цвет кисти не меняется, если я использую изображение PNG. Но это меняется, когда я использую изображение в формате bmp.

Что я уже пробовал:

вот вам какой-то код
CBitmap bmp;
если (БМП.LoadBitmap(IDB_BITMAP1))
{
если (кисть.CreatePatternBrush(&bmp))
pOldBrush = pDC->SelectObject(&brush);
}

pDC->SetTextColor(color); это работает

CBitmap bmp;
CPngImage pngImage;
HBITMAP hBitmap = NULL;

if ( pngImage.Load(MAKEINTRESOURCE(nIDResource)) )
{
hBitmap = (HBITMAP)pngImage.Отсоединить();
}


if ( hBitmap )
формат BMP.Прикрепить(hBitmap);

если (кисть.CreatePatternBrush(&bmp))
pOldBrush = pDC->SelectObject(&brush);

pDC->SetTextColor(color); это не работает

Richard MacCutchan

Я не могу найти метод отсоединения в документации: Класс CPngImage[^]. И я не уверен, что вы можете просто привести PNG к HBITMAP таким образом.

Ravi Teja

CPngImage является производным от CBitmap, который, в свою очередь, является производным от класса CGDIObject, откуда происходит метод Detach. если вы можете проверить метод CMFCToolBarImages::LoadStr в папке VC\atlmfc\src\mfc, то вот как они получают HBITMAP из PNG-файла

1 Ответов

Рейтинг:
7

Jochen Arndt

Это похоже на ваше растровое изображение IDB_BITMAP1 является монохромным, в то время как ваше PNG-изображение-нет.

Кисть, созданная с использованием монохромного растрового изображения (1 Цветовая плоскость, 1 бит на пиксель), рисуется с использованием текущего цвета текста и фона. Пиксели, представленные битом, установленным в 0, рисуются с текущим цветом текста. Пиксели, представленные битом, установленным в 1, рисуются с текущим цветом фона.
Так что цвет устанавливается SetTextColor и SetBkColor используются с кистями, созданными из монохромных растровых изображений. Но в случае кистей, созданных из немонохромных растровых изображений, используются цвета из растрового изображения. Если вам не нужны кисти с несколькими цветами и вы хотите использовать PNG-изображение, преобразуйте его в монохромное.