TPaintBox czy TImage do animowanego wykresu?

0

Witam. Jak powinienem podejsc do pisania komponentu, ktorego zadaniem bedzie wyswietlanie kilku krzywych (rodzaj wykresu). Caly wykres bedzie przewijany, czyli bedzie wystepowala potrzeba zamalowywania starego polorzenia danej krzywej i kolejne jej odrysowanie w nowym polozeniu. Wiem ze aby efekt migotania nie wystepowal, musze rysowac w buforze (w pamieci) i nastepnie po dokonaniu przerysowan kopiowac zawartosc na komponent graficzny, ktory odpowiedzialny jest za wyswietlanie wykresow. Jako, ze komponent, ktory pisze nie wymaga wczytywania zadnych grafik itp., czy moge wiec napisac go w oparciu o TPaintBox. Czy bede mogl tak samo jak przy TImage, dynamicznie tworzyc jego reprezentacje w pamieci, rysowac w niej, po czym kopiowac zawartosc na komponent wyswietlajacy grafike? Czy jednak nie jest to mozliwe I nalezy zastosowac TImage?

Wszelkie uwagi i propozycje rozwiazan mile widziane.
Srodowisko C++ Builder 6

Dziekuje.

0

Możesz użyć komponentu TPaintBox, ale skoro chcesz w pamięci renderować obraz (polecam na TBitmap) i wklejać na komponent, daruj sobie TPaintBox, a swój komponent odziedzicz po czymkolwiek, co oferuje TCanvas.

0

Możesz też rysować na TPanel przy użyciu OpenGl'a. Pobierasz uchwyt panelu i możesz generować co dusza zapragnie. Krzywe wykreślisz za pomocą NURBS.

0
Szczawik napisał(a)

Możesz użyć komponentu TPaintBox, ale skoro chcesz w pamięci renderować obraz (polecam na TBitmap) i wklejać na komponent, daruj sobie TPaintBox, a swój komponent odziedzicz po czymkolwiek, co oferuje TCanvas.

czli TPaintBox :p

0

Dzieki za zainteresowanie.
Szczawik, tak jak Misiekd napisal TPaintBox tez ma canvas, wiec mozna po nim dzidziczyc. No i tak jak napisales trzeba uzyc TBitmap jako bufora. Poczatkowo pomyslalem ze mozna sprobowac za pomoca dwoch PaintBox’ow, jeden jako not visible, ale jak tylko zaczyna sie po nim rysowac to staje sie widoczny ;) Sprawdzilem tez czy daje sie kopiowac zawartosc TBitmap na canvas PaintBoxa. Nie ma z tym najmniejszego problemu i tak wlasnie zrobie. Oleksy_Adam mozna I z OpenGL’em jednak nie mam czasu zaglebiac sie w niego. na razie robie projekt sam, jak by bylo to w jakims teamie to jak najbardziej.
Jeszcze jedno, chyba tez nie trzeba bedzie zamalowywac starych lini, czy to siatki, czy samych krzywych wykresu na kolor tla, tylko trzasnosc cale tlo na nowo, bo i tak bedzie to robione w buforze? Co o tym myslicie? Jezeli da to dobry efekt, bedzie kilka funkcji mniej do napisania.

0

Wiem, że TPaintBox ma TCanvas - po to w ogóle jest zrobiony, ale jak kiedyś będziesz chciał komuś udostępnić komponent, możesz stwierdzić, że na przykład nie chcesz, aby posiadał pewne funkcje (odziedziczone po TPaintBox).

Osobiście proponowałbym dziedziczenie po TGraphicControl, który jest również podstawą TPaintBox'a, ale nie posiada pewnej nadbudowy, więc zabiera mniej pamięci.

Zamalowywanie całości obrazu w pamięci ma tą zaletę, że nie powoduje migotania obrazu i innych nieprzyjemnych efektów graficznych, bo do czasu pokazania obraz ten jest niewidoczny. Jest też wygodniejsze. Jednak czasem zamalowanie tylko fragmentu, starych linii, czy części kształtu może być szybsze - o ile takich elementów jest mało, są małe i łatwo zamazać je podstawowym kształtem.

0
Szczawik napisał(a)

Osobiście proponowałbym dziedziczenie po TGraphicControl, który jest również podstawą TPaintBox'a, ale nie posiada pewnej nadbudowy, więc zabiera mniej pamięci..

...i tak zrobie. W nastepnym tygodniu zdam relacje jak to wyszlo.

Pozdrawiam.

0

poprawnie robisz tak

  1. rysujesz po bmp tylko wtedy, kiedy zmieni się coś w obrazku
  2. na paintboxi bmp rysujesz tylko wtedy, kiedy rząda tego system (czyli w metodzie onpaint paintboxa)
  3. wymuszenie odmalowania paintboxa uzyskujesz przz pb->Invalidate

nie potrzeba nic zamazywać czy czyścić

Szczawik zobacz sobie jak wygląda klasa PaintBoxa - w Delphi

  TPaintBox = class(TGraphicControl)
  private
    FOnPaint: TNotifyEvent;
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    property Canvas;
  published
    property Align;
    property Anchors;
    property Color;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
    property OnStartDock;
    property OnStartDrag;
  end;

jedynie co dodaje to własny konstruktor i metoda paint reszta to po prostu zmiana "widzialności" metod i właściwości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1