Wie arbeitet PaintTo?

Für Fragen von Einsteigern und Programmieranfängern...
wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie arbeitet PaintTo?

Beitrag von wennerer »

Hallo Winni,
sehr seltsam. Ich habe es eben noch mal mit genau dem gepostetet Beispiel getestet und habe das gleiche verhalten wie von mir beschrieben. Ich hänge jetzt mal die .exe an. Vielleicht kannst du die mal bei Gelegenheit testen, ob die bei dir läuft. Bei mir geht sie unter XP und Win10 nicht!

Vielen Dank und viele Grüße
Bernd
Dateianhänge
projectTest1.zip
(711.48 KiB) 116-mal heruntergeladen

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Wie arbeitet PaintTo?

Beitrag von sstvmaster »

Geht bei mir auch nicht.

Aber wenn ich "Panel1.ParentColor:=False;" setze dann funktioniert es.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Wie arbeitet PaintTo?

Beitrag von sstvmaster »

Komisch, wenn man Panel1.ParentColor auf True setzt aber Panel1.Color auf clBtnFace setzt dann gehts auch.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wie arbeitet PaintTo?

Beitrag von Winni »

Hi!

Was hast Du denn für einen Bug entdeckt???

Test, test, test Deiner exe:

* Unter Wine funktioniert das einwandfrei
* Unter Win7/64 funktioniert garnix

Ich hab ja schon immer gesagt, dass Wine das bessere Windows ist ...

Merkwürdig, merkwürdig ...

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Wie arbeitet PaintTo?

Beitrag von sstvmaster »

Das Problem scheint aus der PaintTo Procedure zu kommen. Wenn man die Zeile mit PaintTo auskommentiert dann zeichnet "Canvas.Draw" ein schwarzes Rechteck. Oder es hängt mit der Transparenz zusammen.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Wie arbeitet PaintTo?

Beitrag von sstvmaster »

Also, das ist wirklich komisch ich habe mal das "PaintTo" in den Sourcen verfolgt (2.0.8 + 3.0.4).

PaintTo -> Controls.pp (Zeile 2342) -> Zeile 3592 -> {$I wincontrol.inc} -> 5069 -> 5063 -> 5066 ->

WSControls.pp (Zeile 347).

Und diese procedure ist leer?
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie arbeitet PaintTo?

Beitrag von wennerer »

Hallo,
vielen Dank an euch beide für das Testen. Bedeutet dann wohl es liegt nicht daran das ich PaintTo falsch verwende. Aber ob es ein Bug ist? Ich habe leider sehr wenig Erklärung zu PaintTo im Netz gefunden.
Hab es übrigens auch mit Lazarus 2.0.8 r62944 FPC 3.0.4 i386-win32-win32/win64 kompiliert.

Viele Grüße
Bernd

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: Wie arbeitet PaintTo?

Beitrag von kupferstecher »

Habs auch mal getestet und kann das Problem bestätigen:
Bei gesetztem ParentColor wird nur der Hintergrund kopiert (zumindest nicht schwarz).
Lazarus 2.0.6 unter Win7 Pro, 64 bit.

sstvmaster hat geschrieben:
Sa 4. Jul 2020, 12:53
Also, das ist wirklich komisch ich habe mal das "PaintTo" in den Sourcen verfolgt (2.0.8 + 3.0.4).
[...]
Und diese procedure ist leer?
Das ist eine virtuelle Methode, die durch das passende Widgetset dann überladen wird. Du musst also in der Widgetset-Datei für Windows (win32wscontrols.pp) nach der PaintTo-Methode suchen.

wennerer
Beiträge: 507
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie arbeitet PaintTo?

Beitrag von wennerer »

Hallo,
ich hab das nun mal verfolgt. Und das gefunden:

Code: Alles auswählen

class procedure TWin32WSWinControl.PaintTo(const AWinControl: TWinControl;
  ADC: HDC; X, Y: Integer);
var
  SavedDC: Integer;
begin
  SavedDC := SaveDC(ADC);
  MoveWindowOrgEx(ADC, X, Y);
  SendMessage(AWinControl.Handle, WM_PRINT, WParam(ADC),
    PRF_CHECKVISIBLE or PRF_CHILDREN or PRF_CLIENT or PRF_NONCLIENT or PRF_OWNED);
  RestoreDC(ADC, SavedDC);
end;
Ich bin aber leider weit davon entfernt zu erkennen ob nun hier ein Bug von Lazarus vorliegt oder ob das einfach von Windows so vorgegeben ist? Oder ob es sich aus irgend einem Grund genauso verhalten soll?
Viele Grüße
Bernd

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Wie arbeitet PaintTo?

Beitrag von sstvmaster »

Habe hier auch was ähnliches gefunden: https://stackoverflow.com/questions/438 ... r-wm-print, Winni hat ja geschrieben das es unter Wine funktioniert. Im Link im 6. Eintrag schreibt er ja auch das es in Wine ganz anders implementiert wurde.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Antworten