C# WINFORM 控件 透明控件

bai123love 2012-11-01 09:44:49
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace WindowsFormsApplication1
{
public class ControlExample : Control
{
private const int Alpha = 111;

public ControlExample()
{
this.SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);

base.CreateControl();
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
//开启 WS_EX_TRANSPARENT, 使控件支持透明
cp.ExStyle |= 0x00000020;
return cp;
}
}

protected override void OnPaint(PaintEventArgs e)
{
float width;
float height;

Pen srcPen;
SolidBrush srcBrush;

Color srcColor = Color.FromArgb(Alpha, this.BackColor);

srcPen = new Pen(srcColor, 0);

srcBrush = new SolidBrush(srcColor);

base.OnPaint(e);

width = this.Size.Width;

height = this.Size.Height;

e.Graphics.DrawRectangle(srcPen, 0, 0, width, height);
e.Graphics.FillRectangle(srcBrush, 0, 0, width, height);

e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(Color.Black), new Rectangle(0, 0, this.Width, this.Height), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });

base.OnPaint(e);
}
}
}


WINFORM 自定义控件,类似做一个半透明的遮罩层。
就是在加载数据或是做一些比较耗时的操作,就显示这个控件,置于顶层,让用户点不到别的控件,防止误操作。
重写控件的ONPAINT事件来自己绘制UI。

在设置构造方法里设置控件样式 this.SetStyle(System.Windows.Forms.ControlStyles.Opaque, true); 时,可以绘制出透明的效果来,我可以在上面用 e.Graphics.DrawString 来画出我所要的提示信息出来,但是如果要动态提示程序的执行进度,就是这个绘制的字符串要动态去改变时,就要在设置这个TEXT的值后,再强制刷新UI。引发UI重绘事件。进入ONPAINT。

this.controlExampleTest.Text = "111111111111";
this.controlExampleTest.Invalidate();

这个是可以重绘UI,但是问题来了。在引发UI重绘后。画出来的UI。会造成,上一次的字符串依然还在,就是在原有的字符串上再画新的字符串。
如下图1(第一次ONPAINT的结果),图2(更新TEXT的值后,调用Invalidate方法时所出现的效果。) 所示:
图1:
图2:

我以我想怎么样才能在把原有的(上一次所画的字符串清掉),再重新画新的字符串上去。或是有什么别的解决办法。


现在我试过把 this.SetStyle(System.Windows.Forms.ControlStyles.Opaque, true); 去掉。
画出来的字符就不会是两次重桑的效果。
但是这个控件就不会是透明的了。看不到像图1和图2那样看得到在这个控件底层的控件了。(这个控件设置是置于顶层的。)
效果图如图3。
图3:

...全文
759 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bai123love 2013-02-21
经本人试过各种办法,效果不佳,放弃些功能实现。 还是谢谢各位的回答,都给分。
回复
ptchi 2013-01-14
支持一下!!!
回复
bai123love 2013-01-14
引用 11 楼 mjp1234airen4385 的回复:
擦除一下就行了。 e.Graphics.Clear(..);
e.Graphics.Clear(Color.Transparent); 这样的话,只要你清除的是什么颜色,空件的背景就变成什么颜色,而不是把原来的擦除。
回复
mjp1234airen4385 2012-12-19
擦除一下就行了。 e.Graphics.Clear(..);
回复
来次不温柔 2012-12-19
你把窗体刷新下就可以了,用GDI的时候不知道为什么窗体上也会绘制上去。
回复
稻庄 2012-11-09
回复
ghjlesse 2012-11-09
你第一次绘制字符串的时候是有一个绘制区域的,所以,你在每次绘制之前都对所要绘制的区域进行初始化,比如,使用主窗体的背景初始化需要绘制字符串的Rectangle。 你可以试试。
回复
_小黑_ 2012-11-09
顶一下
回复
bai123love 2012-11-09
引用 2 楼 bdmh 的回复:
你设置Text,这个属性是不受你绘制影响的,你清除不了,你自定义个属性吧,OnPaint中绘制自定义属性的值
和TEXT属性清不清除没有关系,这些我都试过了。
回复
bai123love 2012-11-09
引用 1 楼 qiaohuyue 的回复:
至于那么麻烦吗, 直接 backgroundColor = Trans 就完事了。
这个是自定义控件,是继承 Control 来做的。 可以在构造函数里这样子。 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); this.BackColor = Color.Transparent; 你在窗体放一个BUTTON,再放一个这个控件,把这个控件置于BUTTON的上面,并把这个控件置于顶层。 你可以看得到这个位置下一层的控件没有。 我要的是可以看得到位于这控件下层的东西。像图1图2那样。
回复
bai123love 2012-11-09
引用 3 楼 a361554048 的回复:
this.TransparencyKey = BackColor; 就透明了
很谢谢你来回答我的问题,不过请你看清楚问题。 这个是自定义控件,是继承 Control 来做的。 是不有 this.TransparencyKey 属性的。 this.TransparencyKey 只有 Form 才有。
回复
mm4 2012-11-04
this.TransparencyKey = BackColor; 就透明了
回复
bdmh 2012-11-02
你设置Text,这个属性是不受你绘制影响的,你清除不了,你自定义个属性吧,OnPaint中绘制自定义属性的值
回复
XBodhi. 2012-11-02
至于那么麻烦吗, 直接 backgroundColor = Trans 就完事了。
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2012-11-01 09:44
社区公告

让您成为最强悍的C#开发者