Seite 2 von 3

Verfasst: 26.08.2008 23:36
von NoUser
Fluid Byte hat geschrieben: @KR2k:
Lass das hier laufen und wechsele den Fokus zu einem anderen Fenster oder zieh es ausser Sichtweite des Desktops und bestaune wie der Button verschwindet:

Code: Alles auswählen

#IDC_BITMAP = $5DC

OpenWindow(0,0,0,400,300,"Backgrounded Window",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #SS_BITMAP)
CreateGadgetList(WindowID(0))
ButtonGadget(0,10,10,120,25,"utitled")

hwndStatic = CreateWindowEx_(0,"STATIC","",#SS_BITMAP | #WS_CHILD  | #WS_CLIPSIBLINGS | #WS_VISIBLE,0,0,0,0, WindowID(0),#IDC_BITMAP,0,0)
LoadImage(0,#PB_Compiler_Home + "Examples\Sources\Data\Background.bmp")

SendMessage_(hwndStatic,#STM_SETIMAGE,#IMAGE_BITMAP,ImageID(0))

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

DestroyWindow_(hwndStatic)
Button bleibt, bei mir jedenfalls. :)

Verfasst: 27.08.2008 12:43
von Fluid Byte
Bei mir nicht :)

Und ihr Genies postet auch eure Specs nicht :)

Und diese Smileys gehn' mir tierisch auf den Sack :)

Verfasst: 27.08.2008 14:45
von NoUser
Fluid Byte hat geschrieben:Bei mir nicht :)
Nehme schon an dass Du den Code oben auch getestet hast? Ist zwar nur ein #WS_CLIPSIBLINGS mehr drin, aber dass scheint es aus zu machen.
Und ihr Genies postet auch eure Specs nicht :)
OK, ein Punkt für Dich.
Und diese Smileys gehn' mir tierisch auf den Sack :)
Dass ist Dein Problem ;)

Verfasst: 27.08.2008 15:06
von Fluid Byte
hardfalcon hat geschrieben:Warum nehmt ihr eigentlich nicht WindowOuput()?
Wie soll das denn gehen?

Verfasst: 30.08.2008 00:20
von Knight_Rider_2000
man nehme die 2D drawing lib mit Windowoutput() und zeichnet das bild darauf

flackert aber wie beim imagegadget deshalb lieber so sich helfen.

Verfasst: 30.08.2008 00:27
von Kaeru Gaman
es muss aber doch auch eine lösung geben, die ohne skin funktioniert...
und ohne DDraw & Refresh.
schließlich gab es im VisualStudio schon seit win98 oder sogar win95 die möglichkeit,
ein Hintergrundbild als Eigenschaft eines Fensters zu definieren...

sowas in der richtung
Fluid Byte hat geschrieben:Dafür solltest du einen Brush mit CreatePatternBrush_() erstellen und ihn der Fensterklasse zuweisen.
erscheint mir da doch richtungsweisend.

ich weiß, das VisualStudio stellt etliche Features als "implementiertes Workaround" zur Verfügung,
(wie z.b. auch die Z-Order von Fensterelementen)
aber das bedeutet andererseits, dass es relativ einfach möglich sein muss...

Verfasst: 30.08.2008 00:36
von Knight_Rider_2000
das is einer der gruende dwarum es solche foren gibt
das schlauer werden beruht dadurch auf gegenseitigkeit

wenn du naeheres erfahren hast kannst du es ja hier posten

Verfasst: 30.08.2008 00:46
von Kaeru Gaman
> das schlauer werden beruht dadurch auf gegenseitigkeit
ich weiß es, und ich schätze es.

> wenn du naeheres erfahren hast kannst du es ja hier posten
das würde ich auch tun, aber wahrscheinlicher ist, dass ich in diesem thread selber mehr erfahre.

ich weiß, dass es relativ einfach ist, weil ich in VB nur eine Eigenschaft eingeben muss.
aber es ist mir nicht so wichtig, dass ich mich jetzt hinsetze und VB-Foren mit API-Foren vergleiche...
du kannst dir aber sicher sein, dass ich mir merken werde, was für eine lösung präsentiert wird
und wo sie steht, damit ich bei zukünftigen fragen korrekt verweisen kann.

Fluid scheint mehr zu wissen, sonst hätte er ja den Brush nicht erwähnt.
CreateSolidBrush kenne ich vom Lesen, und ich meine mich zu entsinnen,
dass damit OwnerDrawnControls erstellt werden können...

aber es ist nicht mein Thema, ich bin mehr Spiele-Progger.
ich wollte nur in meiner Eigenschaft als Moderator und "um des lieben Friedens willen" in eine Richtung weisen....

Verfasst: 30.08.2008 01:15
von Fluid Byte
Kaeru Gaman hat geschrieben:Fluid scheint mehr zu wissen, sonst hätte er ja den Brush nicht erwähnt.
CreateSolidBrush kenne ich vom Lesen, und ich meine mich zu entsinnen,
dass damit OwnerDrawnControls erstellt werden können...
OD Controls sind damit auch möglich aber ich persönlich habe es ausschließlich für Fenster benutzt, auch wenn die restliche Umgebung komplett geskint ist. Für mich ist klar das ich die Methode mittels CreatePatternBrush immer einem Extrafenster vorziehe.

Code: Alles auswählen

OpenWindow(0,0,0,520,400,"void",#WS_OVERLAPPEDWINDOW | #WS_VISIBLE | 1)

LoadImage(0,#PB_Compiler_Home + "Examples\Sources\Data\Background.bmp")
hbrBackground = CreatePatternBrush_(ImageID(0))
SetClassLong_(WindowID(0),#GCL_HBRBACKGROUND,hbrBackground)

HideWindow(0,0)

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

DeleteObject_(hbrBackground)

Verfasst: 30.08.2008 01:19
von hardfalcon
edel kann hier bestimmt weiterhelfen, der kennt sich mit sowas aus.

Hier wäre mal ne Ausgangsbasis:
http://www.purearea.net/pb/CodeArchiv/W ... ndColor.pb

Jetzt brauchen wir nur noch ne Möglichkeit, dem Brush ein Bild zuzuweisen (oder so in der Art).
//EDIT: Ich habs:

Code: Alles auswählen

; German forum:
; Author: Unknown (updated for PB4.00 by blbltheworm), modified by hardfalcon
; OS: Windows
; Demo: No

hWnd = OpenWindow(0, 100, 200, 250, 260, "Image brush", #PB_Window_SystemMenu ) 

  UsePNGImageDecoder()
  UseJPEGImageDecoder()
  hImage = LoadImage(#PB_Any,"Z:\usr\share\pixmaps\backgrounds\gnome\background-default.jpg")
  Debug ImageDepth(hImage)
  
  ExamineDesktops()
  Debug DesktopDepth(0)
  If ImageDepth(hImage) <> DesktopDepth(0) ;sonst gehts nicht, Farbtiefe des Bildes MUSS der Desktopfarbtiefe entsprechen!
    hImage2 = CreateImage(#PB_Any,ImageWidth(hImage),ImageHeight(hImage),#PB_Image_DisplayFormat)
    Debug ImageDepth(hImage2)
    StartDrawing(ImageOutput(hImage2))
      Debug DrawImage(ImageID(hImage),0,0)
    StopDrawing()
    FreeImage(hImage)
    hImage = hImage2
  EndIf
  
  hBrush = CreatePatternBrush_(ImageID(hImage))
  SetClassLong_(hWnd, #GCL_HBRBACKGROUND, hBrush) 
  InvalidateRect_(hWnd, #Null, #True) 

  Repeat 
    EventID.l = WaitWindowEvent() 

    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
    EndIf 

  Until Quit = 1 
  
  DeleteObject_(hBrush) ; Brush löschen/freigeben! 
  FreeImage(hImage)
  
End
//EDIT2: Beinahe Credits vergessen: Den Trick, mit CreatePatternBrush ein Brush aus nem Image zu erstellen, hab ich aus nem Code von Seymour Clufley ausm englischen Forum.

//EDIT3: Die Farbtiefe des Bildes muss der Desktopfarbtiefe entsprechen (d.h. JPGs funktionieren nicht, weil die nur max. 24bit haben können, da es keinen Alpha-Channel gibt).

//EDIT4: So, der Code funktioniert jetzt mit Bildern von beliebiger Farbtiefe, falls nötig, wird das geladene Image einfach auf ein neues Image mit der richtigen Farbtiefe gemalt, und dieses 2. Image als Brush verwendet.