Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Builder透明位图覆盖画布_C++_Canvas_C++builder_Tbitmap - Fatal编程技术网

C++ Builder透明位图覆盖画布

C++ Builder透明位图覆盖画布,c++,canvas,c++builder,tbitmap,C++,Canvas,C++builder,Tbitmap,在TForm的OnPaint事件中,我希望绘制不覆盖背景或其他绘制对象的位图,因为它们具有透明部分 如果我在图像上画一个图像,它就会工作 但是,当我在窗体的画布上绘制时,它不起作用:图像的白色部分(应该是透明的)用白色正方形覆盖画布上的其他对象 Canvas->CopyMode = cmMergePaint ; Graphics::TBitmap * Image=new Graphics::TBitmap(); Image->Transparent = true; MainForm-

在TForm的OnPaint事件中,我希望绘制不覆盖背景或其他绘制对象的位图,因为它们具有透明部分

如果我在图像上画一个图像,它就会工作

但是,当我在窗体的画布上绘制时,它不起作用:图像的白色部分(应该是透明的)用白色正方形覆盖画布上的其他对象

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->DrawImage->Canvas…在图像上绘制时,我得到一个透明的正方形,里面没有任何东西,我可以在其他组件上移动

当我使用MainForm->Images->GetBitmapImgIndex[HistType]+Rotation,Image进行绘制时,我在表单上获得了正确的拉伸图像,但没有透明胶片,即其白色部分覆盖了其他组件

而MainForm->Images->DrawCanvas,X,Y,ImgIndex[HisType]+旋转,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);
使用图像->绘图,让TImageList为您处理绘图:

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

找到了解决办法,多亏了雷米。我们必须首先用一种颜色填充新创建的位图,不能让它为空,以使透明度正常工作

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;

是的,雷米,这很有效,但我只举了一个简单的例子来问我的问题。事实上,当我在窗体->画布上用鼠标移动组件时,我需要绘制一些组件。是否有可能从图像中而不是从TImageList中绘制?不存在针对的绘图Image@Lotfi为什么要手动绘制零部件?你应该让他们正常地画自己。你到底想完成什么?我把我以前的程序用PASCAL对象7翻译成C++ Builder,所以需要绘制组件的集合。对于普通图像,您的方法是可以的,但其中一个图像需要拉伸才能在窗体上绘制。因此,我需要从位图或具有透明度的Timage中进行绘制。@Lotfi创建一个透明的TBitmap,TImageList。绘制到位图上,然后Canvas.StretchDraw绘制位图。@Remy Lebeau您有办法同时获得拉伸+透明度,上面的代码只能给出其中一个。@Lofti正如我在之前的注释中所说的,这些注释似乎已经被删除,使用Images->DrawImages->Canvas时的问题。。。这是因为在绘制图像之前,并没有设置图像->宽度和图像->高度。Images->GetBitmap为您处理,但Images->Draw不处理,因此您需要将其添加到代码中。@Remy仍然没有位图的透明度。我怎样才能做到这一点;尺寸=1//调试树DstRectX,Y,X+32+1-旋转*32*大小,Y+32+旋转*32*大小;Graphics::TBitmap*Image=新图形::TBitmap;图像->透明=真;图像->宽度=32;图像->高度=32;//MainForm->Images->GetBitmapImgIndex[HistType]+旋转,图像;MainForm->Images->DrawImage->Canvas,0,0,ImgIndex[HisType]+旋转;//画布->绘图,Y,图像;画布->StretchDrawDstRect,图像;删除图像;事实上,我的图像不是透明的,image->transparent=true;这并不能使它透明。缺少某些内容请尝试先绘制位图,然后将其设置为TransparentColor=true,如果需要,还可以将其TransparentColor设置为TransparentColor。您应该为位图定义一种特定的颜色,默认为白色:Image->Canvas->Brush->color=。。。;clFuschia是常用的。如果不设置,位图将使用最左边第一个像素中的颜色。如果Draw恰好在该像素中绘制,则位图可能无法按预期方式渲染。因此,您应该明确地将透明颜色设置为您告诉FillRect使用的相同颜色。是的,我理解,但这是可以的,因为所有的图形都远离边缘。这不仅是边缘的问题,也是颜色的问题。就像我说的,默认的笔刷颜色是白色的,所以如果你的绘图包含白色像素,它们最终将是透明的,这可能是你想要的,也可能不是,这取决于你的特定图像。只是说。。。