Breite Fensterrand

    • Offizieller Beitrag

    Wenn mit absoluten Koordinaten gearbeitet wird, und ich die Position über einem Fenster prüfen muss, brauche ich zwingend die Randbreiten des Fensters, da das Fenster auf dem Monitor dargestellt wird mit:
    - gewählte X-Koordinate + Randbreite Seite (+ gewählte Fensterbreite + Randbreite Seite)
    - gewählte Y-Koordinate + Randbreite Oben (+ gewählte Fensterhöhe + Randbreite Unten = Seite)

    Diese Werte sind bei unterschiedlichen Windows-Styles auch unterschiedlich. Mit _WinAPI_GetSystemMetrics kann man alle Einzelkomponenten der Randbreite abfragen. Ich hab das mal in einen Aufruf gepackt.
    Man übergibt zwei Variablen für oberen Rand und Seitenrand, diese werden dann beim Aufruf befüllt.

    Spoiler anzeigen
    [autoit]

    $hGui = GUICreate('Test')
    GUICtrlCreateLabel('Rand oben:', 10, 23, 60, 17)
    $inTop = GUICtrlCreateInput('', 70, 20, 40, 20)
    GUICtrlCreateLabel('Rand Seite:', 10, 53, 60, 17)
    $inSide = GUICtrlCreateInput('', 70, 50, 40, 20)
    $bt = GUICtrlCreateButton('Auslesen', 10, 100, 60, 20)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Local $iTop, $iSide

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $bt
    _SystemGetWindowBorder($iTop, $iSide)
    GUICtrlSetData($inTop, $iTop)
    GUICtrlSetData($inSide, $iSide)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _SystemGetWindowBorder(ByRef $_iTopBorder, ByRef $_iSideBorder)
    ; == by BugFix
    Local Const $SM_CYCAPTION = 4, $SM_CYEDGE = 46, $SM_CYBORDER = 6, $SM_CXBORDER = 5, $SM_CXEDGE = 45
    Local $aMetrics[5][2] = [[$SM_CYCAPTION], [$SM_CYEDGE], [$SM_CYBORDER], [$SM_CXBORDER], [$SM_CXEDGE]]
    Local $dll = DllOpen("user32.dll"), $aRet
    For $i = 0 To 4
    $aRet = DllCall($dll, "int", "GetSystemMetrics", "int", $aMetrics[$i][0])
    If IsArray($aRet) Then $aMetrics[$i][1] = $aRet[0]
    Next
    DllClose($dll)
    $_iTopBorder = $aMetrics[0][1] + $aMetrics[1][1] + $aMetrics[2][1]
    $_iSideBorder = $aMetrics[3][1] + $aMetrics[4][1]
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Ich hab nicht ganz verstanden was du damit bezwecken willst, aber wenn ichs richtig verstanden hab, helfen diese Funktionen:


    Man könnte natürlich auch aus AdjustWindowRect und ClientToScreen die Ränder herausrechnen. Aber das ist mit Systemmetrics dann doch etwas simpler umzusetzen.

    Was ich bezwecken will?
    Bsp.:
    - befindet sich Maus über Fensterkoordinate (realativ) x = 10, y = 20 ? (ich frage Mausposition aus einer Callbackfunktion ab, in der ich nur absolute Koordinaten erhalte)
    - FensterX = 100, FensterY = 200
    - Punkt x, y absolut = ( x + Fensterpos. X + Randbreite Fenster Seite ), ( y + Fensterpos. Y + Randbreite Fenster oben )
    Die absoluten Koordinaten sind dann z.B. x: 100 + 10 + 3 (Rand), y: 200 + 20 + 25 (Rand)

  • Also prüfen ob die Maus im Client des Windows ist?
    ScreenToClient < 0 heißt Maus auf Rand oder garnicht auf dem Fenster und > Clientsize heißt auf der Seite auf dem Rand oder ganz woanders
    rect=ScreenToClient(Mouserect)
    rect.x=10 AND rect.y=20 wäre das if

  • ich hab auch so eine ähnliche funktion^^

    Spoiler anzeigen
    [autoit]

    ; 0 = Position von links (GUI)
    ; 1 = Position von oben (GUI)
    ; 2 = Position von links (Client berreich)
    ; 3 = Position von oben (Client berreich)
    ; 4 = Client berreich Width
    ; 5 = Clinet berreich Height
    ; 6 = Border dicke
    ; 7 = Titelleiste dicke
    ; 8 = gesammte GUI WIdth
    ; 9 = gesammte GUI Height
    Func _WinGetClientPos($hTitle, $hText = '')
    Local $aWPos, $aCSize, $iBorder, $iTitle
    $aWPos = WinGetPos($hTitle, $hText)
    $aCSize = WinGetClientSize($hTitle, $hText)
    $iBorder = ($aWPos[2] - $aCSize[0]) / 2
    $iTitle = ($aWPos[3] - $aCSize[1]) - $iBorder
    Local $aOut[10] = [$aWPos[0], $aWPos[1], $aWPos[0] + $iBorder, $aWPos[1] + $iTitle, $aCSize[0], $aCSize[1], $iBorder, $iTitle, $aWPos[2], $aWPos[3]]
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    $arr = _WinGetClientPos( WinGetHandle("") )
    _ArrayDisplay($arr)

    [/autoit]


    hab die kurz umgebaut, damit die alles returnt^^
    dadurch werden die elemente auch in komischer reihenfolge returnt^^

    mfg

    • Offizieller Beitrag

    Ich glaube es haben sich schon einige an einer Funktion zur Rahmenermittlung versucht.
    Hier mal meine Funktion, die ich schon seit 2 Jahren benutze. ;)

    [autoit]

    Func _GUI_GetWinBorders($hwnd)
    ; 2010 by Raupi
    Local $aClient = WinGetClientSize($hwnd)
    Local $aWinpos = WinGetPos($hwnd)
    Local $aReturn[2]
    $aReturn[0] = ($aWinpos[2] - $aClient[0]) / 2 ; Rahmenbreite
    $aReturn[1] = $aWinpos[3] - $aClient[1] - $aReturn[0] ;Titelleistenhöhe
    Return $aReturn
    EndFunc

    [/autoit]
  • rect=ScreenToClient(Mouserect)
    rect.x=10 AND rect.y=20 wäre das if

    das kann auch genaue Pixel imClient prüfen

    Für rect und mouserect muss man "int,int" als DllStruct benutzen