编程总结2

来源:互联网 发布:三字头中华 知乎 编辑:程序博客网 时间:2024/06/16 16:35

关于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 的运算。
所以编辑框在改变大小之后消失不见。


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

原创粉丝点击