win32编程:Win32编程点滴- 窗口的位置

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

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

MoveWindow(hWnd,0,0,?,?);

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

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

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

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



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

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

Tags:  win32编程图文教程 win32多线程编程 win32api编程pdf win32编程

延伸阅读

最新评论

发表评论