当前位置:C++技术网 > 精选软件 > win32获取窗口在屏幕的位置的实现分析

win32获取窗口在屏幕的位置的实现分析

更新时间:2016-01-13 22:10:07浏览次数:1+次

    平时在使用GetWindowRect函数的时候,并没有注意坐标系的问题。获取窗口矩形的位置和大小时,然后就直接调用MoveWindow移动窗口,或者调整窗口的大小。实际上,在使用的时候也是稀里糊涂的。很惭愧。
    正是因为使用时并没有真正搞清楚,所以在使用的时候,虽然能够达到效果,但是总是感觉有一种隐隐的不安。因为自己总是说不清楚里面的道,总是不舒心的。
    即使技术点简单,但是也需要深入的挖掘一下,从简单的冰山一角,多挖一点知识。让自己在使用时胸有成竹,不再盲目。
    通过这段时间的学习,才发现之前对于Windows编程的知识真的是知之甚少,都是皮毛。这就是立足于基础学习的收获,现在才发现很多基础而又重要的,当时工作时不知道如何实现的技术点,都逐一的被解决了。正是这些疑难点在心中盘旋,所以在学习的时候,都注重实践的经验结合,也试着去解决曾经的问题。
    在坐标转换的文章《图解客户区坐标与屏幕坐标相互转换》中,我们只有客户区坐标和屏幕坐标的转换,为什么没有窗口坐标呢?
    以坐标系的本质来看,也就是一个起点,两个方向而已。窗口坐标系也是有的,只是我们很少使用,所以,微软并没有提供这样的转换。微软提供的API并不是提供一个全面的功能API,只是提供必要的API,他也不作秀。所以,不常用,就不提供了。
    这不是说,窗口坐标没有用,这要看具体的应用。反正你可以通过其他方法实现。而系统提供了一个函数获取窗口基于屏幕坐标的位置,此函数为GetWindowRect。这个函数返回的矩形位置,既包含了窗口的起点,也包含了窗口的大小。可谓是一举两得。所以,有了这个函数,然后基本就可以处理好窗口的坐标了。因为此时得到的窗口坐标是基于屏幕坐标的,屏幕坐标和客户区坐标的转换,你懂的。
    窗口原点坐标是在客户区原点坐标之上的。如果将窗口原点坐标转换为客户区坐标,那么窗口原点坐标的Y值就是负数了。而将客户区原点坐标转换为窗口坐标系坐标,那么客户区原点在窗口坐标系的坐标就不是(0,0)了,而是(0,上边框高度+标题栏高度+工具栏高度等)。这里就是简单说明了窗口坐标与客户区坐标的转换。其实这个转换挺麻烦的,系统也不太好提供转换函数,毕竟还要判断是否存在工具栏等。所以,系统更偏向于留给程序员自己实现了。
    而获取窗口原点在屏幕坐标系的坐标,只需要使用下面的代码即可:
RECT rect;
GetWindowRect(hwnd,&rect);
wsprintf(tip,_T("窗口起始坐标:(%d , %d)"),rect.left,rect.top);
TextOut(hdc,2,30,tip,lstrlen(tip));
    所以本文就是分析了下背景知识。简单描述了窗口坐标和客户区坐标转换的思路,具体转换方法,就看程序是否有工具栏了。一般也不需要用上,只是作为一个知识的拓展分析,说了一下而已,不提供实现代码了。