一种保持VC对话框布局的简便方法

本文介绍了一种在VC应用程序中实现窗口缩放时保持布局简单有效的方法。通过三个宏定义,无需复杂代码即可实现窗口及其控件的按比例缩放。

在窗口可缩放的VC应用程序中,在缩放时保持窗口的布局很重要。网上有很多复杂的布局控制代码可供参考。有些代码很强大,但如果你的窗口只是个简单的对话框,也许可以试试本文的方法。这个方法够简单。

别去管那些锚点、对齐之类的词汇了,强大的功能在某种程度上也意味着更多的代码。简单地记住当前的窗口布局,然后按比例缩放这些控件。这样的方法在很多应用中,效果也非常不错。

本着更简单的精神,我没有定义一个基类来让你继承,也没有类让你使用,甚至没有写一个函数。我写了三个宏!


#define FIX_LAYOUT_DATA int m_ow, m_oh; std::map<HWND, CRect> m_OriginLayout; #define FIX_LAYOUT_INIT { / m_OriginLayout.clear();/ CRect rect;/ GetClientRect( rect);/ m_ow = rect.Width();/ m_oh = rect.Height();/ HWND item = NULL;/ RECT r;/ while( NULL != (item = ::FindWindowEx(GetSafeHwnd(), item, NULL, NULL) ) )/ {/ if (!::GetWindowRect(item, &r))/ continue;/ ScreenToClient(&r);/ m_OriginLayout[item] = r;/ }/ } #define FIX_LAYOUT_SIZE {/ if (m_ow == 0)/ m_ow = cx;/ if(m_oh == 0)/ m_oh = cy;/ float rw = (float)cx/ m_ow;/ float rh = (float)cy/ m_oh;/ HWND item = NULL;/ CRect r;/ while( NULL != (item = ::FindWindowEx(GetSafeHwnd(), item, NULL, NULL) ) )/ {/ if (m_OriginLayout.find(item) == m_OriginLayout.end())/ continue;/ r = m_OriginLayout[item];/ r.left *= rw;/ r.right *= rw;/ r.top *= rh;/ r.bottom*= rh;/ ::MoveWindow(item, r.left, r.top, r.right - r.left, r.bottom - r.top, true);/ }/ }
FIX_LAYOUT_DATA宏,定义保存布局信息的成员变量;

FIX_LAYOUT_INIT宏,获取窗口中当前的布局信息;

FIX_LAYOUT_SIZE宏,在窗口大小发生变化时,调整各子窗口的位置和大小。

使用方法:

在你的窗口定义类中加入FIX_LAYOUT_DATA宏。

在窗口的初始化函数中加入FIX_LAYOUT_INIT宏。

在窗口的ONSIZE响应函数中加入FIX_LAYOUT_SIZE宏。

说明:如果你的窗口在运行时,有些控件会发生变化,你也可以在变化发生后,重新调用FIX_LAYOUT_INIT宏,这样新的变化就会更新在布局信息数据中。

文章转自:http://blog.youkuaiyun.com/Slin000/archive/2010/02/05/5290684.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值