2011-08-19 62 views
0

的我,在我的winform一个图片显示十字线PNG文件。我创建了一个包含另一个小图片框(用于绿点)和一个标签的用户控件。透明控件放置一个PictureBox

我想要做的就是发生在图片框的用户控件,以便只有点和标签是可见的。并且控件的方形边缘不可见。

的点有白边,因为PNG实际上是方形的,所以我试图设置透明度关键是白色的,但是当我的控件添加到我的图片框,一切是白色的是透明的。我认为如果我用一种颜色在我的点的边缘着色,那么我可以将它与透明度键相匹配,但颜色必须准确(对吧?),而且我唯一的绘画方法是窗户漆,所以我不知道是否有匹配的颜色。任何帮助?

回答

0

你碰到的问题是,WinForms控件不支持真正的透明度,并让他们这样做可能是有点棘手。他们所做的就是在子控件下面绘制子控件(当透明度通过SetStyle启用时),但这有其自身的特点。你应该首先尝试这样的事:

// in your custom control class... 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 

     return cp; 
    } 
} 

我发现这个方法比下面更可靠,但你应该试试这个,以及:

public MyTransparentControl() 
{ 
    SetStyle(ControlStyles.SupportsTransparentBackColor |  
       ControlStyles.AllPaintingInWmPaint | 
       ControlStyles.UserPaint, true); 

    BackColor = Color.Transparent; 
} 

作为一个替代方法,有你考虑使用WPF而不是WinForms?我知道这并不总是一种选择,但如果是这样的话,您将使WPF控制支持透明度和控制分层开箱即可轻松一点。

+0

我是否担心父对话框的透明度关键? 第一个例子比第二个例子好一点。标签的背景以及我控制的图片框的背景仍然存在。其余的控制是不可见的。这个例子可以扩展到这些项目吗? – Jason

+0

@Jason:您不必担心使用此方法的“TransparencyKey”。您需要为每个应具有“透明”背景的控件执行相同的操作。这意味着派生自己的Label类等等。但是,对标签使用第二个示例可能就足够了(“SetStyle”是一个公共方法),并使用第一个示例用于主叠加控件。 –