编程总结2

2 篇文章 0 订阅

关于MFC中控件随对话框大小成比例


关于如何实现(分析)

  1. 首先我们要获得最初的控件大小,其次就是还要获取窗口的大小
  2. 我们根据控件与窗口大小的比例在乘以实际窗口变化值,便可以取得变化后的控件位置
  3. 调整控件大小我们经常用到便是OnSize()消息

具体实现步骤


第一步


创建一个对话框项目,我的项目名是OnSize2,在对话框面板上添加任意的一个控件,这里我添加的是一个CEDIT(编辑框),ID我自己改成了IDC_INPUT

第二步

  1. 通过在类视图下找到Dlg对象点击,然后单击右键通过类向导添加”SIZE“消息函数,或者直接点击对话框面板,在属性板上添加消息,如下图。
    添加OnSize消息

2. 在你创建的对话框类内添加

 public:
 Rect rect_Dlg,rect_input;//rect_Dlg代表窗口的大小,rect_input代表控件的大小

第三步添加代码

在BOOL COnSize2Dlg::OnInitDialog()内添加代码如下:

CWnd * edit = GetDlgItem(IDC_INPUT);//
edit->GetWindowRect(rect_input);//获取控件的最初大小
GetClientRect(rect_Dlg);        //获取

在void COnSize2Dlg::OnSize()内添加代码如下:

CWnd *input =GetDlgItem(IDC_INPUT);
if (input->GetSafeHwnd())
{
    CRect newRect;
    newRect.left=rect_input.left * cx /rect_Dlg.Width();
    newRect.top=rect_input.top * cy/rect_Dlg.Height()  ;
    newRect.right = rect_input.right * cx/rect_Dlg.Wid() ;
    newRect.bottom =rect_input.bottom*cy/rect_Dlg.Height();
    //改变控件的大小                       
    input->MoveWindow(newRect);
}

实现的效果图

效果图


注意


我在弄这个的时候出现了一个小问题,实际上问题代码和上面的代码一样,但是效果确实差别很大。

问题代码是

CWnd *input =GetDlgItem(IDC_INPUT);
if (input->GetSafeHwnd())
{
    CRect newRect;
    newRect.left=rect_input.left/rect_Dlg.Width() * cx;
    newRect.top=rect_input.top/rect_Dlg.Height() * cy ;
    newRect.right = rect_input.right /rect_Dlg.Width() *cx ;
    newRect.bottom =rect_input.bottom /rect_Dlg.Height() *cy;
    //改变控件的大小                       
    input->MoveWindow(newRect);
}

效果图

问题代码的效果图

不知道这个动图,你们发现细节没,当对话框大小变化,编辑框不见了,然后你瞧瞧问题代码和实现效果的代码差异在哪。
我推测是因为 rect_input的初值太小当比上rect_Dlg.Width() 是一个小数,而left,right 这些数据的类型是int。
因为默认的强制转换,所以小数强制变成了0,所以当不管如何改变对话框的大小时,其实都是在做cx * 0 或者cy * 0 的运算。
所以编辑框在改变大小之后消失不见。


因为笔者水平有限,不足之处请指出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值