events lost in tranparent window

Just starting out? Need help? Post your questions and find answers here.
williamvanhoecke
User
User
Posts: 67
Joined: Wed Jun 07, 2017 10:13 pm

events lost in tranparent window

Post by williamvanhoecke »

Hello i am trying to create a transparent window that contains buttons. Transparency is needed because the buttons control the image behind the window. (see image: https://photos.app.goo.gl/bMBo2dhqeButYnzYA)
Every button should fire an event and when clicking in the middle of the window underneath gets focus.
However some buttons never fire their event!
Please does anyone knows what is happening here ?

Code: Select all

Enumeration
  #SYMBOL_SIZE_UP_BUTTON
  #SYMBOL_SIZE_DOWN_BUTTON
  #SYMBOL_HFLIP_BUTTON
  #SYMBOL_VFLIP_BUTTON
  #SYMBOL_COPY_BUTTON
  #SYMBOL_SETTINGS_BUTTON
  #SYMBOL_EXIT_BUTTON
  #SYMBOL_DELETE_BUTTON
  #SYMBOL_ROTATE_LEFT_BUTTON
  #SYMBOL_ROTATE_RIGHT_BUTTON
  
  #SYMBOL_SIZE_TEXT
  #SYMBOL_ROTATE_TEXT
EndEnumeration  
butw = 25
maskcolor = RGB(0,0,0)


Declare Symbol_size_number()
Procedure Symbol_size_number()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_rotate_number()
Procedure Symbol_rotate_number()
  Debug EventGadget()  
EndProcedure  

Declare Symbol_size_up_button()
Procedure Symbol_size_up_button()
  Debug EventGadget()  
EndProcedure
Declare Symbol_size_down_button()
Procedure Symbol_size_down_button()
  Debug EventGadget()  
EndProcedure

Declare Symbol_hflip_button()
Procedure Symbol_hflip_button()
  Debug EventGadget()  
EndProcedure
Declare Symbol_copy_button()
Procedure Symbol_copy_button()
  Debug EventGadget()  
EndProcedure  

Declare Symbol_setting_button()
Procedure Symbol_setting_button()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_exit_button()
Procedure Symbol_exit_button()
  Debug EventGadget()  
EndProcedure

Declare Symbol_vflip_button()
Procedure Symbol_vflip_button()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_delete_button()
Procedure Symbol_delete_button()
  Debug EventGadget()  
EndProcedure  

Declare Symbol_rotate_left_button()
Procedure Symbol_rotate_left_button()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_rotate_right_button()
Procedure Symbol_rotate_right_button()
  Debug EventGadget()  
EndProcedure  

  img = CreateImage(#PB_Any,butw,butw,24,maskcolor)
  StartDrawing(ImageOutput(img))
    Circle(butw/2,butw/2,butw/2,RGB(0,0,255))    
  StopDrawing()

; Maak een borderless transparant venster met niet transparante controls
;hWnd = OpenWindow(#PB_Any, 100, 100, 200, 200, "", #PB_Window_BorderLess)
hWnd = OpenWindow(#PB_Any, 0, 0, 100, 160, "", #PB_Window_ScreenCentered)
  StringGadget(#SYMBOL_SIZE_TEXT,butw*1.6,0,butw*2,butw/3*2,"",#PB_String_Numeric | #PB_Text_Center): SetGadgetColor(#SYMBOL_SIZE_TEXT,#PB_Gadget_BackColor,RGB(87,255,87)): BindGadgetEvent(#SYMBOL_SIZE_TEXT, @Symbol_size_number())
  
  ;size up - size down========================================
  ImageGadget(#SYMBOL_SIZE_UP_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*1),GadgetY(#SYMBOL_SIZE_TEXT)+GadgetHeight(#SYMBOL_SIZE_TEXT),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_SIZE_UP_BUTTON, @Symbol_size_up_button())
  
  ImageGadget(#SYMBOL_SIZE_DOWN_BUTTON,GadgetX(#SYMBOL_SIZE_UP_BUTTON)+(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT)+GadgetHeight(#SYMBOL_SIZE_TEXT),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_SIZE_DOWN_BUTTON, @Symbol_size_down_button())
  
  ;h flip - copy========================================
  ImageGadget(#SYMBOL_HFLIP_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*9),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_HFLIP_BUTTON, @Symbol_hflip_button())
  
  ImageGadget(#SYMBOL_COPY_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)+(butw/10*26),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*9),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_COPY_BUTTON, @Symbol_copy_button())

  ;setting - exit========================================
  ImageGadget(#SYMBOL_SETTINGS_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*19),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*24),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_SETTINGS_BUTTON, @Symbol_setting_button())
  
  ImageGadget(#SYMBOL_EXIT_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)+(butw/10*31),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*24),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_EXIT_BUTTON, @Symbol_exit_button())

  ;v flip - exit========================================
  ImageGadget(#SYMBOL_VFLIP_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*39),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_VFLIP_BUTTON, @Symbol_vflip_button())
  
  ImageGadget(#SYMBOL_DELETE_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)+(butw/10*26),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*39),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_DELETE_BUTTON, @Symbol_delete_button())

  ;l rotate - r rotate========================================
  ImageGadget(#SYMBOL_ROTATE_LEFT_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*1),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*48),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_ROTATE_LEFT_BUTTON, @Symbol_rotate_left_button())
  
  ImageGadget(#SYMBOL_ROTATE_RIGHT_BUTTON,GadgetX(#SYMBOL_SIZE_UP_BUTTON)+(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*48),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_ROTATE_RIGHT_BUTTON, @Symbol_rotate_right_button())

  StringGadget(#SYMBOL_ROTATE_TEXT,butw*1.5,butw/10*69,butw*2,butw/3*2,"",#PB_String_Numeric | #PB_Text_Center): SetGadgetColor(#SYMBOL_ROTATE_TEXT,#PB_Gadget_BackColor,RGB(255,255,90))
  BindGadgetEvent(#SYMBOL_ROTATE_TEXT, @Symbol_rotate_number())
  
  Prototype.i ProtoSetLayeredWindowAttributes(hwnd.i, crKey.i, bAlpha.i, dwFlags.i)
  Global SetLayeredWindowAttributes.ProtoSetLayeredWindowAttributes
  If OpenLibrary(0, "user32.dll"): SetLayeredWindowAttributes = GetFunction(0, "SetLayeredWindowAttributes"): EndIf  ; Load user32.dll voor SetLayeredWindowAttributes
  SetWindowColor(hWnd, maskcolor)                                                                                    ; Stel transparante kleur in (zwart)
  SetWindowLongPtr_(WindowID(hWnd), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(hWnd), #GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes(WindowID(hWnd), maskcolor, 0, #LWA_COLORKEY)

; Event loop
Repeat
  Event = WaitWindowEvent()
  If Event = #WM_LBUTTONDOWN
    Debug "hit"
  EndIf  
Until Event = #PB_Event_CloseWindow

Henjamin
New User
New User
Posts: 2
Joined: Wed Jul 02, 2025 8:09 am

Re: events lost in tranparent window

Post by Henjamin »

williamvanhoecke wrote: Thu Oct 16, 2025 1:14 am Hello i am trying to create a transparent window that contains buttons. Transparency is needed because the buttons control the image behind the window. (see image: https://photos.app.goo.gl/bMBo2dhqeButYnzYAdrive mad)
Every button should fire an event and when clicking in the middle of the window underneath gets focus.
However some buttons never fire their event!
Please does anyone knows what is happening here ?
If I use the #WS_EX_TRANSPARENT attribute for my window, will it help the transparent buttons receive mouse events more accurately?
User avatar
jacdelad
Addict
Addict
Posts: 2044
Joined: Wed Feb 03, 2021 12:46 pm
Location: Riesa

Re: events lost in tranparent window

Post by jacdelad »

Small annotation: no need to put a declare right in front of a procedure. The declare is only needed if the procedure is far away later in the source.
Good morning, that's a nice tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Axolotl
Addict
Addict
Posts: 897
Joined: Wed Dec 31, 2008 3:36 pm

Re: events lost in tranparent window

Post by Axolotl »

maybe I am too late....

First of all: Mouse Clicks on Transparent Window is a bit tricky. You can find a lot of stuff about that for example on stack overflow and others....

IMHO the most reliable way is to do it yourself. I added some functions to your code to see the results on the imagegadgets (only)
For further information read my comments ....

Code: Select all

EnableExplicit   ; Axolotl: highly recommended 

Enumeration
  #SYMBOL_SIZE_UP_BUTTON
  #SYMBOL_SIZE_DOWN_BUTTON
  #SYMBOL_HFLIP_BUTTON
  #SYMBOL_VFLIP_BUTTON
  #SYMBOL_COPY_BUTTON
  #SYMBOL_SETTINGS_BUTTON
  #SYMBOL_EXIT_BUTTON
  #SYMBOL_DELETE_BUTTON
  #SYMBOL_ROTATE_LEFT_BUTTON
  #SYMBOL_ROTATE_RIGHT_BUTTON
  
  #SYMBOL_SIZE_TEXT
  #SYMBOL_ROTATE_TEXT
EndEnumeration  
Enumeration ETimer 1  ; Axolotl: My coding style 
  #TMR_CheckMouseClick
EndEnumeration  

; Axolotl: always declare/define the used variables at the begining (my style) 
Global butw = 25
Global maskcolor = RGB(0,0,0)
Global img  
Global NWnd, hWnd ; <= Difference between Numbers, Identifiers and Handles .... see Help 

; Axolotl: 
Procedure MouseClickedOnGadget(Window, MouseButton=#VK_LBUTTON) ; return Gadget 
  Protected result, gadget, msx, msy, txt$   

  msx = WindowMouseX(Window)
  msy = WindowMouseY(Window) 

  result = -1 ; init not over gadget or not clicked 
  txt$   = "Mouse: "  ; prepare debug stuff 

  If MouseButton = #VK_LBUTTON Or MouseButton = #VK_RBUTTON 
    If GetAsyncKeyState_(MouseButton) & $8000 
      For gadget = #SYMBOL_SIZE_UP_BUTTON To #SYMBOL_ROTATE_RIGHT_BUTTON   ; for FirstGadget to LastGadget (here: ImageGadgets only)
        If msx >= GadgetX(gadget) And msx <= GadgetX(gadget) + GadgetWidth(gadget) 
          If msy >= GadgetY(gadget) And msy <= GadgetY(gadget) + GadgetHeight(gadget) 
            result = gadget 
            txt$ + " (Gadget=" + gadget + "): "  ; fancy debug stuff 
            Break 
          EndIf
        EndIf 
      Next gadget 
    EndIf   
  EndIf   
  ; Debug the Info in windows title .... 
  SetWindowTitle(Window, txt$ + Str(WindowMouseX(Window)) + "," + Str(WindowMouseY(Window))) 
 
  ProcedureReturn result 
EndProcedure 

; Axolotl: 
Procedure OnClickTimer() 
  Static s_prevgadget = -1 
  Protected gadget 

  Select EventTimer() 
    Case #TMR_CheckMouseClick 
      gadget = MouseClickedOnGadget(EventWindow(), #VK_LBUTTON)  ; check left mousebutton 
      If gadget > -1 And gadget <> s_prevgadget ; only a single mouse click is requested. (I guess) 

        Debug "■ Mouse Click on Gadget # " + gadget 

        s_prevgadget = gadget 
      EndIf 
  EndSelect 
EndProcedure 


Declare Symbol_size_number()
Procedure Symbol_size_number()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_rotate_number()
Procedure Symbol_rotate_number()
  Debug EventGadget()  
EndProcedure  

Declare Symbol_size_up_button()
Procedure Symbol_size_up_button()
  Debug EventGadget()  
EndProcedure
Declare Symbol_size_down_button()
Procedure Symbol_size_down_button()
  Debug EventGadget()  
EndProcedure

Declare Symbol_hflip_button()
Procedure Symbol_hflip_button()
  Debug EventGadget()  
EndProcedure
Declare Symbol_copy_button()
Procedure Symbol_copy_button()
  Debug EventGadget()  
EndProcedure  

Declare Symbol_setting_button()
Procedure Symbol_setting_button()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_exit_button()
Procedure Symbol_exit_button()
  Debug EventGadget()  
EndProcedure

Declare Symbol_vflip_button()
Procedure Symbol_vflip_button()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_delete_button()
Procedure Symbol_delete_button()
  Debug EventGadget()  
EndProcedure  

Declare Symbol_rotate_left_button()
Procedure Symbol_rotate_left_button()
  Debug EventGadget()  
EndProcedure  
Declare Symbol_rotate_right_button()
Procedure Symbol_rotate_right_button()
  Debug EventGadget()  
EndProcedure  


img = CreateImage(#PB_Any,butw,butw,24,maskcolor)
StartDrawing(ImageOutput(img))
  Circle(butw/2,butw/2,butw/2,RGB(0,0,255))    
StopDrawing()


; Maak een borderless transparant venster met niet transparante controls
;hWnd = OpenWindow(#PB_Any, 100, 100, 200, 200, "", #PB_Window_BorderLess)
NWnd = OpenWindow(#PB_Any, 0, 0, 360, 160, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  StickyWindow(NWnd, 1) 
  StringGadget(#SYMBOL_SIZE_TEXT,butw*1.6,0,butw*2,butw/3*2,"",#PB_String_Numeric | #PB_Text_Center): SetGadgetColor(#SYMBOL_SIZE_TEXT,#PB_Gadget_BackColor,RGB(87,255,87)): BindGadgetEvent(#SYMBOL_SIZE_TEXT, @Symbol_size_number())
  
  ;size up - size down========================================
  ImageGadget(#SYMBOL_SIZE_UP_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*1),GadgetY(#SYMBOL_SIZE_TEXT)+GadgetHeight(#SYMBOL_SIZE_TEXT),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_SIZE_UP_BUTTON, @Symbol_size_up_button())
  
  ImageGadget(#SYMBOL_SIZE_DOWN_BUTTON,GadgetX(#SYMBOL_SIZE_UP_BUTTON)+(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT)+GadgetHeight(#SYMBOL_SIZE_TEXT),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_SIZE_DOWN_BUTTON, @Symbol_size_down_button())
  
  ;h flip - copy========================================
  ImageGadget(#SYMBOL_HFLIP_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*9),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_HFLIP_BUTTON, @Symbol_hflip_button())
  
  ImageGadget(#SYMBOL_COPY_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)+(butw/10*26),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*9),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_COPY_BUTTON, @Symbol_copy_button())

  ;setting - exit========================================
  ImageGadget(#SYMBOL_SETTINGS_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*19),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*24),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_SETTINGS_BUTTON, @Symbol_setting_button())
  
  ImageGadget(#SYMBOL_EXIT_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)+(butw/10*31),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*24),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_EXIT_BUTTON, @Symbol_exit_button())

  ;v flip - exit========================================
  ImageGadget(#SYMBOL_VFLIP_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*39),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_VFLIP_BUTTON, @Symbol_vflip_button())
  
  ImageGadget(#SYMBOL_DELETE_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)+(butw/10*26),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*39),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_DELETE_BUTTON, @Symbol_delete_button())

  ;l rotate - r rotate========================================
  ImageGadget(#SYMBOL_ROTATE_LEFT_BUTTON,GadgetX(#SYMBOL_SIZE_TEXT)-(butw/10*1),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*48),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_ROTATE_LEFT_BUTTON, @Symbol_rotate_left_button())
  
  ImageGadget(#SYMBOL_ROTATE_RIGHT_BUTTON,GadgetX(#SYMBOL_SIZE_UP_BUTTON)+(butw/10*14),GadgetY(#SYMBOL_SIZE_TEXT) + GadgetHeight(#SYMBOL_SIZE_TEXT) + (butw/10*48),butw,butw,ImageID(img))
  BindGadgetEvent(#SYMBOL_ROTATE_RIGHT_BUTTON, @Symbol_rotate_right_button())

  StringGadget(#SYMBOL_ROTATE_TEXT,butw*1.5,butw/10*69,butw*2,butw/3*2,"",#PB_String_Numeric | #PB_Text_Center): SetGadgetColor(#SYMBOL_ROTATE_TEXT,#PB_Gadget_BackColor,RGB(255,255,90))
  BindGadgetEvent(#SYMBOL_ROTATE_TEXT, @Symbol_rotate_number())
  
; Axolotl:  Nowadays this is possible w/o LoadLibrary() ....  

;   Prototype.i ProtoSetLayeredWindowAttributes(hWnd.i, crKey.i, bAlpha.i, dwFlags.i)
;   Global SetLayeredWindowAttributes.ProtoSetLayeredWindowAttributes
;   If OpenLibrary(0, "user32.dll"): SetLayeredWindowAttributes = GetFunction(0, "SetLayeredWindowAttributes"): EndIf  ; Load user32.dll voor SetLayeredWindowAttributes
;   SetWindowColor(HWnd, maskcolor)                                                                                    ; Stel transparante kleur in (zwart)
;   SetWindowLongPtr_(WindowID(NWnd), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(NWnd), #GWL_EXSTYLE) | #WS_EX_LAYERED)
;   SetLayeredWindowAttributes(WindowID(NWnd), maskcolor, 0, #LWA_COLORKEY)

  hWnd = WindowID(NWnd) 
  SetWindowColor(NWnd, maskcolor)                                                                                    ; Stel transparante kleur in (zwart)
  SetWindowLongPtr_(hWnd, #GWL_EXSTYLE, GetWindowLongPtr_(hWnd, #GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(hWnd, maskcolor, 240, #LWA_COLORKEY|#LWA_ALPHA)  ; Axolotl: opacity + transp // better but not good enough 

; Event loop
  ; Axolotl: Do the click check by timer (HINT: Timers are low priority messages/events, they do not disturb the work flow in any cases.) 
  AddWindowTimer(NWnd, #TMR_CheckMouseClick, 100) ; Timeout in ms 
  BindEvent(#PB_Event_Timer, @OnClickTimer(), NWnd) 
Repeat
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow        : Debug "MainLoop: Bye." 
      Break ; leave the main loop 
    Case #PB_Event_DeactivateWindow   : Debug "MainLoop: Deactivated....." 
    Case #WM_LBUTTONDOWN              : Debug "MainLoop: hit"
  EndSelect   
ForEver 
RemoveWindowTimer(NWnd, #TMR_CheckMouseClick) 
Debug "Done"
Just because it worked doesn't mean it works.
PureBasic 6.04 (x86) and <latest stable version and current alpha/beta> (x64) on Windows 11 Home. Now started with Linux (VM: Ubuntu 22.04).
User avatar
ChrisR
Addict
Addict
Posts: 1495
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: events lost in tranparent window

Post by ChrisR »

Clicks on Transparent Window is indeed a bit tricky.

Code: Select all

SetWindowColor(hWnd, maskcolor)
SetWindowLongPtr_(WindowID(hWnd), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(hWnd), #GWL_EXSTYLE) | #WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(hWnd), maskcolor, 0, #LWA_COLORKEY)
Seems to work as intended if you use a borderless window.

Code: Select all

EnableExplicit

Enumeration
  #SYMBOL_SIZE_UP_BUTTON
  #SYMBOL_SIZE_DOWN_BUTTON
  #SYMBOL_HFLIP_BUTTON
  #SYMBOL_VFLIP_BUTTON
  #SYMBOL_COPY_BUTTON
  #SYMBOL_SETTINGS_BUTTON
  #SYMBOL_EXIT_BUTTON
  #SYMBOL_DELETE_BUTTON
  #SYMBOL_ROTATE_LEFT_BUTTON
  #SYMBOL_ROTATE_RIGHT_BUTTON
  
  #SYMBOL_SIZE_TEXT
  #SYMBOL_ROTATE_TEXT
EndEnumeration

Declare Symbol_size_number()
Declare Symbol_rotate_number()
Declare Symbol_size_up_button()
Declare Symbol_size_down_button()
Declare Symbol_hflip_button()
Declare Symbol_copy_button()
Declare Symbol_setting_button()
Declare Symbol_exit_button()
Declare Symbol_vflip_button()
Declare Symbol_delete_button()
Declare Symbol_rotate_left_button()
Declare Symbol_rotate_right_button()

Global Quit

Procedure Symbol_size_number()
  Select EventType()
    Case #PB_EventType_Change
      Debug "Change " + EventGadget()
    Case #PB_EventType_Focus
      Debug "Focus " + EventGadget()
  EndSelect   
EndProcedure  

Procedure Symbol_rotate_number()
  Select EventType()
    Case #PB_EventType_Change
      Debug "Change " + EventGadget()
    Case #PB_EventType_Focus
      Debug "Focus " + EventGadget()
  EndSelect 
EndProcedure  

Procedure Symbol_size_up_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf
EndProcedure

Procedure Symbol_size_down_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure

Procedure Symbol_hflip_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure

Procedure Symbol_copy_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure  

Procedure Symbol_setting_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure  

Procedure Symbol_exit_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Exit Left Click " + EventGadget()
    Quit = #True
  EndIf
EndProcedure

Procedure Symbol_vflip_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure  

Procedure Symbol_delete_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure  

Procedure Symbol_rotate_left_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure  

Procedure Symbol_rotate_right_button()
  If EventType() = #PB_EventType_LeftClick
    Debug "Left Click " + EventGadget()
    SetActiveGadget(-1)
  EndIf 
EndProcedure  

Define Event
Define butw = 25
Define maskcolor = RGB(0,0,0)

Define img = CreateImage(#PB_Any,butw,butw,24,maskcolor)
StartDrawing(ImageOutput(img))
Circle(butw/2,butw/2,butw/2,RGB(0,0,255))    
StopDrawing()

Define imgExit = CreateImage(#PB_Any,butw,butw,24,maskcolor)
StartDrawing(ImageOutput(imgExit))
Circle(butw/2,butw/2,butw/2,RGB(0,0,255))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText((butw-TextWidth("E"))/2,(butw-TextHeight("E"))/2,"E",RGB(255,255,0))
StopDrawing()

; Maak een borderless transparant venster met niet transparante controls
;hWnd = OpenWindow(#PB_Any, 100, 100, 200, 200, "", #PB_Window_BorderLess)
Define hWnd = OpenWindow(#PB_Any, 0, 0, 180, 180, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
StickyWindow(hWnd, #True)

SetWindowColor(hWnd, maskcolor)
SetWindowLongPtr_(WindowID(hWnd), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(hWnd), #GWL_EXSTYLE) | #WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(hWnd), maskcolor, 0, #LWA_COLORKEY)

StringGadget(#SYMBOL_SIZE_TEXT,butw*1.6,0,butw*2,butw/3*2,"",#PB_String_Numeric | #PB_Text_Center)
SetGadgetColor(#SYMBOL_SIZE_TEXT,#PB_Gadget_BackColor,RGB(87,255,87))
BindGadgetEvent(#SYMBOL_SIZE_TEXT, @Symbol_size_number())

Define GadgetSizeTextX = GadgetX(#SYMBOL_SIZE_TEXT)
Define GadgetSizeTextY = GadgetY(#SYMBOL_SIZE_TEXT)+GadgetHeight(#SYMBOL_SIZE_TEXT) +2

;size up - size down========================================
ImageGadget(#SYMBOL_SIZE_UP_BUTTON, GadgetSizeTextX-(butw/10*1), GadgetSizeTextY,butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_SIZE_UP_BUTTON, @Symbol_size_up_button())

ImageGadget(#SYMBOL_SIZE_DOWN_BUTTON, GadgetX(#SYMBOL_SIZE_UP_BUTTON)+(butw/10*14), GadgetSizeTextY,butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_SIZE_DOWN_BUTTON, @Symbol_size_down_button())

;h flip - copy========================================
ImageGadget(#SYMBOL_HFLIP_BUTTON, GadgetSizeTextX-(butw/10*14), GadgetSizeTextY + (butw/10*9),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_HFLIP_BUTTON, @Symbol_hflip_button())

ImageGadget(#SYMBOL_COPY_BUTTON, GadgetSizeTextX+(butw/10*26), GadgetSizeTextY + (butw/10*9),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_COPY_BUTTON, @Symbol_copy_button())

;setting - exit========================================
ImageGadget(#SYMBOL_SETTINGS_BUTTON, GadgetSizeTextX-(butw/10*19), GadgetSizeTextY + (butw/10*24),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_SETTINGS_BUTTON, @Symbol_setting_button())

ImageGadget(#SYMBOL_EXIT_BUTTON, GadgetSizeTextX+(butw/10*31), GadgetSizeTextY + (butw/10*24),butw,butw,ImageID(imgExit))
BindGadgetEvent(#SYMBOL_EXIT_BUTTON, @Symbol_exit_button())

;v flip - exit========================================
ImageGadget(#SYMBOL_VFLIP_BUTTON, GadgetSizeTextX-(butw/10*14), GadgetSizeTextY + (butw/10*39),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_VFLIP_BUTTON, @Symbol_vflip_button())

ImageGadget(#SYMBOL_DELETE_BUTTON, GadgetSizeTextX+(butw/10*26), GadgetSizeTextY + (butw/10*39),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_DELETE_BUTTON, @Symbol_delete_button())

;l rotate - r rotate========================================
ImageGadget(#SYMBOL_ROTATE_LEFT_BUTTON, GadgetSizeTextX-(butw/10*1), GadgetSizeTextY + (butw/10*48),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_ROTATE_LEFT_BUTTON, @Symbol_rotate_left_button())

ImageGadget(#SYMBOL_ROTATE_RIGHT_BUTTON, GadgetX(#SYMBOL_SIZE_UP_BUTTON)+(butw/10*14), GadgetSizeTextY + (butw/10*48),butw,butw,ImageID(img))
BindGadgetEvent(#SYMBOL_ROTATE_RIGHT_BUTTON, @Symbol_rotate_right_button())

StringGadget(#SYMBOL_ROTATE_TEXT,butw*1.5,butw/10*69,butw*2,butw/3*2,"",#PB_String_Numeric | #PB_Text_Center)
SetGadgetColor(#SYMBOL_ROTATE_TEXT,#PB_Gadget_BackColor,RGB(255,255,90))
BindGadgetEvent(#SYMBOL_ROTATE_TEXT, @Symbol_rotate_number())

; Event loop
Repeat
  Event = WaitWindowEvent()
  ; ;Event Gadget without using BindGadgetEvent()
  ; If Event = #PB_Event_Gadget
  ;   Select GadgetType(EventGadget())
  ;     Case #PB_GadgetType_Image
  ;       If EventType() = #PB_EventType_LeftClick
  ;         Select EventGadget()
  ;           Case #SYMBOL_EXIT_BUTTON
  ;             Debug "Exit Left Click " + EventGadget()
  ;             Quit = #True
  ;           Default
  ;             Debug "Left Click " + EventGadget()
  ;             SetActiveGadget(-1)
  ;         EndSelect
  ;       EndIf
  ;     Case #PB_GadgetType_String
  ;       Select EventType()
  ;         Case #PB_EventType_Change
  ;           Debug "Change " + EventGadget()
  ;         Case #PB_EventType_Focus
  ;           Debug "Focus " + EventGadget()
  ;       EndSelect
  ;   EndSelect
  ; EndIf
Until Quit
williamvanhoecke
User
User
Posts: 67
Joined: Wed Jun 07, 2017 10:13 pm

Re: events lost in tranparent window

Post by williamvanhoecke »

I already had my own workarround BUT the tip of ChisR (borderless window) totally solves my problem.
I would not even have tried this EVER because I do not see the relation between 'borderless window' and losing some events ???????
A bug... or inconsistent windows behavier ??????

Anyway thank you all guys for the tips and the workarround
Post Reply