Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi kein ZEichnen auf vergrößerten Image (https://www.delphipraxis.net/115710-kein-zeichnen-auf-vergroesserten-image.html)

Namenloser 16. Jun 2008 21:26

Re: kein ZEichnen auf vergrößerten Image
 
Ich würde dir in diesem Fall zu einer Paintbox raten.

Medium 16. Jun 2008 23:23

Re: kein ZEichnen auf vergrößerten Image
 
Und ich zu einem TBitmap, dass, nachdem etwas daran geändert wurde, einer Bitmap-Property eines TImage assigned wird, bei dem AutoSize auf true gesetzt ist, welches sich in einer Scrollbox befindet.

punker-lili 21. Jun 2008 09:13

Re: kein ZEichnen auf vergrößerten Image
 
Hi Leute!
Sry das meineAntwort solange gesdauert hat, hatte aber erst jetzt Zeit eure Tips zutesten. Also:
@ extrem: ich habs ausprobiert, es ändert nichts an dem Zustand. Ich habe bloß heruasgefunden, das dass Feld sich verkleinern lässt, also es funktioniert mit allen Werten, die kleiner als die voreingestellten sind.

Ich habs probiert auf nem anderen Ding zu zeichen, aber dann funktioniert mein ganzes Programm nicht mehr. Daher würde ich gern ne Lösung fürs image haben...
Also habt ihr noch ne Idee worans liegen kann?

MfG Anna

turboPASCAL 21. Jun 2008 09:56

Re: kein ZEichnen auf vergrößerten Image
 
Wie schon beschrieben, verwende bitte ein Bitmap. Ein Image ist nur ein
Graficcontainer und nicht als Zeichenfläche geeignet.

Erstelle dir ein Bitmap in deinem Prg. und zeichne darau was du möchtest.
Wenn es vergrössert/verkleinert werden muss kannst du dies über die
Bitmap .Width/.Height -Eigenschaften erledigen. Danach musst du alles neu
Zeichnen.

Wenn dies alles erledigt ist kannst du das Bitmap direkt über Canvas.Draw()
oder über ein Image auf deinem Formular anzeigen.

extrem 21. Jun 2008 12:16

Re: kein ZEichnen auf vergrößerten Image
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von punker-lili
Hi Leute!
Sry das meineAntwort solange gesdauert hat, hatte aber erst jetzt Zeit eure Tips zutesten. Also:
@ extrem: ich habs ausprobiert, es ändert nichts an dem Zustand. Ich habe bloß heruasgefunden, das dass Feld sich verkleinern lässt, also es funktioniert mit allen Werten, die kleiner als die voreingestellten sind.

Hi

Wenn ich auch die Breite und Höhe von Graphic vergrößert habe dann hat sich auch die Leinwand mit vergrößert. Habe es gerade noch mal anhand einer Demo ausprobiert:

_frank_ 21. Jun 2008 13:21

Re: kein ZEichnen auf vergrößerten Image
 
Zitat:

Zitat von turboPASCAL
Erstelle dir ein Bitmap in deinem Prg. und zeichne darau was du möchtest.
Wenn es vergrössert/verkleinert werden muss kannst du dies über die
Bitmap .Width/.Height -Eigenschaften erledigen. Danach musst du alles neu
Zeichnen.

siehe Hier im Forum suchenStretchBlt
Zitat:

Zitat von turboPASCAL
Wenn dies alles erledigt ist kannst du das Bitmap direkt über Canvas.Draw()
oder über ein Image auf deinem Formular anzeigen.

lieber Hier im Forum suchenBitBlt im OnPaint, ist schneller.

die ganze Geschichte kannst du auch in ein TCustomControl packen, wo du im (überschriebenen) SetBounds das Bitmap-Resize und das StretchBlt machst (in separates Bitmap z.b. fBgBitmap, damit nicht bei jeder änderung resized werden muss). dann machst ne draw-Routine, wo der Hintergrund auf das eigentlich Offscreen-Bitmap (fBitmap) kopiert wird, deine eigenen Malroutinen aufgerufen werden und zum schluss Invalidate aufgerufen wird. jetzt must du nur noch in der (überschriebenen) Paint-Routine per BitBlt auf das canvas der Komponente kopieren.

so ist die Grundlage für meine selbstgemalten Controls (z.b. http://circuitboard.sf.net )

HTH Frank

punker-lili 22. Jun 2008 12:21

Re: kein ZEichnen auf vergrößerten Image
 
Danke Leute.. ich hoffe es klappt.

punker-lili 23. Jun 2008 20:03

Re: kein ZEichnen auf vergrößerten Image
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also die Idee mit dem TBitmap ist gut... aber so richtig nichts für mich^^
ich hab das mal von extrem ausrobiert und es entstand folgenser Quelltext:
Delphi-Quellcode:
procedure image_groesse(image:bild;hoehe,breite:integer);
var diff_x, diff_y: integer;
begin
//bestimmung_image_groesse(sd_hoehe,hoehe,breite,image);
 if assigned(image.picture.Graphic) then
 begin
 diff_x := breite - image.width;
 diff_y := hoehe - image.Height;

 if diff_x > 0 then begin
  image.width :=image.width + diff_x;
  image.picture.graphic.width:=image.Width;
 end
 else
  diff_x := 0;

 if diff_y > 0 then begin
  image.height := image.Height + diff_y;
  image.picture.graphic.height:=image.Height;
 end
 else
  diff_y := 0;

 image.canvas.Brush.Color := clred;
 image.Canvas.FillRect(rect(image.width - diff_x, image.Height - diff_y,
                            image.Width, image.height));
end;
end;
Leider passiert das, ab dem Punkt, wo das Image vergrößert werden müsste (s. Anhang).. Woran liegt das?

_frank_ 23. Jun 2008 20:58

Re: kein ZEichnen auf vergrößerten Image
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich frage mich grade, warum du erst die differenz ausrechnest und dann diese zu der aktuellen größe hinzuaddierst...
warum nicht einfach

Delphi-Quellcode:
if image.width<>breite then
  image.width:=breite;
if image.height<>hoehe then
  image.height:=hoehe;
image.graphic wird imho mit vergrößert, muss also nicht extra gemacht werden.

ich hab mal ne einfachere Version mit angehängt...was das Prinzip mal verdeutlicht und in bitBlt/stretchBlt einweist.

deine zeichenroutinen für die Noten musst du dann natürlich ins redraw reinhauen, bei Größenänderung LoadBGImage aufrufen, bei Notenänderung/erweiterung nur redraw.

wobei ich mich grade frage, warum du ein Hintergrundbild brauchst (wegen den linien?), was du relativ rechenintensiv strecken müsstest. die könntest auch malen ;)

so in etwa:

Delphi-Quellcode:
for i:=1 to 5 do
begin
  canvas.moveTo(0,i*10);
  Canvas.LineTo(width,i*10);
end;
nicht viel Arbeit, oder?

//Edit
gut, man könnte das jetzt noch aufbohren und gleich mehrzeilig machen ;) (wollte das jetzt einfach mal ausprobieren).

Delphi-Quellcode:
var i,j,y:integer;
const Ytop=20; //Abstand von oben
      YDiff=30; //abstand der zeilen
      LCount=5; //5 linien pro zeile
      LSpace=10; //Abstand der Linien in einer Zeile
      RowCount=5; //5 zeilen
begin
  for j:=0 to rowCount-1 do
  begin
    for i:=0 to LCount-1 do
    begin
      y:=Ytop+(j*YDiff)+(j*LCount*LSpace)+i*LSpace;
      canvas.moveTo(0,y);
      Canvas.LineTo(width,y);
    end;
  end;
end;
@extrem: klar, stimmt ja
aber ich kam noch nie auf die idee, das TGraphic-Objekt einer TImage-Kompo zu verändern ;) war irgendwie gedanklich beim canvas, was "mitwächst".

Gruß Frank

extrem 23. Jun 2008 21:08

Re: kein ZEichnen auf vergrößerten Image
 
Zitat:

Zitat von _frank_
image.graphic wird imho mit vergrößert, muss also nicht extra gemacht werden.

Da irrst du dich, die Zeichenfläche muss man selber vergrößern:Vergrößern von TImage bzw. Bitmap

@punker-lili Wie zeichnest du denn deine Noten, ist das ein Bild oder zeichnest du mit Hilfe von Image.canvas...? Wenn gar nicht anders, dann kannst du ja ein Mini- Projekt hier mal anhängen oder per PM schicken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz