c# - 如何在 C# 中制作超过 1 个透明图片框层?
问题描述
我正在使用 3 个图片框。1 作为背景 & 2 作为背景上的透明层。所有尺寸相同。第 1 层用于绘制线条,第 2 层用于绘制形状。我正在使用选项卡控件来控制哪个图层可见,哪个图层隐藏。但不知何故不能使两个图层同时可见,即使它们都是透明的。
我正在使用的代码
public Form1()
{
InitializeComponent();
bgLayer.Image = bmp;
bgLayer.Controls.Add(lineLayer);
bgLayer.Controls.Add(squareLayer);
lineLayer.Location = new Point(0, 0);
squareLayer.Location = new Point(0, 0);
lineLayer.BackColor = Color.Transparent;
squareLayer.BackColor = Color.Transparent;
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabControl1.SelectedIndex == 0)
{
lineLayer.Visible = true;
squareLayer.Visible = true;
lineLayer.Enabled = false;
squareLayer.Enabled = false;
}
else if (tabControl1.SelectedIndex == 1)
{
lineLayer.Visible = true;
squareLayer.Visible = false;
lineLayer.Enabled = true;
squareLayer.Enabled = false;
}
else if (tabControl1.SelectedIndex == 2)
{
lineLayer.Visible = false;
squareLayer.Visible = true;
lineLayer.Enabled = false;
squareLayer.Enabled = true;
}
}
任何人都知道如何使两个透明层同时可见?选项卡控件 0 都是可见的,1 仅是图片框 1,2 仅是图片框 3。选项卡控件 1 和 2 工作正常,但 0 仅显示图层图片框1。
尝试添加lineLayer.Controls.Add(squareLayer);
,但它使程序在执行时缓冲区不停
解决方案
使用 WinForm 是不可能的PictureBox
:WinForms 不支持 alpha 混合(甚至索引透明度)控件的 z 排序,就像您可以使用 WPF 或 HTML+CSS 一样。它唯一允许的是控件在Control
绘制自己之前重新渲染其 parent 的背景(请注意,父控件也必然会剪辑其子控件,因为Control
WinForms 中的所有子类都封装了一个 User32 hWnd。唯一的解决方法是创建一个没有非客户区的新顶层窗口,这可能很痛苦)。
唯一的解决方法是使用一个自定义绘制的控件,以在其覆盖的事件中重绘堆叠的图像,或者每次您希望外观更改并使用单个控件时重新OnPaint
生成内存中的内容,请参见此处:在 C# 中使重叠的图片框透明。网Bitmap
PictureBox
推荐阅读
- ios - 如何在其他 Storyboard 中的 vc 中使用委托在 MainStoryboard 中显示 ViewController?
- javascript - 从没有辅助变量的过滤器内的循环返回值
- c# - EF Core 关系 - 冗余列 ID
- google-maps - Google 在 Maps Time Zone API 配额中所说的“用户”是什么意思?
- javascript - Firestore 中的数据未更新
- sql - SQL 排除 NULL 或值 0
- eclipse - Eclipse:如何使用 dropins 目录进行低级安装
- react-native - 如何将导航参数发送到测试
- javascript - 对象文件名在 Firefox 上包含 ':' 路径分隔符
- asp.net-core-mvc - ASP.NET MVC Core 中的路由,标签助手路由到错误的 POST 操作