Page 1 of 1

events lost in tranparent window

Posted: Thu Oct 16, 2025 1:14 am
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


Re: events lost in tranparent window

Posted: Mon Nov 03, 2025 8:37 am
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?

Re: events lost in tranparent window

Posted: Mon Nov 03, 2025 9:16 am
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.

Re: events lost in tranparent window

Posted: Mon Nov 03, 2025 2:29 pm
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"

Re: events lost in tranparent window

Posted: Mon Nov 03, 2025 2:48 pm
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

Re: events lost in tranparent window

Posted: Tue Nov 04, 2025 3:36 pm
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