title image


Smiley Das wird wieder viel.. ;-)
[Ztiat: Orakel]Im Prinzip machst du es ja so: Du machst ein Bild, wo nicht gescrollt ist, und ein Bild wo ganz nach rechts gescrollt ist. Und diese 2 Bilder legst du dann übereinander, oder?



"Erst von oben nach unten, dann erst eins nach rechts + wieder von oben nach unten + wieder eins nach rechts + wieder von oben nach unten + wieder eins nach rechts [..]"

Ehrlich gesagt, verstehe ich noch nicht ganz, wie ich das machen muss...







procedure TForm1.Button1Click(Sender: TObject);

var

Bitmap, Dummy_Bitmap: TBitmap;

// Bitmap und ein Dummy-Bitmap festlegen

x, y: integer;

// x und y für For-Schleifen bzw. für kleine Nebenrechnung

xx: integer;

// kann auch anders heissen: ein Dummy-Wert

hold_Xpos, hold_Ypos: Integer;

//alte x- und y-Position des Scrollbalken

begin

Memo1.Left := Random(4000);

Memo1.Top := Random(2000);

// diese beiden habe ich für mich mal draufgenacht, kannst Du ändern in was anderes oder weglassen

Application.ProcessMessages;

// immer noch für mich

Bitmap := TBitmap.Create;

// das 'Hauptbitmap' wird erstellt

bitmap.Width := HorzScrollBar.Range;

bitmap.Height := VertScrollBar.Range;

// die Breite und die Höhe werden festgelegt -> aus der tatsächlichen Breit der Form, inclusive verstecktem Bereich. Die Scrollbalken wissen Bescheid. Wenn kein Scrollbalken vorhanden ist, ist der Wert etwas kleiner als der clientrect-wert, aber egal, denn so haben wir feste und konstante Werte

Dummy_Bitmap := TBitmap.Create;

// der Dummy wird auch erstellt, anschlißend die Breite und Höhe festgelegt -> aus der gerade sichbaren Form (innenliegend, an die Ränder anstoßend)

Dummy_Bitmap.Width := ClientRect.Right;

Dummy_Bitmap.Height := ClientRect.Bottom;



{ Nun fängt es an }

if (GetWindowLong(Form1.Handle, GWL_STYLE) and WS_VSCROLL = 0) and

(GetWindowLong(Form1.Handle, GWL_STYLE) and WS_HSCROLL = 0) then

// Wenn KEIN Scrollbalken vorhanden ist

begin

x := 0;

// x MUSS Null sein, ich könnte auch OHNE x rechnen, macht aber keinen Spass ;-)

Dummy_Bitmap.canvas.copyrect(Dummy_Bitmap.canvas.ClipRect, Form1.canvas, ClientRect);

// die Form wird auf das Dummy-Bild gezeichnet

BitBlt(BitMap.Canvas.Handle, x * ClientRect.Right, 0, (x + 1) * ClientRect.Right, ClientRect.Bottom, Dummy_Bitmap.Canvas.Handle, 0, 0, SRCCOPY);

// und nun noch auf das 'Hauptbild' übertragen.

end;



{Hier geht es los mit der Behandlung der Vertikalen Scrollbar}

if GetWindowLong(Form1.Handle, GWL_STYLE) and WS_VSCROLL 0 then

// wenn diese vorhanden ist

begin

// ShowMessage('Vertikale Leiste gefunden');

// hier den entpsrechenden Code rein

end;





{Hier geht es los mit der Behandlung der Horizontalen Scrollbar}

if GetWindowLong(Form1.Handle, GWL_STYLE) and WS_HSCROLL 0 then

//wenn diese vorhanden ist

begin

hold_Xpos := Form1.HorzScrollBar.Position;

// alte Position der Scrollbar merken

Form1.HorzScrollBar.Position := 0;

// nun zum Anfang der Form gehen

xx := Round(bitmap.Width / ClientRect.Right);

// Ausrechnen, wieviele Durchläufe es werden -> eine Formansicht=1 Durchlauf.

// Wenn die Form 2x so breit, wie sichbar ist, gibt es genau 2 Durchläufe.

// Wenn die Form 2,1x so breit, wie sichtbar ist, gibt es 3 Durchläufe.

for x := 0 to xx do

// Schleife beginnen

begin

Dummy_Bitmap.canvas.copyrect(Dummy_Bitmap.canvas.ClipRect, Form1.canvas, ClientRect);

// aktuelles Bild einfangen

// Dummy_Bitmap.SaveToFile(ExtractFilePath(Application.ExeName) + 'test' + inttostr(x) + '.bmp');

// Das war für mich zum testen

if x xx then

// wenn die Bereiche als kompletter, neuer Bereich gelten, dann ..

BitBlt(BitMap.Canvas.Handle, x * ClientRect.Right, 0, (x + 1) * ClientRect.Right, ClientRect.Bottom, Dummy_Bitmap.Canvas.Handle, 0, 0, SRCCOPY);

// das vorher eingefangene Bild auf das Hauptbild zeichnen:

// Die Position übernimmt dabei der x-Zähler MAL die Breite des Fensters

// die Höhe bleibt immer gleich

if x = xx then

// wenn nun aber der LETZTE Bereich dran ist, MUSS errechnet werden, wie weit der Verschnitt zum VORLETZTEN Bild ist:

begin

y := BitMap.Width mod ClientRect.Right;

// 'Hauptbild'-breite wird nochmal durch die Fensterinnenbreite geteilt, der Rest bleibt übrig in y.

// ich hätte auch schreiben können:

// y:= BitMap.Width - (BitMap.Width div ClientRect.Right) * ClientRect.Right;



y := ClientRect.Right - y;

// nun wird noch der Breich subtrahiert, damit es auch übersteht

BitBlt(BitMap.Canvas.Handle, (x * ClientRect.Right) - y, 0, (x + 1) * ClientRect.Right, ClientRect.Bottom, Dummy_Bitmap.Canvas.Handle, 0, 0, SRCCOPY);

// hier müssen wir y mit einbeziehen, da ansonsten der letzte Bildteil viel zu weit rechts liegt

end;



Form1.HorzScrollBar.Position := Form1.HorzScrollBar.Position + Dummy_Bitmap.Width;

// Hier wird nun die Scrollbar um den Bereich verschoben, wie das INNENfenster BREIT ist

Form1.Update;

// Die Form wird aktualisiert, dadurch erscheint auch wirklich das aktuelle Fenster auf dem Bildausschnitt.

// Ansonsten würde IMMER nur der erste Abschnitt auf dem Hauptbild zu sehen sein.

end;

Form1.HorzScrollBar.Position := hold_Xpos;

// die Scrollbar wieder an die alte position setzen, der Anwender kann normal weiterarbeiten

end;



Bitmap.SaveToFile(ExtractFilePath(Application.ExeName) + 'test.bmp');

// Das fertige Bild kann nun gespeichert werden.

FreeAndNil(Dummy_Bitmap);

FreeAndNil(BitMap);

// beide Bilder werden aus dem Speicher entfernt.

end;





Hi Orakel,



1. Es wird ein Bild der Form gemacht - für den Fall, dass keine Scrollbalken vorhanden sind. Ich hab noch eine Extra-Abfrage hinzugefügt (siehe oben).



Für weitere Fragen - Frag ruhig :-)

Gruß
~Mathias
..   ————————————————————————————————————————
..
..   Private Seite: http://www.nogad.de
..
..   ————————————————————————————————————————
..
..   Pension Fiege - Inhaber Monika Fiege
..   Kranichfelder Straße 68
..   99097 Erfurt
..
..   Tel: +49 361 41 38 39
..   Fax: +49 361 42 150 87
..
..   www.Pension-Fiege.de
..
..   ————————————————————————————————————————


geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: