我正在尝试创建一个能够分析DNA数据并可视化与DNA参考序列相比的差异的程序。这涉及我希望在面板上绘制的大量字母,每个基底(A,C,G,T)具有不同的背景颜色。所以水平线代表一条DNA线。
到目前为止,我已将此作为测试:
创建位图
Bitmap bit;
public Form1()
{
InitializeComponent();
bit = new Bitmap(15, 15);
Graphics g = Graphics.FromImage(bit);
g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(1, 1, 13, 13));
g.Dispose();
}
这是我正在使用的Panel的Onpaint处理程序:
private void p_Paint(object sender, PaintEventArgs e)
{
int x_Start = e.ClipRectangle.X;
int x_Length = e.ClipRectangle.Width;
int y_Start = e.ClipRectangle.Y;
int y_Length = e.ClipRectangle.Height;
Bitmap insb = new Bitmap(RoundUp(x_Length), RoundUp(y_Length));
Panel p = (Panel)sender;
Graphics g = p.CreateGraphics();
Graphics bmp = Graphics.FromImage(insb);
for (int y = 0; y < insb.Height; y += 15)
{
for (int x = 0; x < insb.Width; x += 15)
{
bmp.DrawImage(bit, x, y);
}
}
g.DrawImage(insb, x_Start, y_Start);
bmp.Dispose();
g.Dispose();
}
这会创建一个正方形网格,但是当我滚动它时,它会像疯了一样闪烁......
我已将Panel的Doublebuffered属性设置为true,如下所示:
typeof(Panel).InvokeMember("DoubleBuffered",
BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic,
null, listHolder.Controls[0], new object[] { true });
这稍微改善了,但距离我想要的还有很远。我究竟做错了什么? (这也是我的第一篇文章,所以要温柔一点;))
答案 0 :(得分:0)
找到答案:整个双缓冲无法正常工作。最后我将其添加到表单加载中:
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty(
"DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
aProp.SetValue(canvas, true, null);
我将此添加到我的表单构造函数
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();
在这个画布中,我画了所有的东西......感谢所有的帮助!