请教:如何获取控件的绝对坐标

lzguang77 2014-11-28 02:19:13
是这样的:截屏的程序做好了,美中不足的是:无法根据“容器”控件的坐标来截取该控件范围内的屏幕,现在只要获取“容器”控件的绝对坐标(相对于当前屏幕,而不是本身的LEFT和TOP)就可以了,哪位老师能帮一下我?先谢了!

...全文
542 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdjnjdxc 2014-12-01
  • 打赏
  • 举报
回复
vfp这点不好,用到了api函数要自己一个一个声明,太麻烦了。JAVA delphi 只要引用个包或单元就行了。这点MS为何不改进呢?
lzguang77 2014-11-30
  • 打赏
  • 举报
回复
谢谢十豆三老师,你是高手,能得到您的想助是荣幸!! 同样感谢oldbbb老师!
十豆三 2014-11-29
  • 打赏
  • 举报
回复
Declare Integer GetWindowRect In user32 Integer HWnd,String @lpRect
lcRect=Replicate(Chr(0),16)
If GetWindowRect(Thisform.HWnd,@lcRect)#0
	lnLeftUpX=CToBin(Substr(lcRect,1,4),'4rs')		&&当前表单左上角 X 坐标
	lnLeftUpY=CToBin(Substr(lcRect,5,4),'4rs')		&&当前表单左上角 Y 坐标
Endif
然后再加上你要获取控件的相对于表单的 Left 、TOP,就可以知道绝对位置了。 好像还要加上表单标题和边框。
oldbbb 2014-11-28
  • 打赏
  • 举报
回复
给个示例参考
** 
** 窗口区域截图
**
DECLARE LONG GetDC IN user32 LONG
DECLARE LONG ReleaseDC IN user32 LONG, LONG

DECLARE LONG CreateCompatibleDC IN gdi32 LONG
DECLARE LONG DeleteDC IN gdi32 LONG
DECLARE LONG CreateCompatibleBitmap IN gdi32 LONG, LONG, LONG
DECLARE LONG SelectObject IN gdi32 LONG, LONG
DECLARE LONG DeleteObject IN gdi32 LONG
DECLARE LONG BitBlt IN gdi32 LONG, LONG, LONG, LONG, LONG, LONG, LONG, LONG, LONG

DECLARE LONG GdiplusStartup IN gdiplus LONG@, STRING@, LONG
DECLARE LONG GdiplusShutdown IN gdiplus LONG
DECLARE LONG GdipCreateBitmapFromHBITMAP IN gdiplus LONG, LONG, LONG@
DECLARE LONG GdipDisposeImage IN gdiplus LONG
DECLARE LONG GdipSaveImageToFile IN gdiplus LONG, STRING@, STRING@, LONG

PUBLIC oForm
oForm  = NEWOBJECT("Form1")
oForm.Show
READ EVENTS
CLEAR DLLS
RETURN

DEFINE CLASS Form1 As Form
    Height = 300
    Width  = 300
    AutoCenter = .T.
    
    ADD OBJECT Command1 AS COmmandButton WITH top=100,left=100,height=100,width=100,caption="表单区域截图"

    PROCEDURE UnLoad
        CLEAR EVENTS
    ENDPROC

    PROCEDURE Command1.Click
        LOCAL szOutFile, ppX, ppY, ppWidth, ppHeight,;
              stGSI, lpGDI, hDC, hppDC, hBitmap, lpBitmap

            * 截图文件名
        szOutFile = GETFILE("jpg","截图文件名")

        IF EMPTY(szOutFile)
            RETURN
        ENDIF
            * 截图区域
        **ppX = 80
        **ppY = 80
        **ppWidth  = 140
        **ppHeight = 140
        ppX = this.Left
        ppY = this.Top
        ppWidth  = this.Width
        ppHeight = this.Height
            * 初始化GDI
        stGSI = 0h01000000000000000000000000000000
        lpGDI = 0
        GdiplusStartup(@lpGDI, @stGSI, 0)
            * 获取截图设备句柄
        hDC     = GetDC(thisform.hWnd)
        hppDC   = CreateCompatibleDC(hDC)
        hBitmap = CreateCompatibleBitmap(hDC, ppWidth, ppHeight)
            * 获取截图
        SelectObject(hppDC, hBitmap) 
        BitBlt(hppDC, 0, 0, ppWidth, ppHeight, hDC, ppX, ppY, 0xCC0020)  && SRCCOPY
            * 保存截图
        szOutFile = STRCONV(szOutFile + 0h00, 5)
        jpgGUID   = 0h01F47C55041AD3119A730000F81EF32E
        lpBitmap  = 0
        GdipCreateBitmapFromHBITMAP(hBitmap, 2, @lpBitmap)
        GdipSaveImageToFile(lpBitmap, @szOutFile, @jpgGUID, 0)
            * 释放资源
        GdipDisposeImage(lpBitmap)
        DeleteObject(hBitmap)
        DeleteDC(hppDC)
        ReleaseDC(thisform.hWnd, hDC)
        GdiplusShutdown(lpGDI)
        MESSAGEBOX("截图文件: " + STRCONV(szOutFile, 6))
    ENDPROC
ENDDEFINE

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧