用SetStyle方法重绘你的窗体

鲜为人知的SetStyle方法可以让你控制重绘一个窗体的方式。
by Ken Getz
注:Ken Getz在Orlando的VSLive!上同Brian Randell一起举办了一个主题为“Build a Rich Client App with Visual Studio .NET”的研讨会。本篇技巧选自该研讨会的资料。
运用GDI+和Windows窗体,我们可以很容易地创建一个渐变色(gradient)来填充一个区域。运用.NET Framework提供的简单的方法,你可以创建linear gradients(线型渐变填充)或path gradients(路径渐变填充)。然而,真正的问题是这些复杂的背景图形是资源密集型(resource-intensive)的。最近,我正在做一个模拟的时钟演示程序,用一个渐变色来填充钟面。每一秒,当时钟重绘它的钟面来显示时钟指针的正确位置时,它也重绘了整个背景渐变色。即使在一台很快的机器上,这种方法也并不很好。我将向你介绍SetStyle方法,它可以让你指定如何、何时来重绘你的窗体。
首先,用下面的代码做试验,你可以从中得到一些着色变换的乐趣。修改一个新窗体的Paint事件使它包含该代码:

Private Sub frmMain_Paint( _ ByVal sender As Object, _ ByVal e As PaintEventArgs) _ Handles MyBase.Paint  Dim path As New GraphicsPath()  Dim pt As New PointF()  Dim rct As Rectangle = Me.ClientRectangle  path.AddRectangle(rct)  Dim pgb As New PathGradientBrush(path)  pt = New PointF( _   CType(Me.ClientSize.Width / 2, Single), _   CType(Me.ClientSize.Height / 2, Single))  pgb.CenterPoint = pt  Dim Colors() As Color = _   {Color.Red, Color.Orange, Color.Yellow, _   Color.Green, _   Color.Blue, Color.Indigo, Color.Violet}  Dim Positions() As Single = _   {0.0, 0.1, 0.2, 0.4, 0.6, 0.8, 1}  Dim cb As ColorBlend = New ColorBlend()  cb.Colors = Colors  cb.Positions = Positions  pgb.InterpolationColors = cb  e.Graphics.FillRectangle(pgb, rct)  Dim f As New StringFormat()  f.Alignment = StringAlignment.Center  e.Graphics.DrawString( _   Date.Now.ToLongTimeString, _   New Font("Tahoma", 13), Brushes.White, pt, f)End Sub

这里有很多代码,但它们很简单。该代码创建了一个新的GraphicsPath对象,给GraphicsPath添加一个填充了整个窗体的矩形,然后根据GraphicsPath创建一个GradientBrush对象。该代码为渐变色设置了中心点,创建了要用的渐变颜色数组,创建位置数组(颜色渐变的整个范围),创建一个新的缺省的ColorBlend对象,设置渐变色的属性,然后用渐变色填充矩形。
另外,给窗体添加一个Timer控件,激活它,将时间间隔设置为500毫秒,将下面的代码添加到Timer事件中:

Private Sub Timer1_Tick( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Timer1.Tick  Me.Invalidate()End Sub

运行该程序,你就可以得到一个有颜色背景的漂亮的时钟了。有问题吗?是的,通常会有渐变色重绘的问题。而且画面闪动得很厉害,你不得不警惕它对视力的损伤。另外,当你尝试调整窗体大小时,你会发现,在你强迫窗体重绘前(将另一个窗体拖到该窗体上,然后移开先前的窗体。我不建议将这种方法推荐给最终用户),渐变色不会自己进行调整。
解决方法很简单:窗体的SetStyle方法可以让你设置不同的值,这些值影响窗体重绘的方式。你可以把ResizeDraw样式(style)设置为True,这样当你调整窗体的大小时,窗体就自动地重绘了。你也可以把DoubleBuffer样式设置成True,这样当每次重绘窗体的某一部分时,就不会完全重绘整个窗体了。该选项占用额外的内存,这是因为在.NET运行时,除了实际的窗体本身占用内存外,窗体图片的一个副本也必须存储在内存中,但这么做的结果是很值得的。(要运用DoubleBuffer选项,你也必须将AllPaintingInWmPaint和UserPaint样式设置成True。)在你的窗体的Load事件中添加下面的代码,你就可以完成该设置了:

Me.SetStyle(ControlStyles.ResizeRedraw, True)Me.SetStyle(ControlStyles.AllPaintingInWmPaint _    Or ControlStyles.UserPaint Or _    ControlStyles.DoubleBuffer, True)

重新运行该演示程序,你会看到你就得到了一个大小调整了的、吸引人的、填充了渐变色的数字时钟。关于这个有用的方法的更多的资料,请查看.NET Framework帮助文件中的SetStyle方法。

关于作者:
Ken Getz是MCW Technologies公司的一位高级顾问,他的时间主要用来编程、写书和培训。Ken已经编写了许多技术书籍了,包括与Paul D. Sheriff合作的ASP.NET Developer’s JumpStart。他的联系方式是keng@mcwtech.com。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索方法
, 窗体
, 代码
, color
, 变色
, 重绘
, 重绘事件
, 桌面重绘
, #重绘
, 窗体重绘
, 一个
, 图片重绘
自动变色
c 重绘窗体、winform 重绘窗体、窗体边框重绘、窗体重绘、delphi 窗体重绘,以便于您获取更多的相关知识。

时间: 2024-09-10 19:07:14

用SetStyle方法重绘你的窗体的相关文章

请问Invalidate方法--重绘

问题描述 publicForm1(){InitializeComponent();}Pointpoint1=newPoint(20,20);privatevoidForm1_Load(objectsender,EventArgse){}privatevoidForm1_Paint(objectsender,PaintEventArgse){Graphicsg=this.CreateGraphics();Rectanglerectangle=newRectangle(point1,newSize(

form1.cs [设计] 重绘窗体 问题,请教各位帅哥

问题描述 form1.cs[设计]重绘窗体(不知道表达是否准确),因为我form1窗体控件比较多,我修改form1.cs里面代码,对应form1.cs[设计]会重性绘制窗体,要等待好几秒但是有些时候修改form1.cs的代码不会,重新绘制窗口,我一直纳闷找不到这个原因请各位帅哥帮我分析下是不是要设置什么地方呢,非常感谢! 解决方案 解决方案二:界面上的控件比较多的时候,我也碰到过这个问题,我的办法比较蠢,就是做一个提示Form,在上面标明正在加载资源,放在要显示的Form窗体的load方法中,在

窗体Resize的效果,能否做到这样?:延迟重绘界面?

问题描述 我用了<Grid>来布局窗体.我希望的效果是:当我用鼠标拖动窗体边缘的时候(拖动过程中),不希望里面的控件布局跟着变化.当鼠标拖动的动作就要结束了,然后在MouseUp的瞬间,界面进行一次性的重绘. 解决方案 解决方案二:拦截消息吧解决方案三:我的意思就是,当我在拖动窗体边界的时候,窗体里的控件的任何呈现,都维持不变.当拖动结束的时候,一次性的重绘整个界面的呈现.解决方案四:通常grid布局,是会自动根据窗体的resize情况,来即时重绘整个界面的呈现.对于我的配置不高的机子,对资源

自定义jQuery插件方式实现强制对象重绘的方法

 这篇文章主要介绍了自定义jQuery插件方式实现强制对象重绘的方法,实例分析了jQuery插件及对象重绘的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了自定义jQuery插件方式实现强制对象重绘的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 jQuery.fn.redraw = function(){ jQuery(this).each(function(){ this.style.display='none'; this.off

java树的节点事件里调用repaint方法 不能实现重绘

问题描述 java树的节点事件里调用repaint方法 不能实现重绘 java树的节点事件里调用repaint方法 不能实现重绘 怎么解决......................... 解决方案 http://zhidao.baidu.com/link?url=_s3y58ND8LIk-TtWOqBE2sXSaX5vKISRuxgRbdlCvZ2TPcjjujnp85-84Xto3Pa3rh7GEZ8yJ5ctIOYQxF7wTq

显示-C#窗体重绘为圆形的的问题

问题描述 C#窗体重绘为圆形的的问题 我创建了一个C#窗体,想要将此窗体显示为圆形界面,但是使用paint事件后,在程序运行时会先显示一个正方形的边框后半秒才将我的界面绘成圆形,我听说有可以从底层该变窗体的形状,请问要怎么改啊? 解决方案 http://blog.sina.com.cn/s/blog_3d7bed650100b90a.htmlhttp://wenku.baidu.com/link?url=XjNML9mD9CuFAELHzISHKV7o9EfMUjNeoVNFpThCLJJDlq

自定义jQuery插件方式实现强制对象重绘的方法_jquery

本文实例讲述了自定义jQuery插件方式实现强制对象重绘的方法.分享给大家供大家参考.具体实现方法如下: jQuery.fn.redraw = function(){ jQuery(this).each(function(){ this.style.display='none'; this.offsetHeight; // no need to store this anywhere, the reference is enough this.style.display='block'; });

java ondraw重绘有哪些方法可以使用

问题描述 java ondraw重绘有哪些方法可以使用 安卓开发中要用到ondraw重绘机制,不知道有哪些方法可以用,最好举个例子,谢谢~ 解决方案 invalidate和postinvalidate,当然,也可以通过发消息实现重绘界面咯

急...重绘控件拖动窗体时,只要控件部分被掩盖了就会出现残影这样的问题,请教好何解决!!!

问题描述 [img=///:QQPCmgr桌面][/img] 解决方案 解决方案二:该回复于2012-03-21 20:28:09被版主删除解决方案三:该回复于2012-03-21 20:28:14被版主删除解决方案四:该回复于2012-03-21 20:28:15被版主删除解决方案五:具体问题具体分析,图....解决方案六:本地图传不上去,就是重绘的控件,当窗体被别的窗体覆盖时,再把别的窗体拖走,控件就不成样子了