OpenWindowedScreen and DPI aware On

Just starting out? Need help? Post your questions and find answers here.
User avatar
thyphoon
Enthusiast
Enthusiast
Posts: 327
Joined: Sat Dec 25, 2004 2:37 pm

OpenWindowedScreen and DPI aware On

Post by thyphoon »

Hello,
I try to use OpenWindowedScreen on a window with DPI aware on (Compiler option)
This code work with DPI aware Off, but with DPI aware On when mouse out of screen, mouse cursor position is not good.
I try to correct it, with DesktopScaledX/DesktopUnScaledX but i never succeed

If somebody have an idea and Can help me ?

(First code inspired from Netmaestro : viewtopic.php?t=26375&hilit=openWindowedScreen)

Code: Select all

Enumeration
  #Win_Main
  #Gdt_Panel
EndEnumeration

;-Gadget
Macro RightGadget(GDT)
  (GadgetX(GDT)+GadgetWidth(GDT))
EndMacro
Macro UnderGadget(GDT)
  (GadgetY(GDT)+GadgetHeight(GDT))
EndMacro

Structure Editor
  ScreenX.l
  ScreenY.l
  ScreenW.l
  ScreenH.l
EndStructure
Global Editor.Editor

Procedure main()
  
  If InitMouse() And InitSprite() And InitKeyboard() And OpenWindow(#Win_Main, 0, 0, 1920, 1080, "Editor", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
    
    PanelGadget     (#Gdt_Panel, 0, 0, 250, 500)
    
    Editor\ScreenX = DesktopScaledX(RightGadget(#Gdt_Panel)) 
    Editor\ScreenY  = DesktopScaledY(10)
    Editor\ScreenW    = DesktopScaledX(455*3)
    Editor\ScreenH    = DesktopScaledY(256*3)
    OpenWindowedScreen(WindowID(#Win_Main), DesktopScaledX(RightGadget(#Gdt_Panel)), DesktopScaledY(10), DesktopScaledX(455*3),DesktopScaledX(256*3),0,0,0)
    Protected Event.l
    Protected inscreen.b
    Protected mx.l,my.l
    Repeat
      Repeat
        Event = WindowEvent()
        
        If Event = #PB_Event_CloseWindow
          End
        EndIf
       
      Until Event=0
      
      If inscreen=#True
        ExamineMouse() 
        If MouseX()>Editor\ScreenW-2 Or MouseY()>Editor\ScreenH-2 Or MouseX()<1 Or MouseY()<1 
          ReleaseMouse(1) 
          inscreen = #False 
        EndIf  
      Else 
        mx = WindowMouseX(#Win_Main):my = WindowMouseY(#Win_Main) 
        If mx < Editor\ScreenW+Editor\ScreenX And mx > Editor\ScreenX And my > Editor\ScreenY And my < Editor\ScreenY+Editor\ScreenH 
          ReleaseMouse(0) 
          MouseLocate(mx-Editor\ScreenX,my-Editor\ScreenY) 
          inscreen = #True 
        EndIf 
      EndIf 
      ClearScreen(RGB(128,128,128)*inscreen) 
      

      StartDrawing(ScreenOutput())
        ;Other Stuff here
      
        If inscreen=#True
          Circle(MouseX(),MouseY(),5,#Red)
        EndIf 
      StopDrawing()

      FlipBuffers()

      Delay(3)
    ForEver
    
  EndIf
EndProcedure

main()