SetWindowOrgEx geht nicht in PaintBox

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

SetWindowOrgEx geht nicht in PaintBox

Beitrag von Mathias »

Bei folgendem Code, funktioniert SetWindowOrgEx nicht richtig,
Bei der PaintBox wird als 0-Punkt die linke-obere des Formes genommen.
Bei dem Panel, funktioniert es richtig, als Null-Punkt wird die Ecke des Panels genommen.

Ist dies ein Bug, oder wurde dies bewusst so gemacht ?

Code: Alles auswählen

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  male(PaintBox1.Canvas);
end;
 
procedure TForm1.Panel1Paint(Sender: TObject);
begin
  male(Panel1.Canvas);
end;
 
procedure TForm1.male(can: TCanvas);
begin
  can.Brush.Color:=$FF0000;
  can.Rectangle(10, 10, 100, 100);
  SetWindowOrgEx(can.Handle, 0, 0, nil);
  can.Brush.Color:=$FF00;
  can.Rectangle(20, 20, 110, 110);
end


Ich habe es unter Linux und Windows probiert, beide BS reagieren gleich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von theo »

Ist glaube ich richtig so. TPaintbox ist ein TGraphicControl, TPanel ein TWinControl Abkömmling.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Mathias »

Was hätte ich für Nachteile, wen ich auf ein Panel zeichnen würde, anstelle der PaintBox ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von theo »

Praktisch keine. TPaintBox ist etwas "leichter" da es kein eigenes WinHandle hat, es "reitet" auf dem Parent Control.
Wenn du selber eine Klasse ableiten willst, kannst du statt beim TPanel beim TCustomControl starten.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Mathias »

Praktisch keine.

Einen habe ich endeckt.
Ich hatte eine Shape die sich bewegt darauf platziert.
Aber irgendwie hatte diese Probleme mit SetWindowOrgEx
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4891
Registriert: Fr 8. Apr 2011, 09:01

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von wp_xyz »

Warum brauchst du denn SetWindowOrgEx? Der Ursprung der internen Koordinaten einer Komponente ist immer die linke obere Ecke mit (0, 0). Und wenn du die Koordinaten von einem Parentobjekt aus gesehen benötigst kannst du ClientToParent etc. verwenden.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Mathias »

Warum brauchst du denn SetWindowOrgEx?

Ich habe ein altes Delphi-Programm konvertiert.
Bei dieser hat es ein Grafisches Diagramm, bei dem man zoomen und verschieben kann.
Zum verschieben hatte dazumal SetWindowOrgEx verwendet.
Heute würde ich das anders machen, ich würde bei jedem LineTo das Offset dazu zählen. Vielleicht ändere ich es noch ab.

Oder gibt es in der LCL eine Alternative für SetWindowOrgEx ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4891
Registriert: Fr 8. Apr 2011, 09:01

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von wp_xyz »

"uses LCLType" statt "uses Windows".

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Mathias »

wp_xyz hat geschrieben:"uses LCLType" statt "uses Windows".

Die habe ich schon, sonst würde es unter Linux gar nicht laufen.
Wen es irgendwie geht, habe ich kein uses Windows.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Soner »

Du kannst für Paintbox TCustomControl nehmen. Da hast du gleich Fensterhandle.
In Lazarusordner "lazarus\examples\affinetransforms" gibt es für SetViewPortOrgEx ein Beispiel, vielleicht ist es was für dich.
Eigentlich sind die Komponenten TLabel oder TPaintBox so etwas wie "depracated".
Borland hat sie damals in Windows 3.1 eingeführt, weil auf Windows 3.1 die Anzahl von Handles (HDC, HWND ...) begrenzt war und die Programme mit "out of gdi resources"-Meldungen abstürzen konnte.

Mathias
Beiträge: 6204
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Mathias »

Eigentlich sind die Komponenten TLabel oder TPaintBox so etwas wie "depracated".

Für PaintBox kann ich mir dies vorstellen, aber für Label.
Was gibt es für eine Alternative für TLabel ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: SetWindowOrgEx geht nicht in PaintBox

Beitrag von Soner »

Mathias hat geschrieben:Für PaintBox kann ich mir dies vorstellen, aber für Label.
Was gibt es für eine Alternative für TLabel ?

z.B. TStaticText, weil es direkt TWinControl abstammt und somit eigene Canvas hat.
Ich benutze auch TLabel und TPaintBox aber ich würde für komplexe Zeichnungen nie TPaintBox nehmen.

Viele Leute sagen Graphic-Komponenten wie TLabel, TPaintBox sollen "light" und schnell sein, aber wie soll das gehen?
Von TGraphicControl abgeleitete Komponenten haben keine Zeichenfläche(Canvas) , sie müssen die Zeichenfläche von Elternobjekt nehmen und darauf zeichnen. Das Elternobjekt zeichnet jedesmal nicht nur das eine sondern alle Komponenten gleichzeitig.

Antworten