Image1->Canvas->Rectangle(...)会闪屏?怎么去掉闪屏?请给最简单的示例代码,谢谢!急急急! ( 积分: 17 )

  • 主题发起人 主题发起人 freeia
  • 开始时间 开始时间
F

freeia

Unregistered / Unconfirmed
GUEST, unregistred user!
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(m_bMouseDown)
{
switch(m_nDrawType)
{
case 0:
{
Image1->Canvas->Pen->Mode = pmNotXor;
Image1->Canvas->Rectangle(m_ptMouseDown.x, m_ptMouseDown.y,
m_ptMouseMove.x, m_ptMouseMove.y);
Image1->Canvas->Rectangle(m_ptMouseDown.x, m_ptMouseDown.y, X, Y);

}
break;

case 1:
{
}
break;
}
}
m_ptMouseMove.x = X;
m_ptMouseMove.y = Y;
}
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(m_bMouseDown)
{
switch(m_nDrawType)
{
case 0:
{
Image1->Canvas->Pen->Mode = pmNotXor;
Image1->Canvas->Rectangle(m_ptMouseDown.x, m_ptMouseDown.y,
m_ptMouseMove.x, m_ptMouseMove.y);
Image1->Canvas->Rectangle(m_ptMouseDown.x, m_ptMouseDown.y, X, Y);

}
break;

case 1:
{
}
break;
}
}
m_ptMouseMove.x = X;
m_ptMouseMove.y = Y;
}
 
Form1.DoubleBuffer:=True;
就可以了,也就是双缓存模式.
 
Form1.DoubleBuffer:=True;
不过,您这么写,如果画笔是黑的,并且画笔比较粗的时候,当两个矩形相交的地方是白色的。
 
闪屏的原因是由于刷新前后图像反差大造成的视觉效果,你先在内存建立一个和TImage同样大小的TBitmap,在其上把图像全部画完,之后直接绘制到Image.Canvas上就不会闪烁了。
 
之后把这个TBitmap直接绘制到Image.Canvas上就不会闪烁了。TImage.Canvas.Draw(0,0,TheBitmap);
 
后退
顶部