Aktuelle Zeit: 10.07.2020 17:52

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Transparentes Bild und ok-button
BeitragVerfasst: 20.06.2019 22:48 
Offline

Registriert: 06.03.2019 21:52
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:
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


_________________
Der beste Fisch ist der Schnitzel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes Bild und ok-button
BeitragVerfasst: 21.06.2019 14:13 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Ich hab mal die Funktion WindowBackground() neu geschrieben mit den korrekten APIs & Errorhandling.

Code:
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:

_________________

Links:
PureBasic Discord
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes Bild und ok-button
BeitragVerfasst: 21.06.2019 16:37 
Offline

Registriert: 06.03.2019 21:52
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.

_________________
Der beste Fisch ist der Schnitzel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes Bild und ok-button
BeitragVerfasst: 21.06.2019 18:49 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
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 5.72 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce RTX 2080 Super | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes Bild und ok-button
BeitragVerfasst: 21.06.2019 23:15 
Offline

Registriert: 06.03.2019 21:52
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.

_________________
Der beste Fisch ist der Schnitzel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Transparentes Bild und ok-button
BeitragVerfasst: 22.06.2019 09:55 
Online
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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 / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 13 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye