C ++ Builder прозрачные растровые изображения покрывают холст - PullRequest
0 голосов
/ 06 февраля 2019

В случае OnPaint для TForm я хочу рисовать растровые изображения, которые не покрывают фон или другой нарисованный объект, потому что они имеют прозрачные части.

Если я рисую изображение поверх изображения, это работает.

Но когда я рисую на форме Canvas, это не работает: белая часть изображения, которая должна быть прозрачной, покрывает другие объекты холста белым квадратомcolor.

Canvas->CopyMode = cmMergePaint ;
Graphics::TBitmap * Image=new Graphics::TBitmap();
Image->Transparent = true;
MainForm->Images->GetBitmap(14, Image);

Canvas->Draw(10,10,Image;
MainForm->Images->GetBitmap(0, Image);
Canvas->Draw(15,15,Image);

Обновление

Когда я рисую на изображении, используя MainForm->Images->Draw(Image->Canvas...), я получаю прозрачный квадрат, внутри которого ничего нет, и я могу перемещаться подругие компоненты.

Когда я рисую, используя MainForm->Images->GetBitmap(ImgIndex[HisType]+Rotation, Image), я получаю правильное растянутое изображение на форме, но без прозрачных пленок, т.е. его белые части покрывают другие компоненты.

В то время как MainForm->Images->Draw(Canvas, X, Y, ImgIndex[HisType]+Rotation, dsTransparent, itImage);делает работу, мне нужно растянуть его для этого компонента в зависимости от переменной размера.

TRect DstRect(X,Y, X+32 + ( 1 - Rotation ) * 32 * Size, Y+32 + Rotation * 32 * Size);
Graphics::TBitmap * Image=new Graphics::TBitmap();
Image->Transparent=true;
//MainForm->Images->GetBitmap(ImgIndex[HisType]+Rotation, Image);
MainForm->Images->Draw(Image->Canvas, 0, 0, ImgIndex[HisType]+Rotation, dsTransparent, itImage);
Canvas->StretchDraw(DstRect, Image);
delete Image;

//MainForm->Images->Draw(Canvas, X, Y, ImgIndex[HisType]+Rotation, dsTransparent, itImage);

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

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

Size=1; //debug
TRect DstRect(X,Y, X+32 + ( 1 - Rotation ) * 32 * Size, Y+32 + Rotation * 32 * Size);
Graphics::TBitmap * Image=new Graphics::TBitmap();
Image->Width = 32;
Image->Height = 32;
Image->Canvas->FillRect(Rect(0,0,32,32));
MainForm->Images->GetBitmap(ImgIndex[HisType]+Rotation, Image);
//MainForm->Images->Draw(Image->Canvas, 0, 0, ImgIndex[HisType]+Rotation, dsTransparent, itImage);
Image->Canvas->Pen->Color = clRed;
Image->Canvas->MoveTo( 3, 3 );
Image->Canvas->LineTo( 29, 29 );
Image->Transparent=true;
Canvas->StretchDraw(DstRect, Image);
delete Image;
0 голосов
/ 06 февраля 2019

Вместо этого используйте Images->Draw(), пусть TImageList обрабатывает чертеж для вас:

MainForm->Images->Draw(Canvas, 10, 10, 14, dsTransparent, itImage);
MainForm->Images->Draw(Canvas, 15, 15, 0, dsTransparent, itImage);
...