zoukankan      html  css  js  c++  java
  • 推箱子(2):客户区和窗口的计算

    还是直接拿出一个问题来说比较直观,假如想在客户区显示一张图,图像大小: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);
  • 相关阅读:
    多个装饰器装饰一个函数
    DRF 里面DestroyAPIView实例
    ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-e7q1vcuk/mysqlclient/解决办法!
    python3 协程爬取两张妹子图
    python3 协程简单运用爬取两张妹子图
    gevent 简单运用
    D
    C
    B
    javascript cookie
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5439891.html
Copyright © 2011-2022 走看看