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:

...全文
1180 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 就完事了。
【更新至2025年】2001-2025年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线)(300+年报词频统计) 1、时间:2001-2025年 2、来源:上市公司年报 3、参考文献:企业数字化转型与资本市场表现——来自股票流动性的经验证据(吴非) 数字化转型如何影响企业全要素生产率(赵宸宇) 知识产权行政保护与企业数字化转型(甄红线) 4、方法说明:(1)参考吴非老师的做法,对人工智能技术、大数据技术、云计算技术、区块链技术、数字技术运用五个维度76个数字化相关词频进行统计 (2)参考赵宸宇老师的做法,对数字技术应用、互联网商业模式、智能制造、现代信息系统四个维度99个数字化相关词频进行统计 (3)参考甄红线老师的做法,对技术分类、组织赋能、数字化应用等类别下139个数字化相关词频进行统计 5、指标:年份、股票代码、公司简称、行业名称、行业代码、全文-文本总长度、仅中英文-文本总长度、人工智能技术-吴、大数据技术-吴、云计算技术-吴、区块链技术-吴、数字技术运用-吴、数字技术应用-赵、互联网商业模式-赵、智能制造-赵、现代信息系统-赵、技术分类-人工智能技术-甄、技术分类-区块链技术-甄、技术分类-云计算技术-甄、技术分类-大数据技术-甄、组织赋能-人工智能技术-甄、组织赋能-云计算技术-甄、组织赋能-大数据技术-甄、组织赋能-广义数字技术-甄、数字化应用-技术创新-甄、数字化应用-流程创新-甄、数字化应用-业务创新-甄、人工智能、商业智能、图像理解、投资决策辅助系统、智能数据分析、智能机器人、机器学习、深度学习、语义搜索、生物识别技术、人脸识别、语音识别、身份验证、自动驾驶、自然语言处理、大数据、数据挖掘、文本挖掘、数据可视化、异构数据、征信、增强现实、混合现实、虚拟现实、云计算、流计算、图计算、内存计算、多方安全计算、类脑计算、绿色计算、认知计算等300+词频

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧