Seite 1 von 1

Transparentes Bild und ok-button

Verfasst: 20.06.2019 22:48
von bin_neu_hier
Hallo

Ich möchte ein transparenes Bild per "Childwindow" anzeigen und der User soll es per ok-Button schliessen können.

Das Programm zeigt zwar das transparente PNG-Bild sehr schön an, aber den OK-Button nicht. Wer kann mir meinen Denkfehler erklären und hat eine Lösung dafür parat?

Code: Alles auswählen

UsePNGImageDecoder()

Enumeration
  #ParentWin
  #fontnum
  #imagenum
EndEnumeration

#about = 1

Procedure WindowBackground(Window.i, Image.i)
   Protected WindowID.i = WindowID(Window)
   Protected ImageID.i = ImageID(Image)
   Protected HDC.i = CreateCompatibleDC_(#Null)
   Protected Object.i = SelectObject_(HDC, ImageID)
   Protected Size.Size
      Size\cx = ImageWidth(Image)
      Size\cy = ImageHeight(Image)
   Protected Point.Point
    Protected Blend.BLENDFUNCTION
      Blend\SourceConstantAlpha = 255
      Blend\AlphaFormat = 1
   SetWindowLong_(WindowID, #GWL_EXSTYLE, GetWindowLong_(WindowID, #GWL_EXSTYLE) | #WS_EX_LAYERED)
   UpdateLayeredWindow_(WindowID, 0, 0, @Size, HDC, @Point, 0, @Blend, 2)
   SelectObject_(HDC, Object)
   DeleteDC_(HDC)
   
EndProcedure

Procedure TranspChildWin()
  
  pmainwindow = GetActiveWindow()
  DisableWindow(pmainwindow, #True)

  CatchImage(#imagenum, ?Logo)
  bx = ImageWidth(#imagenum)
  by = ImageHeight(#imagenum) 
  xx = GetSystemMetrics_(#SM_CXSCREEN) : yy = GetSystemMetrics_(#SM_CYSCREEN)
  cw = OpenWindow(#PB_Any, (xx-bx)/2,(yy-by)/2, bx, by, "", #PB_Window_BorderLess, WindowID(pmainwindow))
  
  
  ok = ButtonGadget(#PB_Any,bx-30, by-30, 25,25,"ok")
  
  WindowBackground(cw, #imagenum)
  
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case ok
            Break
        EndSelect
    EndSelect
  ForEver
  
   
  CloseWindow(cw)
  DisableWindow(pmainwindow, #False)
  
EndProcedure




;- openwindow
hWnd = OpenWindow(#ParentWin,0,0,333,333,"",#PB_Window_SystemMenu)
hSysMenu = GetSystemMenu_(hWnd, #False)
AppendMenu_(hSysMenu, #MF_STRING, #about, "Info zum Programm")
If LoadFont(#fontnum, "Arial", 11) : SetGadgetFont(#PB_Default, FontID(#fontnum)) : EndIf



Repeat
  event = WaitWindowEvent()
  If event = #WM_SYSCOMMAND
    Select EventwParam()
      Case #about
        TranspChildWin()
    EndSelect 
  EndIf
  
  If event = #PB_Event_CloseWindow
    End
  EndIf
      
ForEver
End


DataSection
  Logo:
  IncludeBinary "C:\Users\zuhause\Documents\PureBasic\Projekt\about.png"
EndDataSection


Re: Transparentes Bild und ok-button

Verfasst: 21.06.2019 14:13
von Mijikai
Ich hab mal die Funktion WindowBackground() neu geschrieben mit den korrekten APIs & Errorhandling.

Code: Alles auswählen

Procedure.i WindowBackground(Window.i,Image.i,Alpha.a = 255)
  Protected hwnd.i
  Protected img.i
  Protected style.i
  Protected hdc.i
  Protected obj.i
  Protected siz.SIZE
  Protected pnt.POINT
  Protected blend.BLENDFUNCTION
  Protected result.i
  hwnd = WindowID(Window)
  img = ImageID(Image)
  hdc = CreateCompatibleDC_(#Null)
  If hdc
    obj = SelectObject_(hdc,img)
    siz\cx = ImageWidth(Image)
    siz\cy = ImageHeight(Image)
    blend\SourceConstantAlpha = Alpha
    blend\AlphaFormat = #AC_SRC_ALPHA
    blend\BlendOp = #AC_SRC_OVER
    style = GetWindowLongPtr_(hwnd,#GWL_EXSTYLE)
    If GetLastError_() = #ERROR_SUCCESS
      SetWindowLongPtr_(hwnd,#GWL_EXSTYLE,style|#WS_EX_LAYERED)
      If GetLastError_() = #ERROR_SUCCESS
        result = UpdateLayeredWindow_(hwnd,#Null,#Null,@siz,hdc,@pnt,#Null,@blend,#ULW_ALPHA)
      EndIf 
    EndIf 
    SelectObject_(hdc,obj)
    DeleteDC_(hdc)
  EndIf 
  ProcedureReturn result
EndProcedure
Zum Rest kann ich nicht viel sagen da ich mit GUI Zeugs nicht auskenne. :freak:

Re: Transparentes Bild und ok-button

Verfasst: 21.06.2019 16:37
von bin_neu_hier
Hallo Mijikai,

vielen Dank für Deine Mühe. Wenigstens gibt es jetzt eine aktuelle Routine, die Anfänger (wie ich) sicher verwenden können.

Leider bleibt das Problem bestehen. Ohne die Proc. WindowBackground wird der Button angezeigt und funktioniert, mit der Proc. kommt der Button einfach nicht.

Re: Transparentes Bild und ok-button

Verfasst: 21.06.2019 18:49
von Bisonte
Nunja, wenn du das Fenster "durchsichtig" machst... ist auch der Button durchsichtig. Ich denke mal da ist der Hund begraben.
Die API bezieht sich da auf das gesamte Fenster mit allem.

Re: Transparentes Bild und ok-button

Verfasst: 21.06.2019 23:15
von bin_neu_hier
Also gut - sponge over - dann eben nicht. Wenn sich da kein Button zeigen will, dann geht es eben ohne. Der User darf irgendwo auf die Grafik klicken, dann verschwindet die wieder - auch gut.
Problem erledigt.

Re: Transparentes Bild und ok-button

Verfasst: 22.06.2019 09:55
von mk-soft
Schau mal hier...

Link: viewtopic.php?f=16&t=28467&p=353324#p353324

Es ist immer mal gut zu schauen welche erweiterte Funktionen für alle OS hier im Forum oder im englischen Forum gibt.
Manchmal werden diese auch zu Purebasic fest integriert.