关于控件Controls随Dialog改变大小 && CDialogResize的总结
来源:互联网 发布:网络机顶盒如何使用 编辑:程序博客网 时间:2024/05/18 19:46
一、问题描述
对话框所有控件Controls可随对话框Dialog大小比例的变化而变化位置和大小。
二、解决方法
1 声明一对double值存储原始对话框大小m_OriginX & m_OriginY
2 声明一个CRect的向量 m_RectVector存储每个控件Control的Rect大小
3 对话框初始化时,初始化CRect 向量
4 对话框响应OnSize时,处理控件变化。先获取当前对话框大小cx & cy,分别求X轴、Y轴的大小变化比例ratio[2],
自m_RectVector中获取每个控件的左上角、右下角的点,两点的x、y值分别乘以ratio[0]、ratio[1],再MoveWindow
到新的位置。
5 比较好的一次性处理所有控件的方法:Windows的API函数 GetWindow()
6 为了Resize不出问题,最好通过OnGetMinMaxInfo消息设置对话框的最小尺寸
三、源代码
// .h文件 double m_nOriginX;double m_nOriginY;std::vector<CRect> m_RectVector;void InitRectVector();void ReSize();
// .cpp文件// OnInitDialog()初始化中添加如下代码CRect rect; GetClientRect(&rect); //取客户区大小 m_nOriginX = double(rect.right - rect.left); m_nOriginY = double(rect.bottom - rect.top);
// .cpp文件void CTempChamberDlg::InitPtVector(){ int id; CRect rt; HWND hChild = ::GetWindow(m_hWnd, GW_CHILD); while(hChild) { id = ::GetDlgCtrlID(hChild); GetDlgItem(id)->GetWindowRect(rt); ScreenToClient(rt); m_PtVector.push_back(rt); hChild = ::GetWindow(hChild, GW_HWNDNEXT); } }void CTempChamberDlg::ReSize() { double ratio[2]; CRect rt; GetClientRect(&rt); //取客户区大小 double cx = rt.right - rt.left; double cy = rt.bottom - rt.top; ratio[0] = (double)cx / m_nOriginX; ratio[1] = (double)cy / m_nOriginY; int id; CRect Rect; CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 std::vector<CRect>::iterator iter = m_PtVector.begin(); HWND hChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件 while(hChild) { id = ::GetDlgCtrlID(hChild);//取得ID OldTLPoint = (*iter).TopLeft(); TLPoint.x = long(OldTLPoint.x * ratio[0]); TLPoint.y = long(OldTLPoint.y * ratio[1]); OldBRPoint = (*iter).BottomRight(); BRPoint.x = long(OldBRPoint.x * ratio[0]); BRPoint.y = long(OldBRPoint.y * ratio[1]); Rect.SetRect(TLPoint,BRPoint); GetDlgItem(id)->MoveWindow(Rect,TRUE); ++iter; hChild = ::GetWindow(hChild, GW_HWNDNEXT); }}
// .cpp文件// OnSize消息 & OnGetMinMaxInfo消息BEGIN_MESSAGE_MAP(CTempChamberDlg, CDialog) //}}AFX_MSG_MAP ON_WM_SIZE() ON_WM_GETMINMAXINFO()END_MESSAGE_MAP()void CTempChamberDlg::OnSize(UINT nType, int cx, int cy){ CDialog::OnSize(nType, cx, cy); if (nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED) { ReSize(); }}void CTempChamberDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI){ lpMMI->ptMinTrackSize = m_ptMinTrackSize; CDialog::OnGetMinMaxInfo(lpMMI);}
四、参考尝试过的相关资源链接整理
1、界面布局动态调整
http://blog.csdn.net/xianglitian/article/details/5667015
2、关于CDialogResize
http://blog.csdn.net/hoyi_liu/article/details/5494580
3、两种方法实现MFC 对话框最大化时控件也随比例最大化或者还原
http://blog.csdn.net/zyw_anquan/article/details/8257722
4、WTL CDialogResize extension (CodeProject)
http://www.codeproject.com/Articles/6903/WTL-CDialogResize-extension
5、CResizableDialog (CodeProject)
http://www.codeproject.com/script/Membership/SendConfirmRequest.aspx?rp=%2fArticles%2f568%2fCResizableDialog
6、EasySize - Dialog resizing in no time
http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time
7、EASY_SIZE:控件随窗口变化自由调整大小
http://blog.csdn.net/headmaster110/article/details/5098619
8、Easysize的使用
http://blog.csdn.net/liuy_yy/article/details/7219616
0 0
- 关于控件Controls随Dialog改变大小 && CDialogResize的总结
- 改变dialog的大小
- MFC 控件大小随窗体改变而改变大小的总结
- 怎样改变Dialog的大小
- 怎样改变Dialog的大小?
- 关于CDialogResize
- MFC Dialog改变大小后,控件随之改变方法
- MFC Dialog改变大小后,控件位置随之改变方法
- MFC Dialog子窗口大小随父窗口而能改变,控件随窗口大小而改变
- 改变控件的大小和位置(关于MoveWindow()或SetWindowPos())
- MFC 改变Dialog的大小初始化
- 对话框控件随界面大小的改变而改变
- OnSize 改变控件的大小
- 随对话框大小改变控件大小
- 控件大小随窗口大小改变
- C#关于控件随窗体的改变而自动调整大小并且能重新定位的一些简单介绍和控件随窗体改变自适应类
- 简单是实现winform控件随窗体的大小改变而改变(坐标+大小)
- MFC 控件大小随窗体改变而改变大小
- js打印 PrintArea-master
- PHP内核探索——入门
- 工作中实际问题
- C++实现——两个大数相乘
- 如何用迅雷从百度云盘下大文件
- 关于控件Controls随Dialog改变大小 && CDialogResize的总结
- android listview多种布局 getViewTypeCount和getItemViewType
- bzoj1926: [Sdoi2010]粟粟的书架
- SpringMVC Controller 介绍
- 数组中超过一半的数
- 码流 / 码率 / 比特率 / 帧速率 / 分辨率 / 高清
- 安卓开发中内存问题分析(一)工具篇
- PHP获取今天、昨天、明天的日期
- xml方法封装