Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Почему не совпадает результат: WinGetPos и WM_MOVE? (http://forum.oszone.net/showthread.php?t=136642)

proxy 02-04-2009 21:34 1082430

Почему не совпадает результат: WinGetPos и WM_MOVE?
 
Растолкуйте, пожалуйста, как/от чего высчитывают данны WinGetPos и WM_MOVE,
почему не совпадает результат?

Код:

#NoTrayIcon
#region: - Option
    Opt('GUIOnEventMode',      1)
    Opt('MustDeclareVars',      1)
    Opt('TrayIconDebug',        0)
    Opt('TrayIconHide',        1)
#endregion

#region: - Include

    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
#endregion

#region: - Global

; Main Win
    Global  $hMainWin
    Global  $iMainWinWidth      = 350
    Global  $iMainWinHeight    = 345
    Global  $iMainWinX          = -1
    Global  $iMainWinY          = -1

    Global  $iMainWinApiX, $iMainWinApiY
#endregion

#region: - Main Win

Func _MainWin_Create()
    $hMainWin = GUICreate('Test', $iMainWinWidth, $iMainWinHeight, $iMainWinX, $iMainWinY)
        GUISetState(@SW_SHOW, $hMainWin)
            GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
EndFunc
#endregion

#region: - После создания всех GUI

    HotKeySet('{ESC}', '_Pro_Exit')
    GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
    _MainWin_Create()
#endregion

#region: - Sleep, Exit

While 1
    Sleep(10)
    ToolTip('WinGetPos' & @CRLF & 'X = ' & $iMainWinX & @CRLF & 'Y = ' & $iMainWinX & @CRLF  & @CRLF & _
            'WinAPI' & @CRLF & 'X = ' & $iMainWinApiX & @CRLF & 'Y = ' & $iMainWinApiY, _
            10, 70)
WEnd

Func
_Pro_Exit()
    Exit
EndFunc

#endregion

#region: - GUI Register Msg

Func WM_MOVE($hWnd, $Msg, $wParam, $lParam)
    Local  $aWinPos = WinGetPos($hWnd)

    $iMainWinX  = $aWinPos[0]
    $iMainWinY  = $aWinPos[1]

    $iMainWinApiX  = _WinAPI_LoWord($lParam)
    $iMainWinApiY  = _WinAPI_HiWord($lParam)
EndFunc
#endregion


Creat0R 02-04-2009 22:49 1082536

Цитата:

Цитата proxy
почему не совпадает результат? »

Ну хотябы потому, что используется одна и таже переменная:

Цитата:

ToolTip('WinGetPos' & @CRLF & 'X = ' & $iMainWinX & @CRLF & 'Y = ' & $iMainWinX & @CRLF & @CRLF & _
'WinAPI' & @CRLF & 'X = ' & $iMainWinApiX & @CRLF & 'Y = ' & $iMainWinApiY, _
10, 70)
Но как я понимаю не в этом дело... Вообще по сути, WM_MOVE получает координаты клиентской части окна, поэтому нужно самим добавлять (или убавлять):

Код:

#NoTrayIcon
#region: - Option
    Opt('GUIOnEventMode',      1)
    Opt('MustDeclareVars',      1)
    Opt('TrayIconDebug',        0)
    Opt('TrayIconHide',        1)
#endregion

#region: - Include

    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
#endregion

#region: - Global

; Main Win
    Global  $hMainWin
    Global  $iMainWinWidth      = 350
    Global  $iMainWinHeight    = 345
    Global  $iMainWinX          = -1
    Global  $iMainWinY          = -1

    Global  $iMainWinApiX, $iMainWinApiY
#endregion

#region: - Main Win

Func _MainWin_Create()
    $hMainWin = GUICreate('Test', $iMainWinWidth, $iMainWinHeight, $iMainWinX, $iMainWinY)
        GUISetState(@SW_SHOW, $hMainWin)
            GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
EndFunc
#endregion

#region: - После создания всех GUI

    HotKeySet('{ESC}', '_Pro_Exit')
    GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
    _MainWin_Create()
#endregion

#region: - Sleep, Exit

While 1
    Sleep(10)
WEnd

Func
_Pro_Exit()
    Exit
EndFunc

#endregion

#region: - GUI Register Msg

Func WM_MOVE($hWnd, $Msg, $wParam, $lParam)
    Local $aWinPos = WinGetPos($hWnd)
    Local $aWinClientSize = WinGetClientSize($hWnd)

    Local $iBorder_Size = ($aWinPos[2] - $aWinClientSize[0]) / 2
    Local $iCaption_Size = ($aWinPos[3] - $aWinClientSize[1]) - $iBorder_Size

    $iMainWinX
  = $aWinPos[0]
    $iMainWinY  = $aWinPos[1]

    $iMainWinApiX  = _WinAPI_LoWord($lParam) - $iBorder_Size
    $iMainWinApiY
  = _WinAPI_HiWord($lParam) - $iCaption_Size

    ToolTip('WinGetPos' & @CRLF & 'X = ' & $iMainWinX & @CRLF & 'Y = ' & $iMainWinY & @CRLF  & @CRLF & _
        'WinAPI' & @CRLF & 'X = ' & $iMainWinApiX & @CRLF & 'Y = ' & $iMainWinApiY, 10, 70)
EndFunc
#endregion


proxy 03-04-2009 01:42 1082658

Цитата:

Цитата Creat0R
Но как я понимаю не в этом дело... Вообще по сути, WM_MOVE получает координаты клиентской части окна, поэтому нужно самим добавлять (или убавлять): »

точно, верно. даже если можно было вычислить размер рамок, заголовка и т.д.
думаю WinGetPos будет оптимальней.


Время: 13:26.

Время: 13:26.
© OSzone.net 2001-