论控件在窗口的自适应

近来在做一个程序,有十个对话框,每个对话框有上百个控件。并且对话框还是有背景图的。如果在初始化时将位置定死,那么在窗口大小改变时整个界面就会变的很乱。同样,当用户改变屏幕分辨率时,也会有这个问题。

 

总之,这是一个控件适应窗口的问题,要求:在主窗口大小或者屏幕分辨率改变时,控件的位置和宽高都要改变。

 

可以推断,控件左上角位置,高度,宽度都和主窗口的宽高线性相关 比如控件width = 窗口width* 0.010

 

又因为控件较多,所以不能用浮点运算,全部乘以1000就可以满足精度要求。

 

于是有下面这个函数:

 

 

static void Move(CWnd* pWnd, int l, int t, ULONG cx, ULONG cy,
   int xScale, int yScale, int width, int height)
{

 ASSERT(IsWindow(pWnd->GetSafeHwnd()));
 pWnd->MoveWindow(l + static_cast<int>((cx * xScale) / 1000),
     t + static_cast<int>((cy * yScale) / 1000),
     static_cast<int>((cx * width) / 1000),
     static_cast<int>((cy * height)/ 1000));

    
}

 

cx,cy 是主窗口宽高

l, t 是开始计算点的坐标

xScale,yScale,width,height 是左上角坐标和宽高相对于主窗口的比例。

 

这时就可以在主窗口的OnSize()中这样写:

 

Move(&m_static1, IMG_LEFT, IMG_TOP, cx, cx, 17, 54, 52, 16);
 Move(&m_static2, IMG_LEFT, IMG_TOP, cx, cx, 76, 54, 52, 16);
 Move(&m_static5, IMG_LEFT, IMG_TOP, cx, cx, 135, 54, 52, 16);
 Move(&m_static6, IMG_LEFT, IMG_TOP, cx, cx, 223, 54, 52, 16);
 Move(&m_static7, IMG_LEFT, IMG_TOP, cx, cx, 282, 54, 52, 16);
 Move(&m_static8, IMG_LEFT, IMG_TOP, cx, cx, 341, 54, 52, 16);
 Move(&m_static9, IMG_LEFT, IMG_TOP, cx, cx, 434, 54, 52, 16);
 Move(&m_static10, IMG_LEFT, IMG_TOP, cx, cx, 494, 54, 52, 16);
 Move(&m_static11, IMG_LEFT, IMG_TOP, cx, cx, 572, 54, 52, 16);
 Move(&m_static12, IMG_LEFT, IMG_TOP, cx, cx, 631, 54, 52, 16);
 Move(&m_static13, IMG_LEFT, IMG_TOP, cx, cx, 709, 54, 52, 16);
 Move(&m_static14, IMG_LEFT, IMG_TOP, cx, cx, 768, 54, 52, 16);
 Move(&m_static15, IMG_LEFT, IMG_TOP, cx, cx, 846, 54, 52, 16);
 Move(&m_static16, IMG_LEFT, IMG_TOP, cx, cx, 906, 54, 52, 16);
 

 

也许有人会问,这些参数如何取得,自已一点点调不会太累啊。

我是这样做的,在OnMouseMove中计算鼠标坐标,再算出当前点相对于整个窗口的比例,显示在一个EDIT中

 

我在各种环境下测试过,效果还不错。似乎控件变的“聪明”了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值