我怎样才能增加透明度,以交流#窗体,同时保持控制可见?(How can I add transpar

2019-06-23 20:54发布

更新:我休假从与透明的东西几天搞乱。 我开始再次今晚搞乱。 我使用了汉斯帕桑特的解决方案有新的结果: 新的结果http://img3.imageshack.us/img3/4265/icontransp.jpg http://img3.imageshack.us/img3/4265/icontransp.jpg

顺便解决方案确实解决了透明背景渐变的问题。 不过,我仍然运行与透明的颜色在我的图标,窗体的背景色混合的问题。 你可以看到周围的图标的各个部分的紫红色上述形象。

原创内容:

我在这已经持续了几个小时,现在,我还没有多少运气。 我搞砸与Control.Region,Form.TransparencyKey,Form.Opacity,并与一些时髦的效果一对夫妇的其他随机的东西。

最近我一直在试图定义我的桌面,并决定惹应用码头。 看到什么Mac Dock中和一些第三方Windows的实现必须提供后,我决定,我要建立自己的。

最后,我想移动到使用Win32 API。 现在我只想要得到的东西用尽可能多的C#和.NET Framework的能力,尽可能充分。

有几件事情我希望能够在这个应用程序执行:

  • 显示与渐变的背景的形状/菜单。
  • 允许表单/菜单具有透明性,同时保持图标不透明。
  • 包含透明背景显示的图标。
  • 菜单和图标应该能够收到鼠标相关的事件(悬停,离开,点击的dragover,的DragDrop,和其他一些)。

这是我拍摄的效果: 预期的效果http://img207.imageshack.us/img207/5716/desired.jpg http://img207.imageshack.us/img207/5716/desired.jpg

此图像显示了视觉效果,我想实现的。 这是一个皮肤我一个名为Rainmeter的程序进行。 图像显示记事本++的背后有几个皮肤文件的皮肤编辑器中打开。 菜单是透明的,但是它们的图标保持不透明。

我的方法:

使用窗体来充当菜单似乎是一个逻辑的第一选择我。 我有事件的一个基本的了解。 我不太知道如何创建自己的点击事件,这样一种形式将使处理事件一点点更容易。 我认为是图标的几个选项。 我决定我会使用PictureBoxes的图标,因为它们可以容纳图像和接收事件。

一旦我完成了我的菜单的所有结构逻辑的代码,我开始玩弄它,试图得到视觉效果,我想。 Form.Opacity影响了书上的所有的透明度。 因为我想要的图标是完全不透明的,我独自离开这个属性。 我尝试了背景色设置为Color.Transparent,而是给出了一个错误。 我打得四处数组合...... 组合效果http://img204.imageshack.us/img204/757/effectsi.jpg http://img204.imageshack.us/img204/757/effectsi.jpg

我画的梯度与Drawing2D.LinearGradientBrush成位图。 然后该位图被放置为Form.BackgroundImage或作为PictureBox.Image。 如果使用,该图片框的大小能够覆盖整个表格,并发送至后台。

我注意到,一些Form.BackgroundColor会与我的图标轮廓混合在一起。 图标沿着一个平滑的外观边缘透明度。 由于图标拿起表格的BACKGROUNDCOLOR,这让我觉得PictureBoxes正在创造新的图像时,图标被加载到形式。 图像的半透明部分,然后用窗体的BACKGROUNDCOLOR合并时,他们应该与任何颜色的形式背后合并。

用白色的桌面效果http://img838.imageshack.us/img838/8299/whitedesktop.jpg http://img838.imageshack.us/img838/8299/whitedesktop.jpg

在此图像中可以看到紫红色的图标存在即使窗体的紫红色现在是完全透明的。 忘了指出,相同的绿色至黄色梯度为150的α值是在任何情况下使用。 在坡度不看绿色的图像,这是因为透明色与紫红色背景交融。

我真的不知道该怎么在这里做。 我觉得我能得到我想要的东西,如果我能以某种方式使窗体独自完全透明的。 我也在想我可能有更好的运气只是绘制图标,而不是使用PictureBoxes。 那么问题是建立图标来接收鼠标事件。 (我从来没有在我自己的事件,我认为这会涉及一些Win32 API调用)。

有没有别的东西我可以用PictureBoxes做得到我想要的效果? 无论是哪种情况,我接受任何意见或建议,我想达到的整体效果。

Answer 1:

这是很容易的WinForms做。 你需要的是两种形式三明治。 底部一个应提供透明渐变背景,最上面的一个应绘制的图标和处理鼠标点击。 一些示例代码:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.TopMost = true;
        this.FormBorderStyle = FormBorderStyle.None;
        this.TransparencyKey = this.BackColor = Color.Fuchsia;
        this.Opacity = 0.3;
        var overlay = new Form();
        overlay.FormBorderStyle = FormBorderStyle.None;
        overlay.TransparencyKey = overlay.BackColor = Color.Fuchsia;
        overlay.StartPosition = FormStartPosition.Manual;
        overlay.Location = this.Location;
        overlay.MouseDown += HandleIconClick;
        this.Resize += delegate { overlay.Size = this.Size; };
        this.LocationChanged += delegate { overlay.Location = this.Location; };
        overlay.Paint += PaintIcons;
        this.Paint += PaintBackground;
        this.Load += delegate { overlay.Show(this); };
    }
    private void PaintBackground(object sender, PaintEventArgs e) {
        var rc = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
        using (var br = new LinearGradientBrush(rc, Color.Gainsboro, Color.Yellow, 0f)) {
            e.Graphics.FillRectangle(br, rc);
        }
    }
    private void PaintIcons(object sender, PaintEventArgs e) {
        e.Graphics.DrawIcon(Properties.Resources.ExampleIcon1, 50, 30);
        // etc...
    }
    void HandleIconClick(object sender, MouseEventArgs e) {
        // TODO
    }
}

它看起来像这样与有些随机颜色和图标我选择:



Answer 2:

OK,我有点在所有的丢失,而是从原段中的描述,我会确保矩形背景不是pictureboxes的视觉父。 让他们重叠的兄弟姐妹,用Panel.Zindex前面的pictureboxes。

然后,你可以更改矩形的不透明,不影响图标。 另外,还要确保图标源图像文件有一个透明背景。

应该工作,我认为。



文章来源: How can I add transparency to a c# form while keeping controls visible?