Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Прорисовка компонента


Автор: NewDima 12.5.2009, 06:54
Давнехонько не писал графические компоненты, да и вообще на дельфях редко очень.
В общем прорисовка компонента иде по сообщению 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;

Автор: NewDima 12.5.2009, 14:16
Неужели никто не пишет графические компоненты?! Ну не правда...

Автор: Frees 12.5.2009, 14:20
Цитата(NewDima @  12.5.2009,  08:54 Найти цитируемый пост)
Сначала вызываю родительскую функцию (inherited)

может inherited тебе и рисует что ты потом закрашиваеш поверх, может без него попробывать

хотя не уверен smile

Автор: NewDima 12.5.2009, 14:22
без него вообще к сожалению крышу срывает =(, уже пробовал

Автор: NewDima 12.5.2009, 17:56
Да как так, неужели никто не знает?  smile 

Автор: Frees 13.5.2009, 06:42
попробуй у VCL списать
например TCustomControl вот так рисуется
Код

procedure TCustomControl.WMPaint(var Message: TWMPaint);
begin
  Include(FControlState, csCustomPaint);
  inherited;
  Exclude(FControlState, csCustomPaint);
end;

можно еще наверно с DoubleBuffer поиграть

в ДРКБ по твоему вопросу вот такой совет есть

Цитата
Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента
- то фон компонента перерисовываться не будет.
Код

constructor TMyControl.Create;
begin
inherited
ControlStyle := ControlStyle + [csOpaque];
end;




Автор: NewDima 13.5.2009, 07:38
Цитата(Frees @ 13.5.2009,  13:42)
в ДРКБ по твоему вопросу вот такой совет есть

Вот за это огромное спасибо, то, что нужно )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)