一种对话框嵌入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

 上述项目的不足之处在于,对话框上的控件无法随着对话框的大小而改变,且听下回分解

原文地址:https://www.cnblogs.com/saintdingspage/p/12439395.html