您的位置:首页 > 其它

推箱子(2):客户区和窗口的计算

2016-04-27 18:09 281 查看
还是直接拿出一个问题来说比较直观,假如想在客户区显示一张图,图像大小: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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: