我正在做一个带有启动画面的应用程序。
我有一张要放在进度条下方的图像,例如:
示例
我已成功使位图透明。 但是,现在,图像在进度条后面了
现在
是否可以将图像显示在进度条前面? 谢谢。 F。
代码:
public partial class Form1 : Form
{
Bitmap m_l;
public Form1()
{
InitializeComponent();
m_l = Properties.Resources.LU;
m_l.MakeTransparent(Color.Transparent);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(m_l, new Rectangle(new Point(0, -40), new Size(200, 264))); progressBar1.Refresh();
}
}
答案 0 :(得分:2)
(很抱歉,错过了答案功能,但是答案很长,需要发表评论)
@TaW 似乎您不太了解这种方法,所以我将尝试更详细地解释它
OP询问他是否可以在另一个控件(进度条)上制作透明的图像
我假设此透明图像位于PictureBox内,您似乎还假定了其他控件
要放置控件,如果我的假设是正确的图片框,那么他所要做的就是右键单击进度条,然后单击图片框上的“ Bring to Front”。
,在进度条前面有一个“透明” PictureBox-但是,正如您在回答中提到的那样,由于“透明”不是我期望的那样,我们无法停在那里,但显然您知道-它的“父背景色”选择”,WinForms会这样做,我们最终在ProgressBar的前面看到了一个不完全透明的图像,而是一个带有灰色背景的图像
现在,已发布的网址到位了: http://www.richardhyland.com/diary/2009/05/26/how-to-truely-make-a-picturebox-background-transparent/
这是提供的代码,并在该url中进行了解释:
public static System.Drawing.Drawing2D.GraphicsPath Transparent(Image im)
{
int x;
int y;
Bitmap bmp = new Bitmap(im);
System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
Color mask = bmp.GetPixel(0, 0);
for (x = 0; x <= bmp.Width - 1; x++)
{
for (y = 0; y <= bmp.Height - 1; y++)
{
if (!bmp.GetPixel(x, y).Equals(mask))
{
gp.AddRectangle(new Rectangle(x, y, 1, 1));
}
}
}
bmp.Dispose();
return gp;
}
以此,我们可以在进度栏的前面实现完全透明的图片框。
因此,如果没有此代码,我们将拥有:
但使用该代码:
注意,这种方法有一些缺点:
GetPixel
获得每个像素都是“挑战” (请忽略图像显示“ JPG”的事实,而我所说的是透明图像-这只是Google搜索向我展示的第一张图像,是的,文件是透明png)
答案 1 :(得分:2)
您可以使用带有PictureBox
的{{1}}。
在表单中添加Region
。这将保留图像。根据需要将其放置为与PictureBox
重叠。将ProgressBar
属性设置为叠加图像。
然后在表单构造函数中设置此Image
的{{1}}。该区域定义了控件的形状。我们将Region
设置为等于图像的非透明部分。
PictureBox
大部分代码来自here
答案 2 :(得分:0)
有 5 6 个选项:
ProgressBar's
BackColor
设置为Transparent
。结果:翻译:
无效的属性值。此控件不支持透明的背景色。
这对于子类也是如此。
Panel
的透明BackgroundImage
。结果:如您所见,尽管面板和大多数图像是透明的,进度条仍然在其自己的BackColor
中用矩形作为底图;如上所示,它不能是透明的。
结果:
看起来相似。但是这次,背景色是面板覆盖之前的任何原始背景。这就是Winform伪造透明度的方式;此伪造的透明胶片仅适用于嵌套控件,而不适用于所有控件。
Paint
事件中绘制图像。问题:它没有一个。而且,如果您将其子类化,它将对您不起作用。总结:所有这些尝试失败;结论很简单:ProgressBar
是一个动画控件,将不支持任何混乱。
Panel
或Label
子类化并编写自己的进度栏。许多想拥有自定义外观的人都做到了,您可以找到许多现成的示例。 更新::看起来您可以有第6个选项,当且仅当您不需要半透明性(例如抗锯齿等)时,该选项才有效。 。:您可以创建一个GraphicsPath
来创建一个Region
,这将对图像进行遮盖一些控制。因此,尽管我的示例无法正常工作,但OP的图像可能看起来还不错