推箱子(2):客户区和窗口的计算
2016-04-27 18:09
281 查看
还是直接拿出一个问题来说比较直观,假如想在客户区显示一张图,图像大小:600*800(像素),要求客户区不大不小正好包含这张图,如何设置窗口大小?
窗口的大小包括客户区和非客户区,如下图所示:
由于图片是放在客户区中的,所以窗口最后的总高度=客户区的高度+上下两头的空隙区,只需要计算空隙区的尺寸就可以,因为客户区的大小已经限定,就是图片的高度800像素。
首先计算窗口的高度=窗口.bottom-窗口.top
客户区高度=客户区.bottom-客户区.top
这两步的计算都是未放入图片时的情况,说明无论窗口怎么放大或缩小,这个空隙尺寸是恒定不变的。所以,空隙的高度=窗口高度-客户区高度。
同样的原理,空隙的宽度也能得到。
最终,设置符合题意的窗口大小,高度=800+空隙高,宽度=600+空隙宽。
具体
这样就得到空隙的宽度和高度,只是觉得这里的right,left等等,有些歧义,要分清那个表示x,哪个表示y...
重设窗口大小,通过SetWindowPos函数,原型如下:
这里主要关注重设窗口的宽和高
这个模型可以适用在任何此类的要求,比如推箱子游戏,每个小图的尺寸是30,要求客户区14行,16列,则整个窗口的大小为:
窗口的大小包括客户区和非客户区,如下图所示:
由于图片是放在客户区中的,所以窗口最后的总高度=客户区的高度+上下两头的空隙区,只需要计算空隙区的尺寸就可以,因为客户区的大小已经限定,就是图片的高度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);
相关文章推荐
- 自定义控件 TextView 歌词 Lrc
- Action三种实现方式及各自特点
- 推荐给开发者的11个PHP框架
- Guice:轻量级IOC/DI 容器
- zoj3715 Kindergarten Election 【枚举+贪心】
- JavaScript 最佳实践
- JavaScript 事件
- Android Button及TextView动态变换颜色
- 【排序算法】简单选择排序(java实现)
- java的自动装箱和自动拆箱
- java中接口与抽象类的区别
- SDK和API的区别?
- linux内存/cpu利用率 引出vmstat命令 free命令
- Cookie与Session的区别
- Android反编译
- Javascript 函数表达式
- GCD使用经验与技巧浅谈
- Android Shape自定义纯色圆角按钮
- elasticsearch中节点都启动但是无法形成集群问题
- java的native方法