[gelöst] Frage: Background

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Genesis
Beiträge: 3
Registriert: Do 5. Jun 2008, 17:35

[gelöst] Frage: Background

Beitrag von Genesis »

Hallo erstmal...

Bin jetzt auch vor kurzem auf Lazarus gestoßen und wie so viele hier ein Delphi-Abkömmling. :)

Noch dazu ein Anfänger (um genau zu sein).

Möchte nun Lazarus antesten und stoße gleich am Anfang auf ein Problem(-chen), da ich (wenn schon denn schon) die zu programmierende Testanwendung gleich mal unter Linux und Windows testen möchte.

Doch zu meinem (Anfänger-)Problem und bitte nicht auslachen:
Ich möchte in Form1 als Hintergrund ein Bildchen (BMP oder sonstwas...) laden, das dann solange wiederholt wird, bis der gesamte Hintergrund damit ausgefüllt ist.

Unter Delphi für ein Windows-Programm hatte ich dies mal mit diesem Code (dank Internetrecherche) geschafft:

Code: Alles auswählen

procedure Tmainform.WMEraseBkGnd;
var rec : TRect;
    newBr : THandle;
begin
  {------------------Hintergrund-Bitmap setzen------------}
  rec.Left := 0;
  rec.Top  := 0;
  rec.Right := ClientWidth;
  rec.Bottom := ClientHeight;
  newbr := CreatePatternbrush(Image1.Picture.Bitmap.handle);
  fillrect(Self.Canvas.handle,rec,newbr);
  DeleteObject(newbr);
  Msg.Result := 0
end;
Vielleicht ist jemand hier ev. so freundlich und könnte mir erläutern wie man dies nun unter Lazarus für ein Programm für Linux und Windows erreicht? Gerade mit Bildern, Grafiken usw.. habe ich nun mal überhaupt keinen Plan. Wenn mir keiner helfen kann, so weiß ev. doch jemand die ein oder andere (wenn möglich deutsche) Onlinequelle, wo ich mich darüber informieren könnte?

Eigentlich fehlt mir nur das sich wiederholende HG-Bild, da das Proggie (und ev weitere) etwas ansprechend gestaltet werden sollen. Weiter wird nicht mit Grafiken gearbeitet, sondern nur mit Listen und Eingabefeldern...

Bitte um Hilfe!

Grüße Genesis

PS: Die Suche hier im Forum hat leider nichts hierzu gefunden...
Zuletzt geändert von Genesis am Sa 7. Jun 2008, 12:37, insgesamt 1-mal geändert.

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

Beitrag von theo »

Kann man prinzipiell auch im OnPaint Ereignis der TForm machen.
Flackert u.U. ein bisschen beim resizen, aber ich mag die Hintergründe sowieso nicht. ;-)

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
    X, Y:Integer;
begin
  for Y:=0 to ClientHeight div Image1.Picture.Bitmap.Height do
    for X:=0 to ClientWidth div Image1.Picture.Bitmap.Width do
      Canvas.Draw(X*Image1.Picture.Bitmap.Width,Y*Image1.Picture.Bitmap.Height,Image1.Picture.Bitmap);
end;

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Frage: Background

Beitrag von Euklid »

Genesis hat geschrieben:Hallo erstmal...
Hallo "Genesis"!

Vielleicht ist jemand hier ev. so freundlich und könnte mir erläutern wie man dies nun unter Lazarus für ein Programm für Linux und Windows erreicht?
Ganz allgemein ist der von dir erstellte Quelltext stets dann auf beiden Systemen compilierbar, wenn du nicht auf systemspezifische Befehle zurückgreifst, sondern die erwünschten Resultate mit Hilfe der LCL, FCL erzielst. Dann gilt das Motto "Write once, compile everywhere" :)

Gruß, Euklid

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Der Code sollte eigentlich ohne Probleme laufen.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Pluto halt dich doch ein mal an mein Motto und halt einfach die fresse wenn du keinen Plan hast. Sorry mir reichts mal wieder nachdem ich wieder Monatelang zugesehn hab. Nein der Code kann nur unter Windows laufen.
Und Ja Theos Antwort ist richtig. Und Ja weitere Diskussion ist überflüssig. Vielen Dank.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Das ist doch unsinn. Der code sollte auch unter Linux laufen. Nur müsste dann die Botschaft anders lauten. LMEraseBkGnd. Ich meine jetzt den Code den Genesis zeigt. ich sehe keine Funktion die es unter Linux/Lazarus nicht geben sollte. Wenn es LMGenesis LMEraseBkGnd. nicht gibt heißt sie anders. Da bin ich mir sehr sicher.

Was soll das eigentlich das du mir ständig Widersprichst ? Und das auch noch in so einem ton.
Aber mit sowas möchte ich die Thread hier nicht mehr "versuchen" alle anderen antworten von dir werde ich einfach nicht mehr beachten. und fertig. DU MAGST JA ALLES WISSEN. Dann schreibe doch einfach ein BUCH. drüber und Fertig. So langsam nervt das. Ich denke wir sollten auch eine Lösung finden. Die uns beide zufriedenstellt. Es kann ja nicht angehen das wir uns in jedem oder fast jedem Thread streiten. Was soll das bitte schön ?

Stimmt es war in der Letzten zeit Angenehm ruhig. Ich antworte auch nur bei den Thread wo ich die Frage verstehe und evlt. auch was zu sagen kann. So wie hier halt. Auch.

Schau dir doch mal die SynEdit Komponenten an. Dort wird der Hintergrund auch gelöscht über ein Event. Ich meine auch das es genau so heißen müsste. Sag mir doch mal bitte warum du der Meinung bist das der Code unter Linux nicht laufen sollte ? Sobald der Name des Events geändert wird.
MFG
Michael Springwald

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

Beitrag von theo »

@Pluto: Die CreatePatternbrush Funktion habe ich nur in Windows gefunden.
Gibt's die Plattformunabhängig?

Und WMEraseBkGnd gibt's schon auch, aber unter GTK1 und Qt habe ich die nicht zum zeichnen gebracht. Auf GTK2 geht's.

Ansonsten muss ich sagen, das Christian schon jeweils etwas barsch reagiert, aber du lässt halt tatsächlich oft einen überflüssigen Bockmist raus. ;-)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Stimmt CreatePatternbrush habe ich auch noch nicht gesehen. Müsste es aber auch geben.
in den Units die mit LCL anfangen. Da sollte es es eine entsprechende Funktion geben.
Ich lösche den Hintergrund auch meistens direkt in Paint.

Hier mal ein Auszug von SynEdit:

Code: Alles auswählen

procedure WMEraseBkgnd(var Msg: TMessage); message WM_ERASEBKGND;
weiter unten:
procedure EraseBackground(DC: HDC); override;
 
procedure TCustomSynEdit.WMEraseBkgnd(var Msg: TMessage);
begin
  Msg.Result := 1;
end;
 
procedure TCustomSynEdit.EraseBackground(DC: HDC);
begin
  // we are painting everything ourselves, so not need to erase background
end;
Du antwortest wenigens in einen vernünftigen Ton. und beleidigst keinen. Ich Antworte doch nur noch da wo ich auch eine Antwort geben kann. Sehr viele WinAPI Funktionen gibt es auch unter Lazarus. Heißen evlt. nur anders. das habe ich aufjedenfall gemerkt.
MFG
Michael Springwald

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

Beitrag von theo »

Ja, aber male auf den Canvas in dieser Funktion.
Da wird bei mir nichts gezeichnet auf GTK1 und Qt.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

So ich habe jetzt einige Test gemacht. Ich meine das ist ein BUG. Ich habe mir die Code Stellen angesehen. Das WMEraseBkgnd wird gar nicht aufgerufen. Warum auch immer. Nicht mal wenn ich folgednes sage:

Code: Alles auswählen

FWinControlFlags:=FWinControlFlags+[wcfEraseBackground];
hier ist noch ein Beispiel das ein Punkt besondert zeigt:
Evlt. wird jetzt klar warum das nicht gehen kann.

Code: Alles auswählen

constructor TTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  WindowProc:=@wndpro2;
end;
 
 
procedure TTest.wndpro2(var TheMessage: TLMessage);
begin
  case TheMessage.Msg of
    LM_ERASEBKGND:begin
      writeln('TEST11');
      EraseBackground(Handle);
    end;
  end;
end;
Die Botschaft LM_ERASEBKGND wird nicht gesendet.
Entweder man muss vor dem zeichnen manuell: EraseBackground
mit dem Handel der Komponente aufrufen. oder warnten bis sie den Fehler behoben haben.
Wenn es ein Fehler ist. Schaut euch doch mal an wie die Botschaft eingebaut wurden ist.
wndpro2 wurde aufgerufen, das habei ch getestet, nur nicht mi der richtigen Botschaft.
MFG
Michael Springwald

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

Beitrag von theo »

Sag ich doch. Deshalb hatte ich auch die OnPaint Variante vorgeschlagen.

Nicht jede Windows Message die's unter GTK / X nicht gibt ist gleich ein Bug Wieso schreibst du Bug eigentlich immer mit grossen Buchstaben?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Weiß ich auch nicht genau. Wird es klein geschrieben ?
Naja, aber du hast recht es könnte viele Gründe haben. Z.B. halt das diese Botschaft in GT1 und QT nicht gibt. Die Frage ist halt warum es sie in GT2 gibt.

Aber dann müssten man halt das Event. Manuell auslösen in onPaint.
Gut das währe geklärt.

Aber wenn ich mir CreatePatternbrush anschaue das habe ich schon mal in einem Lazarus-Soruce gesehen. Naja evlt. suche ich mal danach morgen. Wenn ich den Code richtig verstehe geht es darum ein neues Muster zu zeichnen. Da hatten wir hier doch ein paar fragen zu im Forum.
MFG
Michael Springwald

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

Beitrag von theo »

Mann Pluto, es sind alle Fragen geklärt.
Der Code oben (Siehe Beitrag Nummer2) löst das doch alles.

Christian hat schon recht, dass du manchmal echt auf der Leitung stehst.
Versuch doch jeweils das bereits gepostete zu verstehen, bevor du "geniale" Vorschläge machst, die den Thread lediglich in die Länge ziehen.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das ist doch unsinn. Der code sollte auch unter Linux laufen. Nur müsste dann die Botschaft anders lauten. LMEraseBkGnd.
Aha...
Ich meine jetzt den Code den Genesis zeigt. ich sehe keine Funktion die es unter Linux/Lazarus nicht geben sollte. Wenn es LMGenesis LMEraseBkGnd. nicht gibt heißt sie anders. Da bin ich mir sehr sicher.
Was soll das eigentlich das du mir ständig Widersprichst ? Und das auch noch in so einem ton.
Wiso ständig?
Aber mit sowas möchte ich die Thread hier nicht mehr "versuchen" alle anderen antworten von dir werde ich einfach nicht mehr beachten. und fertig.
vieleicht solltets du einfach mal darüber nachdenken was ich sage.
Oder mal nachdenken bevor du postest. Statt dann einfach alles zu ignorieren. Sonst brauchen wir hier bald wirklich ne Funktion die alle deine Beiträge ausblendet.
DU MAGST JA ALLES WISSEN. Dann schreibe doch einfach ein BUCH. drüber und Fertig. So langsam nervt das.
Son Quatsch, das hab ich nie behauptet und es ist nicht so ich halt aber einfach die Klappe wenn ich was nicht weiss oder mach mich vorher schlau.
Ich denke wir sollten auch eine Lösung finden. Die uns beide zufriedenstellt. Es kann ja nicht angehen das wir uns in jedem oder fast jedem Thread streiten. Was soll das bitte schön ?

Stimmt es war in der Letzten zeit Angenehm ruhig. Ich antworte auch nur bei den Thread wo ich die Frage verstehe und evlt. auch was zu sagen kann. So wie hier halt. Auch.
Du wiedersprichst dir in 2 direkt aufeinanderfolgenden Sätzen, ich hab in den letzten Monaten absichtlich meine Klappe gehalten aber irgendwann ist das Maß halt ml wieder voll. Und das wird solang passieren wie du Threads zumüllst.
Schau dir doch mal die SynEdit Komponenten an. Dort wird der Hintergrund auch gelöscht über ein Event. Ich meine auch das es genau so heißen müsste. Sag mir doch mal bitte warum du der Meinung bist das der Code unter Linux nicht laufen sollte ? Sobald der Name des Events geändert wird.
OK zur Technischen seite. CreateBrushPattern existiert nicht auf allen Plattformen das ist das was ich einte. An die EraseBackground Message hatte ich noch gar nicht gedacht. Aber auch bei der ists nicht definiert wann die LCL die senden tut bzw muss.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Genesis
Beiträge: 3
Registriert: Do 5. Jun 2008, 17:35

Beitrag von Genesis »

Einfach klasse...

Da schalte ich mal heute morgen meinen PC an mit der vagen Hoffnung vielleicht eine Antwort auf mein Problem zu finden und was sehe ich?

Gleich 13 Antworten!

Pfundig, Super, Danke!

Speziell an Dich Theo.
Werde deinen Code heute gleich mal testen. Ein bißchen Flackern schadet nicht, vor allem nachdem das Proggie eh nur mit fester Fenstergröße (ohne resize) laufen soll.

Grüsse Genesis

PS: Ich hoffe nicht, das gleich meine 1. Frage hier in diesem Forum zu Unstimmigkeiten unter den Usern hier führt? Ich bin sicher jeder hat es mit seinen Antworten gut gemeint. Danke nochmals!

Antworten