我们能否设置面板背景图像的不透明度?

4

你知道在WPF中可以实现这个功能。但是我有一个在Windows Forms中的项目,我不想费力地将项目移植到WPF中。那么在Windows Forms中是否也能实现呢?(与另一个问题所问的不同,我不是要求面板的透明度。我是在问“如果我使用背景图像”,能否使其半透明。)


不是那个。我知道怎么做。我的问题是,“如果我使用背景图片”。请不要混淆。 - Zgrkpnr
2
WinForms并不真正支持透明度。如果你想坚持使用WinForms,就别试图做花哨的UI效果,只能用那些普通、丑陋、无聊的战舰灰样式。否则,使用WPF,你将能够创建一个更丰富的用户界面。 - Federico Berasategui
我已经使用WPF有一段时间了。我转向了它。但是这个应用程序非常庞大。在WPF中重新创建它将是一项非常艰苦的工作。 - Zgrkpnr
回到WinForms似乎是前所未有的,因为它的图形框架与现代技术相比显得过时。 - Sayse
@Zgrknr 你也可以采用 ElementHost 的方式,逐步将应用程序的部分移植到 WPF,而不是进行整体重构,或者如果你有多个 Form,你可以逐个将它们改为 WPF Window,逐步实现。 - Federico Berasategui
@HighCore 我曾经尝试在WPF中托管我的Zedgraph,但我后悔了。对我来说现在非常复杂。我仍然处于理解WPF中一些中级问题的阶段。 - Zgrkpnr
2个回答

8

您需要尝试两件事情:将BackColor设置为透明,将图像转换为具有透明度的东西。

来自在C#中更改图像的不透明度

public Image SetImageOpacity(Image image, float opacity) {
  Bitmap bmp = new Bitmap(image.Width, image.Height);
  using (Graphics g = Graphics.FromImage(bmp)) {
    ColorMatrix matrix = new ColorMatrix();
    matrix.Matrix33 = opacity;
    ImageAttributes attributes = new ImageAttributes();
    attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default,
                                      ColorAdjustType.Bitmap);
    g.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height),
                       0, 0, image.Width, image.Height,
                       GraphicsUnit.Pixel, attributes);
  }
  return bmp;
}

那么您的面板属性将会如下所示:
panel1.BackColor = Color.Transparent;
panel1.BackgroundImage = SetImageOpacity(backImage, 0.25F);

1

不透明度只能在顶级窗口上工作。您无法在面板上使用不透明度。

如果您只想要带有不透明度的图片,我认为您可以自己绘制它,就像以下示例一样。 imageSystem.Drawing.Image 的一个实例。

using (Graphics g = Graphics.FromImage(image))
{
    Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width);
    g.DrawLine(pen, -1, -1, image.Width, image.Height);
    g.Save();
}

编辑: 这篇文章也许会给你一些进一步的提示。此处链接


是的,那就是我正在做的事情。但为了产生3D效果,我使用了在Photoshop中设计的图片。当然,如果我找不到解决方案,我会在面板上绘制。仍然投票支持它,因为这很有创意。谢谢。 - Zgrkpnr
那也是我最先想到的事情。;) - devmb
不透明度只能应用于顶层窗口。无法在面板上使用不透明度。LarsTech正在改变位图的不透明度,并将图像绘制在一个面板上。 - Mark Ronollo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接