[delphi] advies over resizen en schermflikkeringen

Pagina: 1
Acties:

  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 10-03 13:21
ik ben een programma aan het maken waarin je grafische elementen kan tekenen op een canvas. de grafische elementen zijn objecten die ik zelf gemaakt heb, en ze zijn een afgeleiden van een TPaintBox. die grafische elementen moet je kunnen resizen. dit heb ik nu als volgt gedaan.

aan de rand van ieder element teken ik een aantal vierkantjes. op het moment dat er op het element geklikt wordt dan kijk ik in een mousedown eventhandler of je met je muis op zo'n vierkantje staat. zo ja, dan worden er in de mousemove event nieuwe afmetingen doorgegeven aan het object. daardoor word automatisch de canvas gerefreshed, en ben je dus je object aan het resizen. dit werkt allemaal goed. alleen als ik gevulde grafische elementen resize, dan krijg ik schermflikkerigen. dit heb ik opgelost door doublebuffered true te maken. nu heb ik alleen twee vragen.

is dit de juiste manier om een resize voor een control te implementeren, of kan het beter/makkelijker.
en is de doublebuffered methode een nette manier om flikkeringen te voorkomen of moet je ze eigenlijk op een andere manier proberen weg te krijgen. ( bijvoorbeeld tijdens resizen alleen een contour te tekenen.)

(ik heb trouwens ook hier op GoT gezocht maar ben verder geen aanbevelingen/adviezen tegengekomen.)

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Verwijderd

Volgens mij kun je dit ook voor elkaar krijgen met "standaard" windows events, maar dan zul je alsnog die vierkantjes moeten tekenen.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Double Bufferen of alleen contouren resizen zijn juiste manieren.

We adore chaos because we like to restore order - M.C. Escher


  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 10-03 13:21
Verwijderd schreef op woensdag 30 november 2005 @ 17:27:
[...]

Volgens mij kun je dit ook voor elkaar krijgen met "standaard" windows events, maar dan zul je alsnog die vierkantjes moeten tekenen.
en wat bedoel je dan precies met die standaard windows events?

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


  • HammerT
  • Registratie: April 2004
  • Laatst online: 12-04 12:36
misschien heb je wat aan deze functie om te resizen :)


Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 function TForm1.ScaleBmp(bitmp: TImage; Amount: Integer): Boolean;
var
  TmpBmp: TBitmap;
  ARect: TRect;
  h, w: Integer;
begin
  Result := False;
  if bitmp.Height + Amount >= 10 then begin
    try                        //Stretch the image by Amount
      TmpBmp := TBitmap.Create;
      try
        h := bitmp.Height + Amount;
        w := bitmp.Width + Amount;
        TmpBmp.Width := w;
        TmpBmp.Height := h;
        ARect := Rect(0, 0, w, h);
        TmpBmp.Canvas.StretchDraw(ARect, Bitmp);
        bitmp.Assign(TmpBmp);
      finally
        TmpBmp.Free;
      end;
        Result := True;
    except
      Result := False;
    end;
  end;
end; 


ow.. ik zie nu dat je een paintbox gebruikt :X

[ Voor 5% gewijzigd door HammerT op 01-12-2005 12:01 ]


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 09:09

Knutselsmurf

LED's make things better

Ik heb zelf ook ooit zoiets gedaan, en heb het inderdaad op een soortgelijke manier opgelost. Voor een nieuwe versie zou ik echter een en anders iets anders aanpakken.
Mijn idee voor een nieuwe versie is om een apart object te maken die het resizen afhandeld. Om dan een component te resizen, maak je in het resize-object een verwijzing naar het te resizen object.Alle events die worden gebruikt bij het resizen worden afgevangen door het resize-object, welke op zijn beurt weer de properties van het te resizen component aanpast.

- This line is intentionally left blank -


  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 10-03 13:21
ok, maar dat is dus persoonlijke voorkeur. ik laat mijn object zichzelf resizen met zijn eigen eventhandlers, en jij doet dat met een los object. maar mijn manier is dus niet fout als ik het goed begrijp. je zal dus in ieder geval zelf de functionaliteit moeten implementeren die controleert of de gebruiker wil resizen of aan het resizen is (neem ik dus aan)? er zijn dus ook geen ingebakken functies in windows/delphi om te resizen concludeer ik uit de reacties. dit wou ik even verifieren omdat dat natuurlijk makkelijker zou zijn, en je waarschijnlijk wat performance loss zou besparen.
als er nog meer mensen zijn met ideeen/suggesties/adviezen, dan hoor ik het graag. _/-\o_

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


Verwijderd

Tombo_inc schreef op donderdag 01 december 2005 @ 21:57:
er zijn dus ook geen ingebakken functies in windows/delphi om te resizen concludeer ik uit de reacties. dit wou ik even verifieren omdat dat natuurlijk makkelijker zou zijn, en je waarschijnlijk wat performance loss zou besparen.
Je kan wat events afvangen en manipuleren, dan zou het moeten lukken...
Google Groups link

Je moet zelf ff verder zoeken, want het kan wel. Het wordt denk ik wat 'ingewikkelder' als je ook iets wilt laten zien tijdens het resizen.

[ Voor 11% gewijzigd door Verwijderd op 01-12-2005 23:55 ]


  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 10-03 13:21
bedankt.
ik denk dat ik hier wel iets aan heb. ik zal het eens op mijn gemak gaan bekijken. :7

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition

Pagina: 1