fjw18 发表于 2011-3-5 16:16:40

关于窗体控件相对屏幕的坐标(也可以称绝对坐标)的图解

个人自己所画,可能不太清楚,如图所示,有问题可以留言。

fjw18 发表于 2011-3-5 16:18:30

忘了说明,因为是取得相对屏幕的坐标,因此不受屏幕分辨率的影响。希望对大家有所帮助。

bob 发表于 2011-3-5 17:02:22

很直观明了,表扬一下

fjw18 发表于 2011-3-5 17:07:35

谢谢,供新入门的朋友参考

wsfda 发表于 2011-3-5 19:59:53

我觉得可以拿来做远程桌面控制使用,但是可能消耗CPU比较厉害

131738 发表于 2011-3-5 21:04:34

放到资料区就好了,再画个相对坐标、点击坐标图吧。。。。

happytc 发表于 2011-3-5 22:41:13

看到这个,正好遇到个这方面的问题请教一下:如下代码创建的右键菜单,本来想让它建在explorer窗口的地址栏下方的,但怎么老是位置要靠上一点,定位不是那么准呢

Run("Explorer")
Sleep(500)
HotKeySet("^d", "DirHotList")
While 1
        Sleep(200)
WEnd

Func DirHotList()
        $hwdDirMenu = GUICreate("", 100, 100, -1000, -1000, -1, -1,WinGetHandle(AutoItWinGetTitle()))
       
        $FileMenu = GUICtrlCreateContextMenu()
        $Menu1 = GUICtrlCreateMenuItem("Menu1", $FileMenu)
        $Exit = GUICtrlCreateMenuItem("Exit", $FileMenu)
        GUISetState()
        ShowMenu($hwdDirMenu, $FileMenu)

        While True
                $msg = GUIGetMsg()
                Switch $msg
                        Case -3
                                Exit
                        Case $Menu1
                                MsgBox(0,0,"ok")
                        Case $Exit
                                Exit
                EndSwitch
        WEnd
        GUIDelete()
EndFunc

Func ShowMenu($hWnd, $nContextID)
        Local $WinPos, $CtrlPos, $moPos, $hMenu, $hwdTopMost
       
        $hwdTopMost = WinGetHandle("")
        $WinPos = WinGetPos($hwdTopMost)
        $CtrlPos = ControlGetPos($hwdTopMost, "", "Edit1")
        $moPos = $WinPos + $CtrlPos
        $moPos = $WinPos + $CtrlPos + $CtrlPos   ;<===加上这个$ctrlPos:控件宽度,本来应该在控件下方了,结果还不是呢
       
       
        $hMenu = GUICtrlGetHandle($nContextID)
        DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $moPos, "int", $moPos, "hwnd", $hWnd, "ptr", 0)
EndFunc

这疼那疼 发表于 2011-3-5 22:48:39

图很详细呀。。。

afan 发表于 2011-3-5 23:02:46

本帖最后由 afan 于 2011-3-5 23:06 编辑

LZ说明的内容不错,就是图做出了很难分辨图像的选择后的效果,类似按了Ctrl+A _ _||

回复 7# happytc


    如果你想显示在地址栏下方,应该获取 ComboBox1 ,而不是 Edit1 ~ 这还不是问题的主要原因。你需要获取标题栏高度及边框宽度…Func ShowMenu($hWnd, $nContextID)
      Local $WinPos, $CtrlPos, $moPos, $hMenu, $hwdTopMost
      $hwdTopMost = WinGetHandle("")
      $WinPos = WinGetPos($hwdTopMost)
      $CtrlPos = ControlGetPos($hwdTopMost, "", "ComboBox1")
      $moPos = $WinPos + $CtrlPos + 4 ;边框宽
      $moPos = $WinPos + $CtrlPos + $CtrlPos + 30 ;标题栏高
      $hMenu = GUICtrlGetHandle($nContextID)
      DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $moPos, "int", $moPos, "hwnd", $hWnd, "ptr", 0)
EndFunc

happytc 发表于 2011-3-5 23:21:04

呵,怎么忘了这两个和值呢,果然,加上标题栏和边框,就对了

Func ShowMenu($hWnd, $nContextID)
        Local $WinPos, $CtrlPos, $moPos, $hMenu, $hwdTopMost
       
        $hwdTopMost = WinGetHandle("")
        $WinPos = WinGetPos($hwdTopMost)
        $WinCaption = _winapi_GetSystemMetrics(4) ;SM_CYCAPTION
        $WinBorder = _WinAPI_GetSystemMetrics(5) ;SM_CXBORDER

        $CtrlPos = ControlGetPos($hwdTopMost, "", "ComboBox1")
        $moPos = $WinPos + $CtrlPos
        $moPos = $WinPos + $CtrlPos + $CtrlPos + $WinCaption + $WinBorder
       
       
        $hMenu = GUICtrlGetHandle($nContextID)
        DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $moPos, "int", $moPos, "hwnd", $hWnd, "ptr", 0)
EndFunc

happytc 发表于 2011-3-5 23:26:46

不过说实话,我连是为经常用到的这些常量在那个#Include里头痛不已,象上面的$SM_CYCAPTION
我都是直接上微软网上直接查值,有什么快捷的方式知道某个WinAPI里的常量在au3的那个#include的里?

fjw18 发表于 2011-3-18 13:21:38

说明,如果窗体有工具栏,或者还有菜单栏的话,那上面的图示就不准确了,上面的图示之是简单的说明在软件安装安装过程中的界面。

netegg 发表于 2011-3-18 20:43:26

大哥真亏你想得出来这么画,只定义左上角xy和长宽足以,还用的着四个边来搞?
页: [1]
查看完整版本: 关于窗体控件相对屏幕的坐标(也可以称绝对坐标)的图解