Давнехонько не писал графические компоненты, да и вообще на дельфях редко очень. В общем прорисовка компонента иде по сообщению WM_PAINT, есстественно. Сначала вызываю родительскую функцию (inherited), дальше рисую на битмапе (TBitmap) который создал в конструкторе объекта. А потом просто копирую область функцией BitBlt на канву своего компонента. Но вот незадача, вроде все сделано для того, чтобы компонент не мигал при частой перерисовке, а что-то видимо упустил, все-равно мигает (он у меня интерактивный, управляется мышью). Вот скелет компонента, что касается графики:
| Код | TMapViewer = class(TWinControl) private FBitmap: Graphics.TBitmap; ... procedure WMPaint(var msg: TWMPaint); message WM_PAINT; procedure WMSize(var msg: TWMSize); message WM_SIZE; public ... constructor Create(Owner: TComponent); published ... end;
implementation ... constructor TMapViewer.Create(Owner: TComponent); begin inherited; FBitmap := TBitmap.Create; ... end;
procedure TMapViewer.WMPaint(var msg: TWMPaint); begin inherited; With FBitmap.Canvas do begin //рисую на канве битмапа end; BitBlt(GetDC(Handle), 0, 0, Width, Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY); // копирую участок end;
procedure TMapViewer.WMSize(var msg: TWMSize); begin FBitmap.Width := msg.Width; FBitmap.Height := msg.Height; end;
|
|