一个VCL元件的问题,有兴趣Please...
我写了一个TMyPicture元件,他仅提供一个画布和几个事件,为何我对他用InvalidateRect时,它是整个重画,屏幕闪动厉害..
//////////////////////////////VCL
typedef void __fastcall(__closure *TPaintEvent) (TObject *sender);
class PACKAGE TMyPicture : public TCustomControl
{
private:
TColor FBorderLineColor;
TColor FTBorderLineColor;
TPaintEvent FOnPaint;
void __fastcall SetTBorderLineColor(TColor value);
void __fastcall DoPaint();
TColor __fastcall GetTBorderLineColor();
protected:
virtual void __fastcall WndProc(TMessage& msg);
public:
__fastcall TMyPicture(TComponent* Owner);
__property Canvas ;
__published:
__property TAlign;
__property OnMouseDown;
__property OnMouseUp;
__property OnMouseMove;
__property TColor TBorderLineColor = { read=GetTBorderLineColor, write=SetTBorderLineColor };
__property TPaintEvent OnPaint = {read=FOnPaint, write=FOnPaint };
};
//cpp文件
static inline void ValidCtrCheck(TMyPicture *)
{
new TMyPicture(NULL);
}
//---------------------------------------------------------------------------
__fastcall TMyPicture::TMyPicture(TComponent* Owner)
: TCustomControl(Owner)
{
// inherited;
Width=100;
Height=100;
}
//---------------------------------------------------------------------------
namespace Untmypicture
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TMyPicture)};
RegisterComponents("WWW", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TMyPicture::SetTBorderLineColor(TColor value)
{
if(FTBorderLineColor != value) {
FTBorderLineColor = value;
Paint();
}
}
TColor __fastcall TMyPicture::GetTBorderLineColor()
{
return FTBorderLineColor;
}
void __fastcall TMyPicture::WndProc(TMessage& msg)
{
if(msg.Msg ==WM_PAINT)
{
if(FOnPaint)
FOnPaint(this);
TColor PenColor=Canvas->Pen->Color ;;
int PenWidth=Canvas->Pen->Width ;
Canvas->Pen->Color =FTBorderLineColor ;
Canvas->Pen->Width =1;
Canvas->MoveTo(0,0);
Canvas->LineTo(Width-1,0);
Canvas->LineTo(Width-1,Height-1);
Canvas->LineTo(0,Height-1);
Canvas->LineTo(0,0);
Canvas->Pen->Color=PenColor;
Canvas->Pen->Width=PenWidth;
}
TCustomControl::WndProc(msg);
}
void __fastcall TMyPicture::DoPaint()
{
if(FOnPaint!=NULL)
FOnPaint(this);
}
///
/////////////////////////////调用
void __fastcall TFrmMain::MPMainPaint(TObject *Sender)/*MyPicture1的OnPaint事件*/
{
simulator->DrawMain();
}
///////////InvalidateRect
void __fastcall TFrmMain::ToolButton16Click(TObject *Sender)
{
RECT r;
SetRect(&r,0,0,40,40);
ValidateRect(MPMain->Handle,&r,true);
}