做一个类似Ms 画图的程序,如何消除屏幕闪烁?
画图代码如下:
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ImageMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button != mbLeft)return;
Drawing = true;
Origin = Point(X,Y);
MovePt = Origin;
Image->Canvas->MoveTo(X, Y);
TVarRec tempvar[2] = {X, Y};
StatusBar->Panels->Items[0]->Text = Format("起点: (%d, %d)", tempvar, 2);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ImageMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(!Shift.Contains(ssLeft))return;
if (Drawing){
if(DrawingTool == dtCurve)
Origin = MovePt;
DrawShape(Origin, MovePt, pmNotXor);
MovePt = Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
}
TVarRec tempvar[2] = {X, Y};
StatusBar->Panels->Items[1]->Text = Format("终点: (%d, %d)", tempvar, 2);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ImageMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Drawing)
{
DrawShape(Origin, Point(X, Y), pmCopy);
Drawing = False;
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::DrawShape(TPoint TopLeft, TPoint BottomRight, TPenMode AMode)
{
Image->Canvas->Pen->Mode = AMode;
switch(DrawingTool)
{
case dtText:
{
Image->Canvas->MoveTo(TopLeft.x,TopLeft.y);
break;
}
case dtLine:
{
Image->Canvas->MoveTo(TopLeft.x, TopLeft.y);
Image->Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
}
case dtCurve:
{
Image->Canvas->MoveTo(TopLeft.x, TopLeft.y);
Image->Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
}
case dtRect:
{
Image->Canvas->Rectangle(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
}
case dtEllipse:
{
Image->Canvas->Ellipse(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
}
case dtRoundRect:
{
Image->Canvas->RoundRect(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y, (TopLeft.x - BottomRight.x)/10, (TopLeft.y - BottomRight.y)/10);
break;
}
case dtErase:
{
break;
}
case dtPict:
{
break;
}
}
}