Win32编程点滴之窗口的位置计算机等级考试

文章作者 100test 发表时间 2010:01:01 13:00:45
来源 100Test.Com百考试题网


  把你的Windows任务栏移到屏幕的上方,你就会发现有多少程序会在启动的时候,把自己的标题栏移到任务栏的下方,以至于不能用鼠标移动它,甚至有的窗口还没有系统菜单(Atl 空格 打开系统菜单,可以移动窗口)。所以,这篇文章我们来讨论一下窗口的位置,以避免这样的事情发生。

  如果让你写个程序,要把窗口的位置移动到桌面的左上角,我想很多人都会写出如下的代码:

  MoveWindow(hWnd,0,0,?,?).

  后面?的位置如何填写呢?很多人就会找到GetWindowRect函数来得到当前窗口的宽度。当然,这么写也不是不可以。我觉得更好的方式是使用 SetWindowPos函数。MoveWindow函数有个很好的名字“移动窗口”,很多人都喜欢使用它,但是它还需要窗口的大小作为参数,来改变窗口的大小。那么,SetWindowPos使用的人就不那么多了,它需要更多参数(以至于很多人更倾向于使用MoveWindow),比 MoveWindow更底层(MoveWindow内部其实调用的是SetWindowPos),但是功能更加强大。下面代码,仅仅移动窗口:

  SetWindowPos(hWnd,0,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER).

  好了,以上说得都不是本文的重点。重点在于移动的坐标(0,0),其实是错的。无论是MoveWindow还是SetWindowPos,使用的坐标系都是“桌面坐标系”。那么“桌面”包括哪些区域,任务栏包含在桌面里面吗?当然是的,任何窗口都直接或间接的是桌面的子窗口,任务栏是窗口当然是桌面的一部分。所以,在大部分情况下,把窗口移动到(0,0)是不会有问题的,除非你把任务栏移到屏幕的上方或左方(或者在屏幕的左方或上方有其它shell扩展的停靠窗口,比如:google desktop)。这时,桌面的(0,0)位置被任务栏占据了,窗口移动到此处,必然会与任务栏重叠,而任务栏总在其它窗口的上方,所以你的窗口非常重要的标题栏被覆盖掉了。

  让我们来看下面这张图,当任务栏移动到屏幕上方时的桌面情况:

Win32编程点滴之窗口的位置

  看了,这张图就应该一目了然了。当要把窗口移动到左上角的时候,不应该是(0,0),而是找到WORKAREA的位置。调用 SystemParametersInfo(SPI_GETWORKAREA,…)函数就会得到WORKAREA所在位置的RECT。请使用此RECT来决定,窗口的位置和大小,无论是把窗口移动到左上角或者是CenterWindow这样的操作,这个RECT是非常重要的。来源:考

  最后要提醒一下的是,并不是所有与窗口位置相关的函数都使用“桌面坐标系”,据我所知 SetWindowPlacement/GetWindowPlacement以及WM_GETMINMAXINFO消息,使用的就是WORKAREA坐标系,也就是(0,0)位置是WORKAREA的左上角。



相关文章


VC编程入门浅谈计算机等级考试
malloc()函数与free()函数计算机等级考试
虚函数与虚继承的思考计算机等级考试
C 编译错误解决方法计算机等级考试
Win32编程点滴之窗口的位置计算机等级考试
typedef函数指针的用法(附例子)计算机等级考试
CString,int,string,char*之间的转换计算机等级考试
Windows消息机制要点计算机等级考试
Huffman编码的实现计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛