编程总结2
来源:互联网 发布:三字头中华 知乎 编辑:程序博客网 时间:2024/06/16 16:35
关于MFC中控件随对话框大小成比例
关于如何实现(分析)
- 首先我们要获得最初的控件大小,其次就是还要获取窗口的大小
- 我们根据控件与窗口大小的比例在乘以实际窗口变化值,便可以取得变化后的控件位置
- 调整控件大小我们经常用到便是OnSize()消息
具体实现步骤
第一步
创建一个对话框项目,我的项目名是OnSize2,在对话框面板上添加任意的一个控件,这里我添加的是一个CEDIT(编辑框),ID我自己改成了IDC_INPUT
第二步
- 通过在类视图下找到Dlg对象点击,然后单击右键通过类向导添加”SIZE“消息函数,或者直接点击对话框面板,在属性板上添加消息,如下图。
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
- socket编程总结(2)
- 网络编程总结 2
- 编程总结2
- 界面编程总结(2)
- 网络编程常见问题总结(2)
- 界面编程总结(2)
- ADO数据库编程-总结2
- Java多线程编程总结2
- 界面编程总结(2)
- 网络编程常见问题总结 2
- 2014/2/28编程总结
- java编程思想总结2
- 编程总结
- 编程总结
- 编程总结
- 编程总结
- 编程总结
- 编程总结
- c语言中,关于随机函数的使用详解
- [小技巧]如何让emoji存放到数据库中
- H5基础标签
- 使用maven搭建Spring整合cxf
- 红黑二叉查找树的插入
- 编程总结2
- Python 小甲鱼爬虫代理学习
- 简单工厂、工厂方法、抽象工厂
- mybatis--缓存(一级和二级缓存)
- 文章标题
- CentOS7使用iptables防火墙开放端口
- postfix
- 进程和线程的区别
- leetcode 计算二叉树中出现最多的元素,Python实现