请教如何解决双缓冲android 刷新控件和半透明控件显示背

用双缓冲画图时建立的画布有背景色,怎么将背景色透明_读书人
用双缓冲画图时建立的画布有背景色,怎么将背景色透明
&来源:读书人网&【读书人网():综合教育门户网站】
用双缓冲画图时建立的画布有背景色,如何将背景色透明用双缓冲画图时建立的画布有背景色,如何将背景色透明。
用双缓冲画图时建立的画布有背景色,如何将背景色透明用双缓冲画图时建立的画布有背景色,如何将背景色透明。对话框有个背景色,双缓冲画布也有背景色,用来重绘的图片PNG格式,有部分透明。如何把画图和对话框的背景色透明,以至图片显示时透明部分显示的是桌面或者其他窗口图[解决办法]用的是GDI绘图,所有绘图都是在OnPaint函数里进行的,将pDC-&SetBKMode()设置透明是没有效果的..[解决办法]取桌面对应位置的图后再在其上绘制。[解决办法]引用:取桌面对应位置的图后再在其上绘制。请问如何取桌面对应位置?[解决办法]引用:取桌面对应位置的图后再在其上绘制。位置我能确定,就是如何生成带有对应位置图像的CBitmap[解决办法]以前玩C#试过,插入图片做背景,有相应的函数设置成透明。自己实现的话,觉得原理上还是要取桌面图片与背景图片进行alpha混合操作。[解决办法]引用:以前玩C#试过,插入图片做背景,有相应的函数设置成透明。自己实现的话,觉得原理上还是要取桌面图片与背景图片进行alpha混合操作。我要的是具体的处理方法...[解决办法]想透明&就得分层窗口[解决办法]我需要的是一个圆角矩形,多方查阅后发现MFC里面用CreateRoundRectRgn函数能直接生成圆角矩形,用不着透明。问题解决了。C#Winform频繁刷新导致界面闪烁解决方法 - 龙心纹 - 博客园
一、通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲)
对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。
在构造函数里加上以下代码:
1 this.DoubleBuffered = true;//设置本窗体
2 SetStyle(ControlStyles.UserPaint, true);
3 SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
4 SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
5 //SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
7 //UpdateStyles();
二、C#控件的闪烁问题解决方法总结最近对代码作了一些优化,试验后效果还可以,但是发现界面会闪烁,具体是TreeView控件会闪烁,语言为C#,IDE为VS2005。在查阅一些资料,使用了一些基本技术后(如开启双缓冲),发现没什么效果。& & & & 于是使用Profiler工具,查找出瓶颈在于每次更新完界面的EndUpdate操作(使用这个是为了减少界面更新次数,但这里不理想是因为控件中中的元素很多),猜想大概每次更新,.Net底层都会更新重绘每个图元,所以速度会慢,造成闪烁。但是如果这样,使用双缓冲应该会有较好效果。再看代码,发现可能是更新动作太过频繁,于是降低速度,有所好转,但还是不行。& & & &继续在网上查阅,最终找到一个方案比较合适。原来底层重绘每次会清除画布,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消息发送函数操作,禁掉这条消息。代码如下:
1 protected override void WndProc(ref Message m)
if (m.Msg == 0x0014) // 禁掉清除背景消息
base.WndProc(ref m);
注:双缓冲还是有用的,在更新不是很频繁且控件内含元素不是特别多的时候。一旦元素过多,每次更新时间都比较长,即便使用了双缓冲,仍解决不了闪烁问题。个人认为最终比较理想的方法还是禁掉清除背景消息。
附:一些尝试过但失败的记录1)使用setStyle& & & 网上有说使用setStyle函数去设置该控件的参数,具体为:& & & SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);& & & 这三个选项参数后者是依赖前者的,必须并存,否则无效。并且这个函数本身是protected的,所以首先需要继承某控件再使用。& & & 这个目标是跟前面正确解决方案一致,也是禁止清除背景并开启双缓冲,但需要使用用户绘制选项,而且是全部交由用户绘制。这需要自己实现控件的全部绘制,比较麻烦。所以这个方法不是完全不可行,但是需要额外工作量,不推荐。我也没有使用。
2)使用BeginUpdate和EndUpdate& & & 这一对操作对于需要批量操作更新控件的情景有比较好的效果,比如初始化时批量添加了大量节点。坏处就在于不能即时更新。所以,对于频繁的更新节点并希望立即反映到界面的情况不适用。如果使用并且没有禁掉清除界面消息的话,则控件看起来就会不停的闪烁,而且以白底为主,内容几乎不可见(这个视频繁程度而定)。因为界面更新都在EndUpdate处完成,操作太多导致EndUpdate阻塞时间过长,且清空在先,更新在后,导致界面看起来长时间处于空白状态。
3)使用ControlStyles.EnableNotifyMessage选项& & & 这个选项的作用和正确解决方案也是一致的。使用方法是:& & & SetStyle(ControlStyles.EnableNotifyMessage, true);& & & protected override void onNotifyMessage(Message m)& & & {& & & & & & & &// 此处书写过滤消息代码& & & }& & & 但是实际实验显示无效果,不知是什么原因,没有细究。
三、个人在一个winfrom中测试利用timer控件对要刷新的控件进行定时刷新,可能也能起到作用。
四、C# winform 局部刷新做winform界面程序时,经常会遇到后台处理占用大量时间的情况,这就会造成界面假死状态。一般解决界面假死有两种方式:要么把占用大量时间的处理方式放入其他线程;要么把界面显示放入其他线程。第一种方式应该比较简单,开单独的线程,处理数据,将处理数据显示到界面就好。但是我们经常需要在主程序运算一些内容,否则可能会改动比较大。因此,这里讲讲第二种方式。同样是使用多线程,但是c#在其他线程刷新有一点点问题,即不能跨线程操作界面。这可以使用控件的Invoke方法解决:
1 private delegate void CrossThread();
2 Control control = ....;
3 CrossThread cross = delegate()
control.Refresh();
7 control.Invoke(cross);
这样可以让控件在其它线程刷新界面。
再加上开新线程后的通用方法:
1 private void InvaliateControl(Control control)
Thread t = new Thread(
new ThreadStart(delegate()
CrossThread cross = delegate()
control.Refresh();
control.Invoke(cross);
这样就可以在任何时候,调用此方法对控件进行刷新,而不将整个界面刷新。如果对于同一个控件,连续多次刷新,可以添加一个成员变量作为标记,以免同一控件连续多次刷新,提升部分性能。
补充:在主线程调用耗时操作用此方法可能会有问题,经过验证调用Invoke函数,其实是在主线程刷新界面。请教如何解决双缓冲刷新和半透明控件显示背景的矛盾
在下在一个对话框上想绘制一个动画,因此需要使用双缓冲进行不断地刷新;然而在该对话框上又有需要半透明效果的控件(比如半透明的PNG按钮),使他们能透过本身显示出下面对话框背景的颜色。
个人在实际的使用中,发现以我掌握到的方法,对话框的双缓冲和半透明控件之间似乎很难共存。主要是如下几个方面造成的
-10:17&&&[]
在下在一个对话框上想绘制一个动画,因此需要使用双缓冲进行不断地刷新;然而在该对话框上又有需要半透明效果的控件(比如半透明的PNG按钮),使他们能透过本身显示出下面对话框背景的颜色。
个人在实际的使用中,发现以我掌握到的方法,对话框的双缓冲和半透明控件之间似乎很难共存。主要是如下几个方面造成的
20:06&&&[]
目前要解决一个控件闪烁问题,在OnTimer中刷新时间,显示在对话框中,由于有闪烁问题,所以采用双缓冲技术实现,可是由于我的对话框是贴图的,而又不知道该如何把画刷设置成透明色,所以效果如下:
黑色条目,时间区域是白色背景,由于我的对话框有背景图,所以我不知道该怎么创建一把透明的画刷
18:00&&&[]
我想利用CImageDecoder的Create和Convert显示半透明的PNG图片,同时使用双缓冲的方式,draw的时候用DrawBitmapMasked,有什么办法吗?
如果没有半透明图片,用下面代码创建一个缓冲区是成功的。但显示半透明图片时,Convert的时候生成了一个
15:15&&&[]
我想利用CImageDecoder的Create和Convert显示半透明的PNG图片,同时使用双缓冲的方式,draw的时候用DrawBitmapMasked,有什么办法吗?
如果没有半透明图片,用下面代码创建一个缓冲区是成功的。但显示半透明图片时,Convert的时候生成了一个
14:50&&&[]
进行绘制图形。在绘制完成后利用 BitBlt函数把内存的图形直接拷贝到屏幕上即可。 & & & & 具体想实现的是: 在Dialog客户区的一个图片控件(IDC_MAP)中绘制几个动态的点,如果不用双缓冲的技术,在屏幕刷新的时候会有闪烁的现象
22:56&&&[]
有时候不希望画的时候出现叠加,而是平铺的感觉(就是叠被子那样的感觉,谁也盖不上谁)
下面这线的画面是糟糕的,
必须变成第2张才是合格的(无叠加)。
回复讨论(解决方案)
GDI+不适合做这个,它效率比较低。你还是自己写一个Brush的类吧。
CreateDIBSection
-17:13&&&[]
利用双缓冲将两张图贴在同一对话框中,
如果将两张图片中的的白色透明显示?
有白色当两张重叠时将原先的一张叠盖掉了,无法显示第一张图上的背景(即非白色区域)
不知道这样形容你们懂不懂,想了半天不知道怎么说才好,希望知道的朋友帮助下,网上找了半天没相关的资料。只看到一个却下载不了……
-20:15&&&[]
,&0,&0,&SRCCOPY); memdc.DeleteDC();
回复讨论(解决方案)
求大神帮忙啊。到底为什么啊。。。
覆盖了其他控件,重绘好让其他控件刷新即可。
保留其他控件的指针,Invalidate即可
上次有人提过类似的问题,需要
-10:27&&&[]
现在我想开发一个Winform的用户控件,可以配置一张png图作为背景图,并且支持半透明的效果(不仅仅是透明!)
但实际开发中发现,如果这个用户控件的承载窗体“透明”了,控件的半透明效果会锯齿。。见图:
PS&1.&控件OnPaint时设置高质量、抗锯齿,无解
-13:40&&&[]
是这样。有个窗体,用当前桌面填充了窗体背景。然后再用CImage在窗体上显示一张半透明的PNG。窗体背景图要实时刷新的,因此要求PNG也要实时刷新,普通的做法就会出现闪烁。我想先截取背景图存入CImage对象bg中,再将一个半透明的CImage对象(PNG)画到这个bg中。最后再把这个bg画到窗体
-19:47&&&[]
用双缓冲画图时建立的画布有背景色,如何将背景色透明。
用GDI+重绘对话框,对话框有个背景色,双缓冲画布也有背景色,用来重绘的图片PNG格式,有部分透明。
如何把画图和对话框的背景色透明,以至图片显示时透明部分显示的是桌面或者其他窗口图
回复讨论(解决方案)
从当前的背景中截取图片作为
15:32&&&[]一、 画面闪烁问题与双缓冲技术
1.1 导致画面闪烁的关键原因分析:
1& 绘制窗口由于大小位置状态改变进行重绘操作时
  绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。刷新过程中会导致所有图元重新绘制,
而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,
因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。
  所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。
  根据以上分析可知,当图数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新
都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。
解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。
2、进行鼠标跟踪绘制操作或者对图元进行变形操作时
  当进行鼠标跟踪绘制操作或者对图元进行变形操作时,Paint事件会频繁发生,这会使窗口的刷新次数大大增加。虽然窗口刷新一次的过程中所有图元同时显示到窗口,但
也会有时间延迟,因为此时窗口刷新的时间间隔远小于图元每一次显示到窗口所用的时间。因此闪烁现象并不能完全消除!
  所以说,此时导致窗口闪烁现象的关键因素在于Paint事件发生的次数多少。
  解决此问题的关键在于:设置窗体或控件的几个关键属性。
1.2 双缓冲的关键技术
1、设置显示图元控件的几个属性,这样可以使效果更加明显。
this.SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.ResizeRedraw|ControlStyles.AllPaintingInWmPaint,true);
2、窗口刷新一次的过程中,让所有图元同时显示到窗口。
Bitmap bmp=null;
Graphics g_bmp=null;
bmp=new Bitmap(this.Width,this.Height);
g_bmp=Graphics.FromImage(bmp);
g_bmp.Clear(this.BackColor);
g_bmp.DrawString("重绘",this.Font,new SolidBrush(this.ForeColor),this.Location.X+1,this.Location.Y+1);
this.Refresh();
//在OnPaint方法中实现下面代码
private void this_Paint(object sender,PaintEventArgs e)
Graphics g=e.G
if(g==null) return;
if(g_bmp!=null)
g.DrawImage((Image)bmp,0,0);
1.3& 窗口刷新一次的过程中,让所有图元同时显示到窗口&
可以通过以下几种方式实现,这几种方式都涉及到Graphics对象的创建方式。具体实现:
1、& 利用默认双缓冲
(1)在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲。通过将 DoubleBuffered 属性设置为 true。 &&& this.DoubleBuffered=
(2)使用 SetStyle 方法可以为 Windows 窗体和所创作的 Windows 控件启用默认双缓冲。
&& SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
2、& 手工设置双缓冲 .netframework提供了一个类BufferedGraphicsContext负责单独分配和管理图形缓冲区。每个应用程序域都有自己的默认
BufferedGraphicsContext
实例来管理此应用程序的所有默认双缓冲。大多数情况下,每个应用程序只有一个应用程序域,所以每个应用程序通常只有一个默认
BufferedGraphicsContext。默认 BufferedGraphicsContext 实例由
BufferedGraphicsManager 类管理。通过管理BufferedGraphicsContext实现双缓冲的步骤如下:
(1)获得对 BufferedGraphicsContext 类的实例的引用。
(2)通过调用 BufferedGraphicsContext.Allocate 方法创建 BufferedGraphics 类的实例。
(3)通过设置 BufferedGraphics.Graphics 属性将图形绘制到图形缓冲区。
(4)当完成所有图形缓冲区中的绘制操作时,可调用 BufferedGraphics.Render 方法将缓冲区的内容呈现到与该缓冲区关联的绘图图面或者指定的绘图图面。
(5)完成呈现图形之后,对 BufferedGraphics 实例调用释放系统资源的 Dispose 方法。
完整的例子,在一个400*400的矩形框内绘制10000个随机生成的小圆。
BufferedGraphicsContext current = BufferedGraphicsManager.C //(1)
bg = current.Allocate(this.CreateGraphics(),this.DisplayRectangle); //(2)
Graphics g = bg.G//(3)
//随机 宽400 高400
System.Random rnd = new Random();
int x,y,w,h,r,i;
for (i = 0; i & 10000; i++)
x = rnd.Next(400);
y = rnd.Next(400);
r = rnd.Next(20);
w = rnd.Next(10);
h = rnd.Next(10);
g.DrawEllipse(Pens.Blue, x, y, w, h);
bg.Render();//(4)
//bg.Render(this.CreateGraphics());
bg.Dispose();//(5)
3、&& 自己开辟一个缓冲区
如一个不显示的Bitmap对象,在其中绘制完成后,再一次性显示。
完整代码如下:
Bitmap bt = new Bitmap(400, 400);
Graphics bg = Graphics.FromImage(bt);
System.Random rnd = new Random();
int x, y, w, h, r,
for (i = 0; i & 10000; i++)
x = rnd.Next(400);
y = rnd.Next(400);
r = rnd.Next(20);
w = rnd.Next(10);
h = rnd.Next(10);
bg.DrawEllipse(Pens.Blue, x, y, w, h);
this.CreateGraphics().DrawImage(bt, new Point(0, 0));
另外一个例子,差不多Graphics对象的创建方式:
&a、在内存上创建一块和显示控件相同大小的画布,在这块画布上创建Graphics对象。&&&& 接着所有的图元都在这块画布上绘制,绘制完成以后再使用该画布覆盖显示控件的背景,从而达到&显示一次仅刷新一次&的效果!  实现代码(在OnPaint方法中):
Rectangle rect = e.ClipR
Bitmap bufferimage = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bufferimage);
g.Clear(this.BackColor);
g.SmoothingMode = SmoothingMode.HighQ //高质量
g.PixelOffsetMode = PixelOffsetMode.HighQ //高像素偏移质量
foreach (IShape drawobject in doc.drawObjectList)
if (rect.IntersectsWith(drawobject.Rect))
drawobject.Draw(g);
if (drawobject.TrackerState == config.Module.Core.TrackerState.Selected
&& this.CurrentOperator == Enum.Operator.Transfrom)//仅当编辑节点操作时显示图元热点
drawobject.DrawTracker(g);
using (Graphics tg = e.Graphics)
tg.DrawImage(bufferimage, 0, 0);//把画布贴到画面上
b、直接在内存上创建Graphics对象。
Rectangle rect = e.ClipR
BufferedGraphicsContext currentContext = BufferedGraphicsManager.C
BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle);
Graphics g = myBuffer.G
g.SmoothingMode = SmoothingMode.HighQ
g.PixelOffsetMode = PixelOffsetMode.HighS
g.Clear(this.BackColor);
foreach (IShape drawobject in doc.drawObjectList)
if (rect.IntersectsWith(drawobject.Rect))
drawobject.Draw(g);
if (drawobject.TrackerState == config.Module.Core.TrackerState.Selected
&& this.CurrentOperator == Enum.Operator.Transfrom)//仅当编辑节点操作时显示图元热点
drawobject.DrawTracker(g);
myBuffer.Render(e.Graphics);
myBuffer.Dispose();//释放资源
至此,双缓冲问题解决,两种方式的实现效果都一样,但最后一种方式的占有的内存很少,不会出现内存泄露!
1.4 对acdsee拖动图片效果的实现
开始不懂双缓冲,以为双缓冲可以解决这个问题,结果发现使用了双缓冲没啥效果,请教了高人,然后修改了些代码,完成这个效果。图片是在pictureBox1里。
Bitmap currentM
bool first = true;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
if (zoom == 0)
if (e.Button == MouseButtons.Left) //dragging
mousedrag = e.L
Image myImage = myMap.GetMap();
currentMap = new Bitmap(myImage);
first = false;
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
if (zoom == 0&&!first)
Image img = new Bitmap(Size.Width, Size.Height);
Graphics g = Graphics.FromImage(img);
g.Clear(Color.Transparent);//图片移动后显示的底色
g.SmoothingMode = SmoothingMode.HighQ //高质量
g.PixelOffsetMode = PixelOffsetMode.HighQ //高像素偏移质量
g.DrawImageUnscaled(currentMap, new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y));//在g中移动图片,原图在(0,0)画的,所以直接用new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y)就好。
g.Dispose();
pictureBox1.Image =//img是在鼠标这个位置时生成被移动后的暂时的图片
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
if (zoom == 0)
System.Drawing.Point pnt = new System.Drawing.Point(Width / 2 + (mousedrag.X - e.Location.X),
Height / 2 + (mousedrag.Y - e.Location.Y));
myMap.Center = myMap.ImageToWorld(pnt);
pictureBox1.Image = myMap.GetMap();
first = true;
说说思路,在鼠标点下时创建一个bitmap,currentMap,用它来存放当前图像。鼠标移动时,根据鼠标位置画图,最后,鼠标up时,重新画图。
在使用gdi技术绘图时,有时会发现图形线条不够流畅,或者在改变窗体大小时会闪烁不断的现象.(Use DoubleBuffer to solve it!)
1.线条不流畅:窗体在重绘时自身重绘与图形重绘之间存在时间差,导致二者图像显示不协调
2.改变窗体大小不流畅:重绘时自身背景颜色与图形颜色频繁交替,造成视觉上的闪烁
下面,用四个图形例子解决这个问题 :贝塞尔曲线,圆形,矩形,不规则图形
&思路:首先用 width 定义位图的宽度; height 定义位图的高度
//创建一个与窗体工作区大小相同的位图实例
// image:Image类的子类的实例引用
Bitmap localBitmap=new Bitmap(CilentRectangle.Width,CilentRectangle.Height) //创建位图实例
// image:要绘制的图像
x:绘制的图像的左上角 x坐标 y:左上角y坐标
Graphics g=e.G//获取窗体画布
g.DrawImage(localBitmap,0,0);
//在窗体中绘制出内存中的图像
实现:由于Paint被 .net隐藏,我们需要在窗体代码中加上自己的Paint事件中绘制窗口
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
private void InitializeComponent()
this.SuspendLayout();
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.F
this.ClientSize = new System.Drawing.Size(388, 325);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "双缓冲技术绘图";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
this.ResumeLayout(false);
using System.Collections.G
using ponentM
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.Drawing.Drawing2D;
namespace DoubleBuffer
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void Form1_Paint(object sender, PaintEventArgs e)
Bitmap localBitmap = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
//创建位图实例
Graphics g_bmp= Graphics.FromImage(localBitmap);
g_bmp.Clear(BackColor);
g_bmp.SmoothingMode = SmoothingMode.AntiA
PaintImage(g_bmp);
Graphics g = e.G//获取窗体画布
g.DrawImage(localBitmap, 0, 0); //在窗体的画布中绘画出内存中的图像
g_bmp.Dispose();
localBitmap.Dispose();
g.Dispose();
private void PaintImage(Graphics g)
GraphicsPath path = new GraphicsPath(new Point[]{ new Point(100,60),new Point(350,200),new Point(105,225),new Point(190,ClientRectangle.Bottom),
new Point(50,ClientRectangle.Bottom),new Point(50,180)}, new byte[]{
(byte)PathPointType.Start,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Bezier,
(byte)PathPointType.Line,
(byte)PathPointType.Line});
PathGradientBrush pgb = new PathGradientBrush(path);
pgb.SurroundColors = new Color[] { Color.Green, Color.Yellow, Color.Red, Color.Blue, Color.Orange, Color.LightBlue };
g.FillPath(pgb, path);
g.DrawString("双缓冲绘图", new Font("宋体", 18, FontStyle.Bold), new SolidBrush(Color.Red), new PointF(110, 20));
g.DrawBeziers(new Pen(new SolidBrush(Color.Green),2),new Point[] {new Point(120,100),new Point(120,120),new Point(120,100),new Point(120,150)});
g.DrawArc(new Pen(new SolidBrush(Color.Blue), 5), new Rectangle(new Point(120, 170), new Size(60, 60)), 0, 360);
g.DrawRectangle(new Pen(new SolidBrush(Color.Orange), 3), new Rectangle(new Point(240, 260), new Size(90, 50)));
// Form 设计
namespace DoubleBuffer
partial class Form1
/// &summary&
/// 必需的设计器变量。
/// &/summary&
private ponentModel.IContainer components = null;
/// &summary&
/// 清理所有正在使用的资源。
/// &/summary&
/// &param name="disposing"&如果应释放托管资源,为 true;否则为 false。&/param&
protected override void Dispose(bool disposing)
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
#region Windows 窗体设计器生成的代码
/// &summary&
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// &/summary&
private void InitializeComponent()
this.SuspendLayout();
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.F
this.ClientSize = new System.Drawing.Size(388, 325);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "双缓冲技术绘图";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
this.ResumeLayout(false);
#endregion
当变化窗体时,会导致图像出现变形,可把窗体属性中的ResizeReDrae 设置为 true
增加绘制随机图形功能的动画效果如下:
现在将源码贡献自此,让不太懂双缓冲绘图的有一个大致的了解,以便少走笔者学习的弯路。如有问题,欢迎询问评论。
阅读(...) 评论()

我要回帖

更多关于 c 半透明控件 的文章

 

随机推荐