一种对话框嵌入MFC 文档结构效果的实现方法(一),让你的自定义对话框区域同客户区大小一起改变
鸣谢:https://blog.csdn.net/educast/article/details/8980686 提供的启发
上机环境: win2012 vs2015 C++ 单文档MFC风格窗口
MFC以文档视图---闻名,我们最初接触MFC,肯定对下图的窗口结构印象深刻
不过,我们还是更倾向使用控件,既然MFC已经为我们慷慨的提供了功能相对全面的菜单和工具栏,我们又没有理由去从头创建一个windows form项目,所以把一个能添加各类控件的窗口加入空白区域,充分利用窗口的空间是我们的不二选择。(如下图)
网上一些帖子给出的方法感觉还是带偏了方向,这里给出一个粗糙一些的方法,实现了对话框(非模式对话框)嵌入到视图客户区的效果
第一步,当然是在项目的资源视图创建对话框。
第二步,选中对话框新建自定义类,然后在项目视图类中的头文件建立对话框类的成员变量。以此建立视图和自定义对话框类之间的关联。
接下来的问题是让对话框大小随着文档视图大小一起改变,这样才够美观,那就要解决两个问题
1.获取客户区的坐标,距离屏幕的上下左右间距。
2.根据第一个问题的处理结果,动态的设置对话框的大小
对于问题1,微软官方提供了结构体RECT和CRect类,RECT中的四个属性记载了上下左右四个方位距离屏幕的位置,CRect类除了记录属性,还给出了计算客户区以及其他各类矩形区域的宽,高等成员方法。
对于问题2,微软官方提供了Cwnd成员方法用来设置CWnd继承类的窗口位置,由于CDialog继承自CWnd,所以可以直接调用该方法
BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags);
由于OnDraw是文档视图启动时的重要成员方法,因此,把对话框的设置工作放在OnDraw方法十分可行
void Csu17View::OnDraw(CDC* /*pDC*/) { Csu17Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码----开始绘制窗口 if (!IsWindow(this->ddlg.m_hWnd)) { this->ddlg.Create(IDD_DIALOG1, NULL); } //SetWindowPos(NULL, 0, 0, temprect.Width(), temprect.Height(), SWP_NOZORDER | SWP_NOMOVE); CRect temprect;//用来盛放客户区域坐标及宽高等信息 GetClientRect(temprect);//获取视图客户区域距离屏幕边距,实际上就是获取客户区域宽,高等数据 this->ddlg.SetWindowPos(NULL, 0, 0, temprect.Width(), temprect.Height(), SWP_NOZORDER | SWP_NOMOVE);//来自CWnd成员方法 this->ddlg.ShowWindow(SW_SHOW); }
- 项目文件结构(dingsdlg即为自定义对话框创建的类,选中xxxxView,右键添加---添加变量)
- 在xxxxView中 添加的成员变量dingsdlg ddlg
上述项目的不足之处在于,对话框上的控件无法随着对话框的大小而改变,且听下回分解