ResizeGadget() with DPI Aware Compiler Option

Just starting out? Need help? Post your questions and find answers here.
urland523
New User
New User
Posts: 2
Joined: Tue Mar 21, 2023 9:06 pm

ResizeGadget() with DPI Aware Compiler Option

Post by urland523 »

The following snippet works as expected with DPI Aware option unchecked. With DPI checked ResizeGadget() does not seem to be working properly.

Tested with Windows 10, 11
PB 6.00 and 6.01.

Code: Select all

If OpenWindow(0,0,0,800,600,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ButtonGadget(0,20,20,80,20,"Test")
   While WaitWindowEvent() <> #PB_Event_CloseWindow
      ResizeGadget(0,WindowMouseX(0),WindowMouseY(0),#PB_Ignore,#PB_Ignore)
   Wend
EndIf
End
Mindphazer
Enthusiast
Enthusiast
Posts: 340
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: ResizeGadget() with DPI Aware Compiler Option

Post by Mindphazer »

I see no difference, no matter if DPI aware if checked or not. The behaviour is the same, the Test button follows the mouse.
What do you mean by "doesn't seem to be working properly" ?
MacBook Pro 14" M1 Pro - 16 Gb - MacOS 14 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: ResizeGadget() with DPI Aware Compiler Option

Post by mk-soft »

Welcome ...

Your Event Management is wrong.
Here a base code with resize gadgets.

Code: Select all

;-TOP

#ProgramTitle = "Main Window"
#ProgramVersion = "v1.01.2"

Enumeration Windows
  #Main
EndEnumeration

Enumeration MenuBar
  #MainMenu
EndEnumeration

Enumeration MenuItems
  #MainMenuAbout
  #MainMenuExit
EndEnumeration

Enumeration Gadgets
  #MainEdit
  #MainButtonOk
  #MainButtonCancel
EndEnumeration

Enumeration StatusBar
  #MainStatusBar
EndEnumeration

Procedure UpdateWindow()
  Protected dx, dy
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
  ; Resize gadgets
  ResizeGadget(#MainEdit, 5, 5, dx - 10, dy - 45)
  ResizeGadget(#MainButtonok, 10, dy - 35, 120, 30)
  ResizeGadget(#MainButtonCancel, dx - 130, dy - 35, 120, 30)
EndProcedure

Procedure Main()
  Protected dx, dy
  
  #MainStyle = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, 800, 600, #ProgramTitle , #MainStyle)
    ; Menu
    CreateMenu(#MainMenu, WindowID(#Main))
    MenuTitle("&File")
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
      MenuItem(#PB_Menu_About, "")
    CompilerElse
      MenuItem(#MainMenuAbout, "About")
    CompilerEndIf
    ; Menu File Items
    
    CompilerIf Not #PB_Compiler_OS = #PB_OS_MacOS
      MenuBar()
      MenuItem(#MainMenuExit, "E&xit")
    CompilerEndIf
    
    ; StatusBar
    CreateStatusBar(#MainStatusBar, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    ; Gadgets
    dx = WindowWidth(#Main)
    dy = WindowHeight(#Main) - StatusBarHeight(#MainStatusBar) - MenuHeight()
    EditorGadget(#MainEdit, 5, 5, dx -10, dy - 45)
    ButtonGadget(#MainButtonok, 10, dy - 35, 120, 30, "Ok")
    ButtonGadget(#MainButtonCancel, dx - 130, dy - 35, 120, 30, "Abbruch")
    
    ; Bind Events
    BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #Main)
    
    ; Event Loop
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                PostEvent(#PB_Event_Menu, #Main, #MainMenuAbout)
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                PostEvent(#PB_Event_CloseWindow, #Main, #Null)
                
            CompilerEndIf
            
          Case #MainMenuAbout
            MessageRequester("About", #ProgramTitle + #LF$ + #ProgramVersion, #PB_MessageRequester_Info)
              
          Case #MainMenuExit
            PostEvent(#PB_Event_CloseWindow, #Main, #Null)
            
          EndSelect
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #MainEdit
              Select EventType()
                Case #PB_EventType_Change
                  ;
                  
              EndSelect
              
            Case #MainButtonOk
              ;
            Case #MainButtonCancel
              ;
              
          EndSelect
          
      EndSelect
    ForEver
    
  EndIf
  
EndProcedure : Main()
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
urland523
New User
New User
Posts: 2
Joined: Tue Mar 21, 2023 9:06 pm

Re: ResizeGadget() with DPI Aware Compiler Option

Post by urland523 »

Apologies, guess it works as meant to. The gadget floats out away from the mouse pointer as I move the pointer down in the window on my monitor. 4K set at 150% scaling. Thank you for the replies.
User avatar
mk-soft
Always Here
Always Here
Posts: 5313
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: ResizeGadget() with DPI Aware Compiler Option

Post by mk-soft »

No bug, but the DPI scale functions must be used.

Example Update:

Code: Select all

Procedure GetHandleUnderMouse()
  Protected handle
  GetCursorPos_(@pt)
  handle = WindowFromPoint_(pt)
  ProcedureReturn handle
EndProcedure

Macro DpiWindowMouseX(Window)
  DesktopUnscaledX(WindowMouseX(Window))
EndMacro

Macro DpiWindowMouseY(Window)
  DesktopUnscaledY(WindowMouseY(Window))
EndMacro

If OpenWindow(0,0,0,800,600,"Only Windows! Move button with left mouse!",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  hButton0 = ButtonGadget(0,20,20,120,25,"Button 0")
  hButton1 = ButtonGadget(1,20,60,120,25,"Button 1")
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            
          Case 1
            
        EndSelect
        
      Case #WM_LBUTTONDOWN ; Window API Constant
        Select GetHandleUnderMouse()
          Case hButton0
            movebutton0 = #True
            dx = DpiWindowMouseX(0) - GadgetX(0)
            dy = DpiWindowMouseY(0) - GadgetY(0)
          Case hButton1
            movebutton1 = #True
            dx = DpiWindowMouseX(0) - GadgetX(1)
            dy = DpiWindowMouseY(0) - GadgetY(1)
        EndSelect    
        
      Case #WM_LBUTTONUP ; Window API Constant
        movebutton0 = #False
        movebutton1 = #False
      
      Case #WM_MOUSEMOVE ; Window API Constant
        If movebutton0
          ResizeGadget(0, DpiWindowMouseX(0) - dx, DpiWindowMouseY(0) - dy, #PB_Ignore,#PB_Ignore)
        ElseIf movebutton1
          ResizeGadget(1, DpiWindowMouseX(0) - dx, DpiWindowMouseY(0) - dy, #PB_Ignore,#PB_Ignore)
        EndIf
        
    EndSelect
  ForEver
EndIf
End
Last edited by mk-soft on Wed Mar 22, 2023 9:19 pm, edited 1 time in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
AZJIO
Addict
Addict
Posts: 1298
Joined: Sun May 14, 2017 1:48 am

Re: ResizeGadget() with DPI Aware Compiler Option

Post by AZJIO »

urland523
You calculate the DPI, then you multiply the coordinates by the DPI. Didn't check for mouse, but when drawing on buttons or canvas, you just apply this factor and everything is drawn correctly. I use this method in several of my programs (Fifteen, CalendarAlarm, Balloons, Launcher). They are in my signature.

Code: Select all

Global DPI.d = 1
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Define hDC0 = GetWindowDC_(0)
DPI.d = GetDeviceCaps_(hDC0, #LOGPIXELSY)/96
ReleaseDC_(0, hDC0)
CompilerEndIf

WindowMouseX(0) * DPI
Post Reply