还是直接拿出一个问题来说比较直观,假如想在客户区显示一张图,图像大小: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);