Cybernetic Posted June 1, 2013 Share Posted June 1, 2013 Hello all, I did a quick search on this and didnt find what i was looking for, so here i am asking for help. I have a GUI which gets scaled based on the resolution of the current computer. IE: $GUI = GUICreate("Test", @DesktopWidth / 1.5, @DesktopHeight / 1.5, @DesktopWidth / 6, @DesktopHeight / 6) Now this works just fine when you only have 1 monitor. However, if you have 2 or more monitors, it will spread the GUI across all the monitors and it looks stretched and dumb. Is there a way to make it only use 1 monitor even if you have multiple monitors? Thank you for any help. Link to comment Share on other sites More sharing options...
kaotkbliss Posted June 1, 2013 Share Posted June 1, 2013 Search again There are a few (I know, I've responded to them) Here is the main functions expandcollapse popup#Region thanks to xrxca for these functions Func _GetMonitorFromPoint($XorPoint = 0, $y = 0) Local $MousePos, $myX, $myY If @NumParams = 0 Then $MousePos = MouseGetPos() $myX = $MousePos[0] $myY = $MousePos[1] ElseIf (@NumParams = 1) And IsArray($XorPoint) Then $myX = $XorPoint[0] $myY = $XorPoint[1] Else $myX = $XorPoint $myY = $y EndIf If $__MonitorList[0][0] == 0 Then _GetMonitors() EndIf Local $i = 0 Local $Monitor = 0 For $i = 1 To $__MonitorList[0][0] If ($myX >= $__MonitorList[$i][1]) _ And ($myX < $__MonitorList[$i][3]) _ And ($myY >= $__MonitorList[$i][2]) _ And ($myY < $__MonitorList[$i][4]) Then $Monitor = $i Next Return $Monitor EndFunc ;==>_GetMonitorFromPoint Func _GetMonitors() $__MonitorList[0][0] = 0 ; Added so that the global array is reset if this is called multiple times Local $handle = DllCallbackRegister("_MonitorEnumProc", "int", "hwnd;hwnd;ptr;lparam") DllCall("user32.dll", "int", "EnumDisplayMonitors", "hwnd", 0, "ptr", 0, "ptr", DllCallbackGetPtr($handle), "lparam", 0) DllCallbackFree($handle) Local $i = 0 For $i = 1 To $__MonitorList[0][0] If $__MonitorList[$i][1] < $__MonitorList[0][1] Then $__MonitorList[0][1] = $__MonitorList[$i][1] If $__MonitorList[$i][2] < $__MonitorList[0][2] Then $__MonitorList[0][2] = $__MonitorList[$i][2] If $__MonitorList[$i][3] > $__MonitorList[0][3] Then $__MonitorList[0][3] = $__MonitorList[$i][3] If $__MonitorList[$i][4] > $__MonitorList[0][4] Then $__MonitorList[0][4] = $__MonitorList[$i][4] Next Return $__MonitorList EndFunc ;==>_GetMonitors Func _MonitorEnumProc($hMonitor, $hDC, $lRect, $lParam) Local $Rect = DllStructCreate("int left;int top;int right;int bottom", $lRect) $__MonitorList[0][0] += 1 ReDim $__MonitorList[$__MonitorList[0][0] + 1][5] If $hDC = $hDC Then EndIf If $lParam = $lParam Then EndIf $__MonitorList[$__MonitorList[0][0]][0] = $hMonitor $__MonitorList[$__MonitorList[0][0]][1] = DllStructGetData($Rect, "left") $__MonitorList[$__MonitorList[0][0]][2] = DllStructGetData($Rect, "top") $__MonitorList[$__MonitorList[0][0]][3] = DllStructGetData($Rect, "right") $__MonitorList[$__MonitorList[0][0]][4] = DllStructGetData($Rect, "bottom") Return 1 ; Return 1 to continue enumeration EndFunc ;==>_MonitorEnumProc #EndRegion thanks to xrxca for these functions You'll need to add these globals Global $__MonitorList[1][5] $__MonitorList[0][0] = 0 I can't remember off hand which of these 2 functions has it _GetMonitors() or _GetMonitorFromPoint() I believe you use _GetMonitorFromPoint() using your gui's location to get the monitor it's on, Then use that result for your _GetMonitors(). The resulting array has the width and height in it. example: $mainmon = _GetMonitorFromPoint() If $mainmon = 0 Then $mainmon = 1 $res1 = _GetMonitors() $curresx = $res1[$mainmon][3] $curresy = $res1[$mainmon][4] I use these functions to figure out which screen my program is on and bumps it to the edge of the screen if someone tries to move it off screen so I know they will do what you need. Just need to play a little. 010101000110100001101001011100110010000001101001011100110010000 001101101011110010010000001110011011010010110011100100001 My Android cat and mouse gamehttps://play.google.com/store/apps/details?id=com.KaosVisions.WhiskersNSqueek We're gonna need another Timmy! Link to comment Share on other sites More sharing options...
Cybernetic Posted June 1, 2013 Author Share Posted June 1, 2013 Hi, Thanks for the response, however, the comp im trying to get this working on has 3 monitors and it is setup so all 3 monitors are acting as 1 monitor. I didnt realise this before. Now that i know this, im not going to worry about it. Thank you for your help anyway. Link to comment Share on other sites More sharing options...
kaotkbliss Posted June 1, 2013 Share Posted June 1, 2013 Is that what the function provided returns as well, 1 single monitor? 010101000110100001101001011100110010000001101001011100110010000 001101101011110010010000001110011011010010110011100100001 My Android cat and mouse gamehttps://play.google.com/store/apps/details?id=com.KaosVisions.WhiskersNSqueek We're gonna need another Timmy! Link to comment Share on other sites More sharing options...
kaotkbliss Posted June 1, 2013 Share Posted June 1, 2013 I do hope you come back to this thread because I think I may have an idea that could help you get on the right track. Are all your monitors the same size? you can divide the total width by 3 to get each resolution then scale from there. Then it's just a matter of maths to get it positioned where you want (0,0 for the first monitor's corner, 1281,0 for the second, etc) 010101000110100001101001011100110010000001101001011100110010000 001101101011110010010000001110011011010010110011100100001 My Android cat and mouse gamehttps://play.google.com/store/apps/details?id=com.KaosVisions.WhiskersNSqueek We're gonna need another Timmy! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now