请问GDI+的双缓冲到底如何实现,有没有代码给我参考下??? 请问GDI+的双缓冲到底如何实现,有没有代码给我参考下??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用, SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, true);SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer, true); 激活双缓冲:方法一:this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);(OptimizedDoubleBuffer替换了之前版本的DoubleBuffer,除非为了兼容性,应该避免使用DoubleBuffer)方法二:在窗体设计器中将窗体的DoubleBuffered属性设为true。(默认为false)。这是由Control基类实现的,所以应该将所有自定义控件和用户控件的DoubleBuffered属性设置为true:base.DoubleBuffered=true; class Clock { Graphics g; Control p; Image backGround; Image secHand; Image minHand; Image houHand; Thread thr; public Clock() { SetSkin(); thr = new Thread(new ThreadStart(Draw)); } void SetSkin() { backGround = Skin.clock_Bg;// Resource1.BackGround; //Image.FromFile(Setting.Clock.ClockBackGround); secHand = Skin.clock_SHand;//Resource1.SecoundHand; //Image.FromFile(Setting.Clock.SecoundHand ); minHand = Skin.clock_MHand; //Resource1.MinutHand; //Image.FromFile(Setting.Clock.MinuteHand ); houHand = Skin.clock_HHand;//Resource1.HourHand;// Image.FromFile(Setting.Clock.HourHand); } public Graphics SetGraphic { set { g = value; } } public Control SetPanel { set { p = value; p.Width = backGround.Width; p.Height = backGround.Height; } } public void ModifySkin() { backGround = Skin.clock_Bg;// Resource1.BackGround; //Image.FromFile(Setting.Clock.ClockBackGround); secHand = Skin.clock_SHand;//Resource1.SecoundHand; //Image.FromFile(Setting.Clock.SecoundHand ); minHand = Skin.clock_MHand; //Resource1.MinutHand; //Image.FromFile(Setting.Clock.MinuteHand ); houHand = Skin.clock_HHand;//Resource1.HourHand;// Image.FromFile(Setting.Clock.HourHand); } public void Dispose() { thr.Abort (); } public void BeginDraw() { thr.Start(); } void Draw() { if (p != null && g != null) { int totalTime = 0; int secCount = DateTime.Now.Second ; int minCount = DateTime.Now.Minute ; int hourCount = ((DateTime.Now.Hour)); do { int timeSpan =1000; SetSkin(); Point center = new Point(p.Width / 2, p.Height / 2); Graphics buffer ; //背景 Bitmap backGroundBit = new Bitmap(p.Width, p.Height); buffer = Graphics.FromImage(backGroundBit); buffer.Clear(Setting.Clock.MakeTransparentColor); buffer.DrawImage(backGround, new Rectangle(center.X - backGround.Width / 2, center.Y - backGround.Height / 2, backGround.Width, backGround.Height), new Rectangle(0, 0, backGround.Width, backGround.Height), GraphicsUnit.Pixel); buffer.Dispose(); //时针 buffer = Graphics.FromImage(backGroundBit); buffer.TranslateTransform(center.X, center.Y); buffer.RotateTransform((float)hourCount * 360f / 12f +180 ); buffer.TranslateTransform(0, -10); buffer.DrawImage(houHand, 0 ,0); buffer.Dispose(); //分针 buffer = Graphics.FromImage(backGroundBit); buffer.TranslateTransform(center.X, center.Y); buffer.RotateTransform((float)minCount * 6+186 ); buffer.TranslateTransform(0, -10); buffer.DrawImage(minHand, 0,0 ); buffer.Dispose(); //秒针 buffer = Graphics.FromImage(backGroundBit); buffer.TranslateTransform(center.X, center.Y); buffer.RotateTransform(((float)secCount) * 6 +186 ); buffer.TranslateTransform(0, -10); buffer.DrawImage(secHand, 0, 0 ); buffer.Dispose(); //输出时间 Font font = new Font("Arial", 12, FontStyle.Bold); SizeF size = g.MeasureString(DateTime.Now.ToLongTimeString(), font); Bitmap wordsBit = new Bitmap((int)size.Width+1, (int)size.Height+1); buffer = Graphics.FromImage(wordsBit); SolidBrush brush; brush = new SolidBrush(Color.White); buffer.DrawString(DateTime.Now.ToLongTimeString(), font, brush, new PointF(1, 1)); //buffer.TranslateTransform(center.X, center.Y); buffer.Dispose(); brush = new SolidBrush(Color.Black ); int r =p.Width/2 ; Bitmap numBit = new Bitmap(r*2, r*2); buffer = Graphics.FromImage(numBit); buffer.TranslateTransform(r ,r); for (int i = 0; i < 12; i++) { PointF pp = new PointF(-buffer.MeasureString((i + 1).ToString(), font).Width / 2, -r); buffer.RotateTransform(30); buffer.DrawString((i+1).ToString(), font, brush,pp ); } buffer.Dispose (); //合成 g.DrawImage(backGroundBit, new Point(0, 0)); g.DrawImage(wordsBit, new PointF(center.X - size.Width / 2, center.Y + 12)); g.DrawImage(numBit, new Point(0, 0)); wordsBit.Dispose(); backGroundBit.Dispose(); totalTime++; secCount = DateTime.Now.Second; minCount = DateTime.Now.Minute; hourCount = ((DateTime.Now.Hour)); thr.Join(timeSpan); } while (true); } } }Draw里面就是双缓冲。看看吧。。写的一个时钟写的烂。。见笑了。。 想做一个论坛的登录器,点一下可以登录很多小号的那种,请教 已写出单变量的递归,求多变量递归的算法 C#/ASP.NET/.NET三者的区别是什么? C# winform 在线文档显示 关于泛型的【快速排序】问题,大家帮帮忙 请教WebService中的二个小问题,高手请指点 怎样延迟事件的触发? 水晶报表如何实现打印当前页 在单文档应用程序中,怎么切换页面呀 继续求助:如何在两个页面间传值? session用户的问题 急等高手解答
SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer, true);
方法一:
this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
(OptimizedDoubleBuffer替换了之前版本的DoubleBuffer,除非为了兼容性,应该避免使用DoubleBuffer)
方法二:
在窗体设计器中将窗体的DoubleBuffered属性设为true。(默认为false)。
这是由Control基类实现的,所以应该将所有自定义控件和用户控件的DoubleBuffered属性设置为true:
base.DoubleBuffered=true;
class Clock
{
Graphics g;
Control p;
Image backGround;
Image secHand;
Image minHand;
Image houHand;
Thread thr;
public Clock()
{ SetSkin();
thr = new Thread(new ThreadStart(Draw));
}
void SetSkin()
{
backGround = Skin.clock_Bg;// Resource1.BackGround; //Image.FromFile(Setting.Clock.ClockBackGround);
secHand = Skin.clock_SHand;//Resource1.SecoundHand; //Image.FromFile(Setting.Clock.SecoundHand );
minHand = Skin.clock_MHand; //Resource1.MinutHand; //Image.FromFile(Setting.Clock.MinuteHand );
houHand = Skin.clock_HHand;//Resource1.HourHand;// Image.FromFile(Setting.Clock.HourHand);
}
public Graphics SetGraphic
{
set
{
g = value;
}
}
public Control SetPanel
{
set
{
p = value;
p.Width = backGround.Width;
p.Height = backGround.Height;
}
}
public void ModifySkin()
{
backGround = Skin.clock_Bg;// Resource1.BackGround; //Image.FromFile(Setting.Clock.ClockBackGround);
secHand = Skin.clock_SHand;//Resource1.SecoundHand; //Image.FromFile(Setting.Clock.SecoundHand );
minHand = Skin.clock_MHand; //Resource1.MinutHand; //Image.FromFile(Setting.Clock.MinuteHand );
houHand = Skin.clock_HHand;//Resource1.HourHand;// Image.FromFile(Setting.Clock.HourHand);
}
public void Dispose()
{
thr.Abort ();
}
public void BeginDraw()
{
thr.Start();
}
void Draw()
{
if (p != null && g != null)
{
int totalTime = 0;
int secCount = DateTime.Now.Second ;
int minCount = DateTime.Now.Minute ;
int hourCount = ((DateTime.Now.Hour));
do
{ int timeSpan =1000;
SetSkin();
Point center = new Point(p.Width / 2, p.Height / 2);
Graphics buffer ;
//背景
Bitmap backGroundBit = new Bitmap(p.Width, p.Height);
buffer = Graphics.FromImage(backGroundBit);
buffer.Clear(Setting.Clock.MakeTransparentColor);
buffer.DrawImage(backGround, new Rectangle(center.X - backGround.Width / 2, center.Y - backGround.Height / 2, backGround.Width, backGround.Height), new Rectangle(0, 0, backGround.Width, backGround.Height), GraphicsUnit.Pixel);
buffer.Dispose();
//时针
buffer = Graphics.FromImage(backGroundBit);
buffer.TranslateTransform(center.X, center.Y);
buffer.RotateTransform((float)hourCount * 360f / 12f +180 );
buffer.TranslateTransform(0, -10);
buffer.DrawImage(houHand, 0 ,0);
buffer.Dispose();
//分针
buffer = Graphics.FromImage(backGroundBit);
buffer.TranslateTransform(center.X, center.Y);
buffer.RotateTransform((float)minCount * 6+186 );
buffer.TranslateTransform(0, -10);
buffer.DrawImage(minHand, 0,0 );
buffer.Dispose();
//秒针
buffer = Graphics.FromImage(backGroundBit);
buffer.TranslateTransform(center.X, center.Y);
buffer.RotateTransform(((float)secCount) * 6 +186 );
buffer.TranslateTransform(0, -10);
buffer.DrawImage(secHand, 0, 0 );
buffer.Dispose();
//输出时间
Font font = new Font("Arial", 12, FontStyle.Bold);
SizeF size = g.MeasureString(DateTime.Now.ToLongTimeString(), font);
Bitmap wordsBit = new Bitmap((int)size.Width+1, (int)size.Height+1);
buffer = Graphics.FromImage(wordsBit);
SolidBrush brush;
brush = new SolidBrush(Color.White);
buffer.DrawString(DateTime.Now.ToLongTimeString(), font, brush, new PointF(1, 1));
//buffer.TranslateTransform(center.X, center.Y);
buffer.Dispose();
brush = new SolidBrush(Color.Black );
int r =p.Width/2 ;
Bitmap numBit = new Bitmap(r*2, r*2);
buffer = Graphics.FromImage(numBit);
buffer.TranslateTransform(r ,r);
for (int i = 0; i < 12; i++)
{
PointF pp = new PointF(-buffer.MeasureString((i + 1).ToString(), font).Width / 2, -r);
buffer.RotateTransform(30);
buffer.DrawString((i+1).ToString(), font, brush,pp );
}
buffer.Dispose ();
//合成
g.DrawImage(backGroundBit, new Point(0, 0));
g.DrawImage(wordsBit, new PointF(center.X - size.Width / 2, center.Y + 12));
g.DrawImage(numBit, new Point(0, 0)); wordsBit.Dispose();
backGroundBit.Dispose();
totalTime++; secCount = DateTime.Now.Second;
minCount = DateTime.Now.Minute;
hourCount = ((DateTime.Now.Hour)); thr.Join(timeSpan); }
while (true);
}
}
}
Draw里面就是双缓冲。看看吧。。写的一个时钟
写的烂。。见笑了。。