
- set requester position (x,y or mouse cursor)
- no globals, all shared variables
- requester keeps standard behaviour (parent window is locked)
- updated code for PB4.xx ( you can find an old version here )
Code: Select all
;{ SetRequesterPosition Functions
Procedure RequesterPositionCB(Window, Message, wParam, lParam)
Shared RequesterPositionX.l
Shared RequesterPositionY.l
Shared RequesterPositionCB.l
Shared RequesterPositionHook.l
Shared RequesterPositionWindow.l
Select Message
Case #WM_DESTROY
;close fake window if necessary
If RequesterPositionWindow
CloseWindow(RequesterPositionWindow)
RequesterPositionWindow=0
EndIf
;restore Requester CALLBACK
SetWindowLong_(Window, #GWL_WNDPROC, RequesterPositionCB)
Case #WM_CREATE
;update requester position ;(special case for InputRequester)
SetWindowPos_(Window, 0, RequesterPositionX, RequesterPositionY, 0, 0, #SWP_NOSIZE | #SWP_NOACTIVATE)
Case #WM_INITDIALOG
;update requester position
SetWindowPos_(Window, 0, RequesterPositionX, RequesterPositionY, 0, 0, #SWP_NOSIZE | #SWP_NOACTIVATE)
;result=CallWindowProc_(RequesterPositionCB, Window, Message, wParam, lParam)
;SetWindowPos_(Window, 0, RequesterPositionX, RequesterPositionY, 0, 0, #SWP_NOSIZE | #SWP_NOACTIVATE)
;ProcedureReturn result
EndSelect
ProcedureReturn CallWindowProc_(RequesterPositionCB, Window, Message, wParam, lParam)
EndProcedure
Procedure RequesterPositionHook(idHook, wParam, lParam)
Shared RequesterPositionX.l
Shared RequesterPositionY.l
Shared RequesterPositionCB.l
Shared RequesterPositionHook.l
Shared RequesterPositionWindow.l
Protected *RequesterPositionCWP.CWPSTRUCT=lParam
Protected Message=*RequesterPositionCWP\Message
Protected Window=*RequesterPositionCWP\hwnd
Protected Result
;(special case for InputRequester)
Protected WindowClass.s=Space(255)
GetClassName_(Window, WindowClass, 255)
If LCase(WindowClass)="inputrequester" : Message=#WM_INITDIALOG : EndIf
Select Message
Case #WM_INITDIALOG
;modify Requester callback
RequesterPositionCB=SetWindowLong_(Window, #GWL_WNDPROC, @RequesterPositionCB())
;restore parent HOOK
Result=CallNextHookEx_(RequesterPositionHook, idHook, wParam, lParam)
UnhookWindowsHookEx_(RequesterPositionHook)
RequesterPositionHook=0
Default
Result=CallNextHookEx_(RequesterPositionHook, idHook, wParam, lParam)
EndSelect
ProcedureReturn Result
EndProcedure
ProcedureDLL SetRequesterPosition(x=#PB_Ignore, y=#PB_Ignore) ; set requester position (x,y OR mouse position)
Shared RequesterPositionX.l
Shared RequesterPositionY.l
Shared RequesterPositionCB.l
Shared RequesterPositionHook.l
Shared RequesterPositionWindow.l
;use mouse position if x,y are undefined
If x=#PB_Ignore Or y=#PB_Ignore
Protected MouseCursor.POINT
GetCursorPos_(@MouseCursor)
RequesterPositionX=MouseCursor\x
RequesterPositionY=MouseCursor\y
Else
RequesterPositionX=x
RequesterPositionY=y
EndIf
;fake window if there's no parent window
Protected WindowID
If Not IsWindow(GetActiveWindow())
RequesterPositionWindow=OpenWindow(#PB_Any, x, y, 0, 0, "", #PB_Window_Invisible)
WindowID=WindowID(RequesterPositionWindow)
Else
WindowID=WindowID(GetActiveWindow())
EndIf
;modify parent HOOK
RequesterPositionHook=SetWindowsHookEx_(#WH_CALLWNDPROC, @RequesterPositionHook(), GetModuleHandle_(0), GetWindowThreadProcessId_(WindowID, 0))
EndProcedure
;}
; =========================
; EXAMPLE
; =========================
OpenWindow(1, 500, 10, 320, 20, "Ultimate Requester Position", #PB_Window_SystemMenu)
SetRequesterPosition(10, 10)
ColorRequester()
Delay(1000)
SetRequesterPosition(30, 30)
InputRequester("IN", "Input", "Input")
Delay(1000)
SetRequesterPosition(50, 50)
PathRequester("", "")
Delay(1000)
SetRequesterPosition(80, 80)
OpenFileRequester("", "", "", 0)
Delay(1000)
SetRequesterPosition(100, 100)
SaveFileRequester("", "", "", 0)
Delay(1000)
SetRequesterPosition(130, 130)
FontRequester("", 0, 0)
Delay(1000)
SetRequesterPosition()
MessageRequester("Message", "Next to mouse cursor")
Delay(1000)