~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

还是直接拿出一个问题来说比较直观,假如想在客户区显示一张图,图像大小:600*800(像素),要求客户区不大不小正好包含这张图,如何设置窗口大小?

窗口的大小包括客户区和非客户区,如下图所示:

由于图片是放在客户区中的,所以窗口最后的总高度=客户区的高度+上下两头的空隙区,只需要计算空隙区的尺寸就可以,因为客户区的大小已经限定,就是图片的高度800像素。

首先计算窗口的高度=窗口.bottom-窗口.top
客户区高度=客户区.bottom-客户区.top

这两步的计算都是未放入图片时的情况,说明无论窗口怎么放大或缩小,这个空隙尺寸是恒定不变的。所以,空隙的高度=窗口高度-客户区高度

同样的原理,空隙的宽度也能得到。

最终,设置符合题意的窗口大小,高度=800+空隙高,宽度=600+空隙宽。

具体

   RECT clientrc;
   GetClientRect(hWnd,&clientrc);  //获得窗口[客户区]大小 
   RECT windowrc;
   GetWindowRect(hWnd,&windowrc);//获取[程序的]窗口大小,与客户区的参照坐标系不同
   int borderwidth=(windowrc.right-windowrc.left)-(clientrc.right-clientrc.left); //边框宽度,减去上下两头的空白
   int borderheight=(windowrc.bottom-windowrc.top)-(clientrc.bottom-clientrc.top); //边框宽度....

这样就得到空隙的宽度和高度,只是觉得这里的right,left等等,有些歧义,要分清那个表示x,哪个表示y...

重设窗口大小,通过SetWindowPos函数,原型如下:

BOOL SetWindowPos(
HWND hWnd,
HWND hWndInsertAfter,
int x,
int y,
int cx,//
int cy,//
UINT uFlags
);

这里主要关注重设窗口的宽和高

SetWindowPos(hWnd,NULL,0,0,600+borderwidth,800+borderheight,SWP_NOMOVE);

这个模型可以适用在任何此类的要求,比如推箱子游戏,每个小图的尺寸是30,要求客户区14行,16列,则整个窗口的大小为:

SetWindowPos(hWnd,NULL,0,0,30*COL+borderwidth,30*ROW+borderheight,SWP_NOMOVE);

 

posted on 2016-04-27 18:09  LuoTian  阅读(615)  评论(0编辑  收藏  举报