TScrollBox jako bmp

0

Witam

szukam jakiejś metody żeby zapisać cały scrollbox do pliku BMP;

na razie napisalem taki oto kod ale zapisuje mi tylko widoczną część komponentu

dvdesktop to jest tscrollbox

var
  dupa:Tbitmap;
begin
  dupa :=tbitmap.create;
  dupa.Width:=dvdesktop.Width;
  dupa.Height:=dvdesktop.Height;
  dvdesktop.PaintTo(dupa.canvas,0,0);
  dupa.Canvas.TextOut(10,10,'Lightning Desktop');
  dupa.SaveTofile('dupa.bmp');
  dupa.Destroy;

pytanie: czy da się zapisać całość?

0

Rozumiem, że chcesz zapisać także to co nie jest widoczne na ScrollBoxie, więc może pomoże tutaj
Tobie komponent, który stworzyłem na bazie TScrollBoxa, który dodatkowo posiada Canvas, możesz
po nim rysować jak i ustawić we własności Bitmap - obraz Birmapę po niej rysujesz i dzięki temu, po
na przykład zminimalizowaniu programu i przywróceniu go - ten ScrollBox zawiera to co narysowałeś.
Używałem go w pewnym programie do wzbogacenia wykresów w postaci pionowych AlProgressBar
o dodatkowy tekst pod różnym kątem i sprawdziło się to dobrze. Ale nie wiem czy Tobie będzie grało :)

unit canvasedscrollbox;

interface

uses
  Windows, Messages, Classes, Controls, Forms, Graphics;

type
  TCanvasedScrollBox = class(TScrollBox)
  private
    FBmp: TBitmap;
    FCanvas: TCanvas;
    procedure SetBitmap(Value: TBitmap);
  protected
    procedure WMPaint(var Message: TMessage); message WM_PAINT;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Bitmap: TBitmap read FBmp write SetBitmap;
    property Canvas: TCanvas read FCanvas;
  end;

implementation

constructor TCanvasedScrollBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
     csSetCaption, csDoubleClicks];
  Width := 185;
  Height := 41;
  BorderStyle := bsSingle;
  FBmp := TBitmap.Create;
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;

destructor TCanvasedScrollBox.Destroy;
begin
  FBmp.Free;
  FCanvas.Free;
  inherited Destroy;
end;

procedure TCanvasedScrollBox.SetBitmap(Value: TBitmap);
begin
  FBmp.Assign(Value);
  SendMessage(Handle, WM_PAINT, 0, 0);
end;

procedure TCanvasedScrollBox.WMPaint(var Message: TMessage);
begin
  if Assigned(FBmp) then
    Canvas.Draw(0, 0, FBmp);
  inherited;
end;

end.
0

No wprowadzilem sobie ten kod do programu, i..

teraz mam mozliwosc malowania po Tscrollbox,
ale dalej nie moge zapisac tego co juz się tam znajduje ;/

0

Ja znam tylko sposób zapisu wyglądu widocznego obszaru kontrolki. Nie wiem niestety jak zapisać w jakiś
poprawny sposób łącznego obszaru widocznego i niewidocznego ScrollBoxa. Może inni mają jakiś pomysł.

0

Ja bym to zrobił tak:

-tworzył bitmapę
-przewijał scrollboxa (ScrollBy + pętla while)
-odświerzał go
-pobierał uchwyt do canvasa tego komponentu
-kopiował zawartość scrollboxa na canvas bitmapy za pomocą CopyRect
-zapisał bitmapę
-zwolnił bitmapę

0

Właśnie tez to przewidywałem taką możliwość, ale ...

to co znajduje się w Tscrollbox zmienia się bardzo dynamicznie, i czy takim sposobem nie bede miał obrazka z rożnymi częściami Tscrollbox??

0

Z dynamicznym wyświetlaniem to byłby problem. No, chyba że nie przeszkadza Ci ciągłe przewijanie scrollbox'a i zużycie procesora w 99% :-D

0

właśnie ze proc ma robić obliczenia programu a nie przewijać scrollboxa, bo wtedy cała sekwencja staje. Program steruje oświetleniem a konkretniej jest to DMX512, wiec nie wchodzi tu raczej 99% proca.

0

Nikt nie odpowiedział, a ja sprawę wybadałem sam :) Trochę zmieniłem architekturę mojego programu i zamiast ScrollBoxa mam zwykłą Formę, a w jej przypadku wystarczy ustawić BMP.Height na "całkowitą" wysokość formy. Do tego celu można choćby wziąć właściwość Top kontrolki, o której wiemy że jest najniżej i dodać do tego jej Height. I szafa gra :)

Opi nie wiem jak tobie ale mi to nie pomaga, a ponad 10k linii kodu nie chce mi się przerabiać.

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