C++ 生成器透明位图覆盖 Canvas

标签 c++ canvas c++builder tbitmap

TFormOnPaint 事件中,我想绘制不覆盖背景或其他绘制对象的位图,因为它们具有透明部分。

如果我在图像上绘制图像,它就可以工作。

但是当我在 Form 的 Canvas 上绘制时,它不起作用:图像的白色部分本应是透明的,但用白色方 block 颜色覆盖了 Canvas 的其他对象。

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) 绘制时,我在窗体上得到了正确的拉伸(stretch)图像,但没有透明胶片,即它的白色部分覆盖了其他组件。

MainForm->Images->Draw(Canvas, X, Y, ImgIndex[HisType]+Rotation, dsTransparent, itImage); 完成工作时,我需要为这个组件拉伸(stretch)它取决于 Size 变量。

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);

最佳答案

改用 Images->Draw(),让 TImageList 为您处理绘图:

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

关于C++ 生成器透明位图覆盖 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560280/

相关文章:

c++ - 如何将 CString 转换为 byte[] 数组?

c++ - 如何获取属于某个范围的 vector 中的最大元素?

javascript - 包含 'shaking' 效果的 HTML Canvas 动画

android - 使用蓝牙组件将数据从 Android 手机传输到串行设备时出现问题

overloading - "Using"未解决 "hides virtual function"警告

c++ - 智能感知 : expression must have integral or enum type

c++ - 类构造函数声明了两次

javascript - 根据用户的选择以模式显示 Canvas 图像

javascript - 在输入过程中使文本实时显示在 Canvas 上

memory-leaks - 追踪内存泄漏的最佳方法是什么