Seite 1 von 2

Hintergrundbild in Fenster realisieren

Verfasst: 07.06.2006 14:22
von blbltheworm
Hallo zusammen,
ich hab ein Fenster auf dem sich mehrere Gadgets befinden und ich würde anstelle des Standardgraus im Hintergrund gerne ein Bild anzeigen.
Jedoch hab ich bis jetzt noch keine Möglichkeit gefunden.
Wenn ich ein Imagegadget verwende sind die anderen Gadgets so lange im Vordergrund, bis ich ein anderes Fenster darüber schiebe.
Dann verschwinden die Gadgets unter dem Imagegadget.
Wenn ich mit BitBlt die Grafik auf das Fenster bringe funktioniert das solange, bis ich wieder ein anderes Fenster darüberschiebe. Dann verschwindet aber die Hintergrundgrafik.
Wenn ich die ganze Zeit neu Blte werden jedoch meine Gadgets überzeichnet.

Wie kann ich das Problem also meistern??

Verfasst: 07.06.2006 15:14
von bobobo
mit Hidewindowtrickserei macht das TextGadget weniger Probleme ;)

Code: Alles auswählen

;PB4
Enumeration
  #Window_0
  #Image_0
  #Button_0
  #Button_1
  #Button_2
  #String_0
  #Text_0
EndEnumeration


Image0=CreateImage(#PB_Any,600,300)
StartDrawing(ImageOutput(Image0))
Box(0,0,600,300,RGB(128,255,255))
Circle(50,50,50,RGB(255,0,0))
Circle(150,50,50,RGB(255,0,255))
StopDrawing()

  If OpenWindow(#Window_0, 0, 0, 600, 300, "New window ( 0 )", #PB_Window_Invisible|#PB_Window_ScreenCentered| #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#Image_0, 0, 0, 600,150, ImageID(Image0))
      DisableGadget(#image_0,1)
      ButtonGadget(#Button_0, 30, 220, 60, 30, "OK")
      ButtonGadget(#Button_1, 110, 220, 60, 30, "KO")
      ButtonGadget(#Button_2, 210, 220, 110, 30, "Kannst Mich Mal")
      StringGadget(#String_0, 450, 80, 120, 40, "irgendwas")
      TextGadget(#Text_0, 150, 80, 80, 40, "schnasel")
    EndIf
  EndIf
HideWindow(#Window_0,0)


Repeat ; Start of the event loop
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type
  Debug eventType
  ;You can place code here, and use the result as parameters for the procedures
  If Event = #PB_Event_Gadget
    If GadgetID = #Image_0
    ElseIf GadgetID = #Button_0
      SetGadgetText(#text_0,"OK was?")
    ElseIf GadgetID = #Button_1
      SetGadgetText(#text_0,"KO was?")
    ElseIf GadgetID = #Button_2
      SetGadgetText(#text_0,"Was denn?")
    ElseIf GadgetID = #String_0
    EndIf
  EndIf
Until Event = #PB_Event_CloseWindow ; End of the event loop
End

du kommsch von dr alb ra? isch des kähl !

Verfasst: 07.06.2006 15:35
von Kaeru Gaman
aber einem fenster selber kann man doch auch direkt ein hintergrundbild zuweisen.
wie das in PB geht, weiß ich nicht, aber ne API müsste es dafür geben.
in VB war das einfach ne eigenschaft des fensterobjekts.

Verfasst: 07.06.2006 16:57
von vonTurnundTaxis
Einen Code, der bedauerlicherweise nur mit dem Betriebssystem Windows funktioniert, findest du hier:
http://www.purebasic.fr/german/viewtopi ... 54&start=0

Verfasst: 07.06.2006 17:26
von Kurzer
Ich klink mich mal ein ;)

in dem von vonTurnundTaxis angegebenen Beitrag ist ja ein Beispielcode aufgeführt (hier mal auf PB 4.0 umgemünzt)...

Code: Alles auswählen

Procedure.l Window_Form1()
  If OpenWindow(0,149,202,400,300, "...", #PB_Window_SystemMenu)
    Brush.LOGBRUSH\lbStyle=#BS_PATTERN
    Brush\lbColor=#DIB_RGB_COLORS
    Brush\lbHatch=ImageID(1)
    SetClassLong_(WindowID(0),#GCL_HBRBACKGROUND,CreateBrushIndirect_(Brush))
    InvalidateRect_(WindowID(0), #Null, #True)
    If CreateGadgetList(WindowID(0))
      ProcedureReturn WindowID(0)
    EndIf
  EndIf
EndProcedure

LoadImage(1,"hintergrund.bmp")
If Window_Form1()

  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
Jetzt meine Fragen: Was ist das:

Brush.LOGBRUSH\lbStyle=#BS_PATTERN
Brush\lbColor=#DIB_RGB_COLORS
Brush\lbHatch=ImageID(1)

Es scheint mir eine Struktur für die API-CreateBrushIndirect Funktion zu sein (hab noch nie was mit API gemacht).
Aber woher kennt PB die Struktur? Muß man das nicht vorher mit Structure/EndStructure anlegen?
Und was macht das ".LOGBRUSH" in der ersten Zeile?

Fragen über Fragen... :)

Gruß Markus

Verfasst: 07.06.2006 18:05
von Zaphod
Die Struktur schient zumindest unter PB4.0 schon vordefiniert zu sein.

Verfasst: 07.06.2006 22:44
von Kurzer
Hm, gibt es irgendwo eine Übersicht was von dem API-Zeug bereits vordefiniert ist?

Gruß Markus

Verfasst: 07.06.2006 23:00
von blbltheworm
:allright: Danke an euch alle.

@bobobo: "jezd han i jo, was e brauch" :mrgreen: :mrgreen: :mrgreen:

Verfasst: 08.06.2006 01:34
von mk-soft
@Kurzer,
mmm, eigendlich fast alles. Wenn etwas fehlt, dann gleich bescheid sagen damit es nachgepflegt werden kann. :wink:

Verfasst: 08.06.2006 08:32
von Shardik
@Kurzer,
die in PB vordefinierten API-Strukturen findet man in der IDE über den Menüpunkt "Werkzeuge\Strukturverzeichnis" oder die Tastenkombination <Alt> + <S>.