关于窗体控件相对屏幕的坐标(也可以称绝对坐标)的图解
个人自己所画,可能不太清楚,如图所示,有问题可以留言。 忘了说明,因为是取得相对屏幕的坐标,因此不受屏幕分辨率的影响。希望对大家有所帮助。 很直观明了,表扬一下 谢谢,供新入门的朋友参考 我觉得可以拿来做远程桌面控制使用,但是可能消耗CPU比较厉害 放到资料区就好了,再画个相对坐标、点击坐标图吧。。。。 看到这个,正好遇到个这方面的问题请教一下:如下代码创建的右键菜单,本来想让它建在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
图很详细呀。。。 本帖最后由 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 呵,怎么忘了这两个和值呢,果然,加上标题栏和边框,就对了
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
不过说实话,我连是为经常用到的这些常量在那个#Include里头痛不已,象上面的$SM_CYCAPTION
我都是直接上微软网上直接查值,有什么快捷的方式知道某个WinAPI里的常量在au3的那个#include的里? 说明,如果窗体有工具栏,或者还有菜单栏的话,那上面的图示就不准确了,上面的图示之是简单的说明在软件安装安装过程中的界面。 大哥真亏你想得出来这么画,只定义左上角xy和长宽足以,还用的着四个边来搞?
页:
[1]