首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#绘制时钟时出现闪烁,自己试着用双缓冲也没有解决,大家帮忙看看咋回事,多谢了

2012-01-14 
C#绘制时钟时出现闪烁,自己试着用双缓冲也没有解决,大家帮忙看看怎么回事,谢谢了!如题[解决办法]给你一个

C#绘制时钟时出现闪烁,自己试着用双缓冲也没有解决,大家帮忙看看怎么回事,谢谢了!
如题

[解决办法]
给你一个参考的例子,是一个时钟,双缓冲绘制的:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace DoubleBufferDraw
{
public partial class clock : Form
{
public clock()
{
InitializeComponent();
Timer timer = new Timer();
timer.Enabled = true;
timer.Interval = 100;
timer.Tick += new EventHandler(timer_Tick);
}

void timer_Tick(object sender, EventArgs e)
{
this.paintClock(this.ClientRectangle);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
this.drawClock(e.Graphics, e.ClipRectangle);
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
this.paintClock(this.ClientRectangle);
}
private void drawClock(Graphics g, Rectangle rectangle)
{
SolidBrush brush1 = new SolidBrush(Color.SteelBlue);
SolidBrush brush2 = new SolidBrush(Color.SkyBlue);
SolidBrush brush3 = new SolidBrush(Color.Teal);
SolidBrush brush4 = new SolidBrush(Color.Teal);
SolidBrush brush5 = new SolidBrush(Color.Black);
Pen pen1 = new Pen(brush1, 2.0f); // "时点 "画笔
Pen pen2 = new Pen(brush2, 1.5f); // "分点 "画笔
Pen pen3 = new Pen(brush3, 0.2f); // "时针 "画笔
Pen pen4 = new Pen(brush4, 0.2f); // "分针 "画笔
Pen pen5 = new Pen(brush5, 1); // "秒针 "画笔
Point center = new Point(this.ClientRectangle.Left + this.ClientRectangle.Width / 2, this.ClientRectangle.Top + this.ClientRectangle.Height / 2);
//画表盘
for (int i = 1; i <= 60; i++)
{
if (i % 5 == 0)
g.DrawEllipse(pen1, center.X + (int)(Math.Cos(Math.PI / 180 * i * 6) * 60), center.Y + (int)(Math.Sin(Math.PI / 180 * i * 6) * 60), 2.0f, 2.0f);
else
g.DrawEllipse(pen2, center.X + (int)(Math.Cos(Math.PI / 180 * i * 6) * 60), center.Y + (int)(Math.Sin(Math.PI / 180 * i * 6) * 60), 1.5f, 1.5f);
}
//画时针
Point ph = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * ((DateTime.Now.Hour - 3) * 30 + DateTime.Now.Minute / 12 * 6)) * 40), center.Y + (int)(Math.Sin(Math.PI / 180 * ((DateTime.Now.Hour - 3) * 30 + DateTime.Now.Minute / 12 * 6)) * 40));
Point phl = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * ((DateTime.Now.Hour + 3) * 30 + DateTime.Now.Minute / 12 * 6)) * 7), center.Y + (int)(Math.Sin(Math.PI / 180 * ((DateTime.Now.Hour + 3) * 30 + DateTime.Now.Minute / 12 * 6)) * 7));
Point pch1 = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * ((DateTime.Now.Hour) * 30 + DateTime.Now.Minute / 12 * 6)) * -5), center.Y + (int)(Math.Sin(Math.PI / 180 * ((DateTime.Now.Hour) * 30 + DateTime.Now.Minute / 12 * 6)) * -5));
Point pch2 = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * ((DateTime.Now.Hour) * 30 + DateTime.Now.Minute / 12 * 6)) * 5), center.Y + (int)(Math.Sin(Math.PI / 180 * ((DateTime.Now.Hour) * 30 + DateTime.Now.Minute / 12 * 6)) * 5));
g.FillPolygon(brush1, new Point[] { ph, pch1, phl, pch2 });
//画分针
Point pm = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * (DateTime.Now.Minute - 15) * 6) * 48), center.Y + (int)(Math.Sin(Math.PI / 180 * (DateTime.Now.Minute - 15) * 6) * 48));
Point pml = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * (DateTime.Now.Minute + 15) * 6) * 9), center.Y + (int)(Math.Sin(Math.PI / 180 * (DateTime.Now.Minute + 15) * 6) * 9));
Point pcm1 = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * (DateTime.Now.Minute) * 6) * -4), center.Y + (int)(Math.Sin(Math.PI / 180 * (DateTime.Now.Minute) * 6) * -4));


Point pcm2 = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * (DateTime.Now.Minute) * 6) * 4), center.Y + (int)(Math.Sin(Math.PI / 180 * (DateTime.Now.Minute) * 6) * 4));
g.FillPolygon(brush1, new Point[] { pm, pcm1, pml, pcm2 });
//画秒针
Point pc = new Point(center.X, center.Y);
Point ps = new Point(center.X + (int)(Math.Cos(Math.PI / 180 * (DateTime.Now.Second - 15) * 6) * 48), center.Y + (int)(Math.Sin(Math.PI / 180 * (DateTime.Now.Second - 15) * 6) * 48));
g.DrawLine(pen5, pc, ps);
}
internal void paintClock(Rectangle rect)
{
if (!this.IsDisposed && this.Visible)
{
BufferedGraphicsContext myContext = BufferedGraphicsManager.Current;
BufferedGraphics buffer = myContext.Allocate(this.CreateGraphics(), rect);
if (buffer.Graphics != null)
{
buffer.Graphics.Clear(this.BackColor);
this.drawClock(buffer.Graphics, this.ClientRectangle);
}
buffer.Render();
buffer.Dispose();
}
}
}
}
[解决办法]
不要总是刷新背景。
[解决办法]
.NET 中的窗口控件自身就支持双缓冲的,只是要启用。你启用了吗。。
[解决办法]
using system;
namespace brawdraw.com.photoframe.net.publicfunctions.clock
{
/// <summary>
/// clocks style.时钟的样式定义
/// </summary>
public enum sevensegmentclockstyle
{
dateonly, // 只显示日期
timeonly, // 只显示时间
dateandtime //显示日期和时间
}
}

//--------------------------(如转载,请保留版权信息)-------------------------//
// sevensegmentclock.cs 朱继山 a3news(at)hotmail.com -------//
// ----------------------------- http://www.brawdraw.com ----------------------//
// -------------------- 未经书面许可,请勿用于商业用途 ---------------------//
using system;
using system.drawing;
using system.drawing.drawing2d;
using system.globalization;
using system.windows.forms;
using brawdraw.com.photoframe.net.publicfunctions;
using system.componentmodel;

namespace brawdraw.com.photoframe.net.publicfunctions.clock
{
//这是控件的关键代码
public class sevensegmentclock : usercontrol
{
datetime _datetime;
//默认使用同时绘制日期和时间
sevensegmentclockstyle _clockstyle = sevensegmentclockstyle.dateandtime;
color _clockcolor = color.black;
//是否绘制阴影(即残影),以摸拟真似的led时钟
bool _isdrawshadow = true;

timer _timer = null;
//是否自动更新时间
bool _istimerenable = false;
graphics g = null;
bitmap m_bitmap = null;

public bool isdrawshadow
{
get { return this._isdrawshadow; }
set
{
this._isdrawshadow = value;
this.invalidate();
}
}

[browsable(false)]
public system.windows.forms.timer timer
{
get { return this._timer; }
set
{
this._timer = value;
if(_timer != null)
{
_timer.tick += new eventhandler(timerontick);
}
}
}

public bool istimerenable
{
get { return this._istimerenable; }
set
{
if(value == true)
{
if(this._timer == null)
{
_timer = new timer();
_timer.tick += new eventhandler(timerontick);
_timer.interval = 1000;
_timer.enabled = true;
}
}
else
{
if(this._timer != null)
{
_timer.enabled = false;
}
}


this._istimerenable = value;
}
}

public void start()
{
this.istimerenable = true;
this.refresh();
}

public void stop()
{
this.istimerenable = false;
}

public system.datetime datetime
{
get { return this._datetime; }
set { this._datetime = value; }
}

//led文字的颜色
public system.drawing.color clockcolor
{
get { return this._clockcolor; }
set
{
this._clockcolor = value;
this.invalidate();
}
}

public sevensegmentclockstyle sevensegmentclockstyle
{
get { return this._clockstyle; }
set
{
this._clockstyle = value;
this.invalidate();
}
}

public sevensegmentclock()
{
text = "seven-segment clock ";
//使用双缓冲,支持透明绘制
setstyle(controlstyles.userpaint | controlstyles.doublebuffer | controlstyles.allpaintinginwmpaint
| controlstyles.resizeredraw | controlstyles.supportstransparentbackcolor, true);
this.updatestyles();
init();
_datetime = datetime.now;
}

//初始化
private void init()
{
m_bitmap = new bitmap(this.width, this.height);

g = graphics.fromimage(m_bitmap);
g.compositingquality = compositingquality.highquality;
g.textrenderinghint = system.drawing.text.textrenderinghint.antialiasgridfit;

//g.interpolationmode = interpolationmode.highqualitybicubic;
g.smoothingmode = smoothingmode.highquality;
//g.textrenderinghint = system.drawing.text.textrenderinghint.antialiasgridfit;
}

void timerontick(object obj, eventargs ea)
{
datetime dtnow = datetime.now;
dtnow = new datetime(dtnow.year, dtnow.month, dtnow.day, dtnow.hour, dtnow.minute, dtnow.second);
if (dtnow != _datetime)
{
_datetime = dtnow;
invalidate();
}
}

protected override void onpaint(painteventargs e)
{
m_bitmap = drawclock();
graphics gg = e.graphics;
gg.compositingquality = compositingquality.highquality;
gg.drawimageunscaled(m_bitmap, 0, 0);
//g.dispose();
}

public bitmap drawclock()
{
return this.drawclock(this.clientrectangle);
}

private void sevensegmentclock_resize(object sender, system.eventargs e)
{
init();
this.refresh();
}

private void initializecomponent()
{
//
// sevensegmentclock
//
this.name = "sevensegmentclock ";
this.size = new system.drawing.size(448, 64);
this.resize += new system.eventhandler(this.sevensegmentclock_resize);
}

int _clockstringwidth;
int _clockstringheight;
public int clockstringwidth
{
get
{
return _clockstringwidth;
}
}

public int clockstringheight
{
get
{
return _clockstringheight;
}
}

//绘制时钟
public bitmap drawclock(rectangle destrect)
{
m_bitmap = new bitmap(destrect.width, destrect.height);
//m_bitmap = new bitmap(destrect.x + this.width, destrect.y + this.height);
graphics grfx = graphics.fromimage(m_bitmap);
//设置绘图面板的绘制质量等
grfx.compositingquality = compositingquality.highquality;
grfx.textrenderinghint = system.drawing.text.textrenderinghint.antialiasgridfit;
grfx.smoothingmode = smoothingmode.highquality;

sevensegmentdisplay ssd = new sevensegmentdisplay(grfx);


ssd.isdrawshadow = this._isdrawshadow;
graphicsstate gs = grfx.save();
grfx.translatetransform(destrect.x, destrect.y);
string strtime = string.empty;
if(this._clockstyle == sevensegmentclockstyle.timeonly)
{
strtime = _datetime.tostring( "t ", datetimeformatinfo.invariantinfo);
}
else if(this._clockstyle == sevensegmentclockstyle.dateonly)
{
//设置日期格式
strtime = _datetime.tostring( "yyyy-mm-dd ", datetimeformatinfo.invariantinfo);
}
else
{
strtime = _datetime.tostring( "yyyy-mm-dd ", datetimeformatinfo.invariantinfo) + " " + _datetime.tostring( "t ", datetimeformatinfo.invariantinfo);
}

sizef sizef = ssd.measurestring(strtime, font);
float fscale = math.min(destrect.width / sizef.width, destrect.height / sizef.height);
font font = new font(font.fontfamily, fscale * font.sizeinpoints);

sizef = ssd.measurestring(strtime, font);
_clockstringwidth = (int)sizef.width;
_clockstringheight = (int)sizef.height;


[解决办法]
一个c#模拟时钟的源代码
http://neowang008.bokee.com/5039892.html

热点排行