2012-02-20 99 views
14

我目前正在开发一个简单的图像编辑工具,使用Winforms.NET 3.5(工作环境)。使控件透明

我有一个要求,当用户点击选择工具按钮时,会出现一个正方形(C#中的矩形),它们可以在100x100400x400之间缩放。我修正了这个问题 - 问题在于使矩形的背景变得透明。

我有点不清楚。如果透明度在.NET 3.5支持,我已经试过如下:

SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
pnlSelectArea.BackColor = Color.Transparent; 
pnlSelectArea.ForeColor = Color.Transparent; 
selectArea1.BackColor = Color.Transparent; 
selectArea1.ForeColor = Color.Transparent; 

但这并没有影响 - 任何建议,将不胜感激。

+0

入住这http://stackoverflow.com/questions/72994/net-windows-forms-transparent-control – papaiatis 2012-02-20 09:10:29

+0

感谢您的帮助 - 我无法将这些应用到我的解决方案,但我很欣赏这种努力。 – 2012-02-20 10:17:05

+0

您可以在帖子[here:](http://stackoverflow.com/a/34404064/1529012) – aleksandaril 2015-12-21 21:28:57

回答

42

这是我其中包含一个不透明性质特殊的控制,它100%的工作原理:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

public class TranspCtrl : Control 
{ 
    public bool drag = false; 
    public bool enab = false; 
    private int m_opacity = 100; 

    private int alpha; 
    public TranspCtrl() 
    { 
     SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     SetStyle(ControlStyles.Opaque, true); 
     this.BackColor = Color.Transparent; 
    } 

    public int Opacity 
    { 
     get 
     { 
      if (m_opacity > 100) 
      { 
       m_opacity = 100; 
      } 
      else if (m_opacity < 1) 
      { 
       m_opacity = 1; 
      } 
      return this.m_opacity; 
     } 
     set 
     { 
      this.m_opacity = value; 
      if (this.Parent != null) 
      { 
       Parent.Invalidate(this.Bounds, true); 
      } 
     } 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = cp.ExStyle | 0x20; 
      return cp; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); 

     Color frmColor = this.Parent.BackColor; 
     Brush bckColor = default(Brush); 

     alpha = (m_opacity * 255)/100; 

     if (drag) 
     { 
      Color dragBckColor = default(Color); 

      if (BackColor != Color.Transparent) 
      { 
       int Rb = BackColor.R * alpha/255 + frmColor.R * (255 - alpha)/255; 
       int Gb = BackColor.G * alpha/255 + frmColor.G * (255 - alpha)/255; 
       int Bb = BackColor.B * alpha/255 + frmColor.B * (255 - alpha)/255; 
       dragBckColor = Color.FromArgb(Rb, Gb, Bb); 
      } 
      else 
      { 
       dragBckColor = frmColor; 
      } 

      alpha = 255; 
      bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); 
     } 
     else 
     { 
      bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); 
     } 

     if (this.BackColor != Color.Transparent | drag) 
     { 
      g.FillRectangle(bckColor, bounds); 
     } 

     bckColor.Dispose(); 
     g.Dispose(); 
     base.OnPaint(e); 
    } 

    protected override void OnBackColorChanged(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      Parent.Invalidate(this.Bounds, true); 
     } 
     base.OnBackColorChanged(e); 
    } 

    protected override void OnParentBackColorChanged(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnParentBackColorChanged(e); 
    } 
} 
+0

为我工作很好。 – Rob 2014-08-27 09:06:13

+0

ppl只需复制并粘贴您的自定义类并更改构造函数名称即可。完美的作品!谢谢 – hasan83 2015-08-08 15:46:04

+1

这目前有一个严重的错误。在OnPaint覆盖中,它调用e.Graphics对象上的Dispose,不应该这样做。如果您丢弃了传入的Graphics对象,该应用程序可能会崩溃。如果您没有创建它,则不应该处理它。 – Tim 2016-05-18 22:01:43

4

您将需要使用Opacity属性并将其设置为零以使表单不可见。

如果你想控制透明的,因为你在你的例子已经尽力了,请参阅本文

How to: Give Your Control a Transparent Background

它说你写的代码,必须在控制的构造。因此,我想,您需要创建一个自定义控件,这个控件可以从您的pnlSelectArea的类型中最可能是一个按钮。在该自定义控件的构造函数中,您可以编写代码来设置其样式和颜色。

+0

中找到我的简单方法。我不想让控件不可见。我想让它的内容不可见,所以我可以使用它将鼠标悬停在图像的不同部分,并将其用作'选择工具' – 2012-02-20 10:16:44

+0

然后设置这些内容的不透明度。 – Maheep 2012-02-20 10:20:38

+1

WPF中的winforms兄弟Mahepp no Opacity属性 – 2012-02-20 10:29:07

0

伟大的! 我终于设法绘制透明的形状。 我添加了一个虚拟方法

Draw(g); 

bckColor.Dispose(); 
g.Dispose(); 
base.OnPaint(e); 

,并在年底右边的虚方法的声明

protected virtual void Draw(Graphics g){ } 

现在我可以继续创建我自己的透明形状,图形等...

1

这是什么为我工作是导致其他解决方案无法正常工作。

这是透明的用户控件添加到ListView控件/ TreeView控件集合

我知道它说ButtonRenderer但它应该对任何控制工作。

在用户控件:

protected override void OnPaint(PaintEventArgs e) 
{ 
    ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this); 
} 
在家长控制

protected override void WndProc(ref Message m) 
{ 
    if(m.Msg == 0xF) 
     foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); } 

    base.WndProc(ref m); 
}