Transparentes Bild und ok-button

Anfängerfragen zum Programmieren mit PureBasic.
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Transparentes Bild und ok-button

Beitrag 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

Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Transparentes Bild und ok-button

Beitrag 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:
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Transparentes Bild und ok-button

Beitrag 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.
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Transparentes Bild und ok-button

Beitrag 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.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Transparentes Bild und ok-button

Beitrag 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.
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Transparentes Bild und ok-button

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten