在对话框上创建视图的方法总结

在VS 2005上创建一个基于对话框的工程:CreateView。然后新建一个视图类:CMyView,派生自CView。

然后在对话框类CCreateViewDlg上定义一个视图类指针:CMyView *m_pView;

为了使得视图创建在指定的区域,在对话框上放一个静态文本控件,资源ID为IDC_STATIC_VIEW。

在对话框的OnInitDialog函数里添加如下代码:

BOOL CCreateViewDlg::OnInitDialog()
{
    CDialog::OnInitDialog();


    // 将“关于”菜单项添加到系统菜单中。


    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);


    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }


    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标


    // TODO: 在此添加额外的初始化代码
      UINT TargetCtrlID = IDC_STATIC_VIEW;  
      CWnd *pWnd = this->GetDlgItem(TargetCtrlID);  
     CRect RectTargetCtrl;  
     pWnd->GetWindowRect(RectTargetCtrl);  
      this->ScreenToClient(RectTargetCtrl);  
      m_pView = (CMyView*)RUNTIME_CLASS(CMyView)->CreateObject();
    //在目标位置动态创建视图
    if (NULL==m_pView)  
    {  
        return FALSE;  
     }  
     m_pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, RectTargetCtrl, this, TargetCtrlID);  


    return TRUE;  // 除非将焦点设置到控件,否则返回TRUE
}

为了验证视图效果,在视图类的OnDraw函数添加如下代码:

void CMyView::OnDraw(CDC* pDC)
{
    CDocument* pDoc = GetDocument();
    // TODO: 在此添加绘制代码
    CRect rt(0,50,200,200);
    pDC->DrawText(_T("这是在对话框上创建的视图"),&rt,DT_LEFT);
}


方法二: 

方法二和方法一大同小异,只需改动对话框类的OnInitDialog函数中的代码:

BOOL CCreateViewDlg::OnInitDialog()
{
    CDialog::OnInitDialog();


    // 将“关于”菜单项添加到系统菜单中。


    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);


    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }


    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标


    // TODO: 在此添加额外的初始化代码
      UINT TargetCtrlID = IDC_STATIC_VIEW;  
      CWnd *pWnd = this->GetDlgItem(TargetCtrlID);  
     CRect RectTargetCtrl;  
     pWnd->GetWindowRect(RectTargetCtrl);  
      this->ScreenToClient(RectTargetCtrl);  
    CCreateContext context;
    context.m_pCurrentDoc = NULL;//不要文档为空
    context.m_pCurrentFrame = (CFrameWnd *)this;//设置父窗体指针,将对话框指针强制转换
    context.m_pLastView = NULL;//前一个视图为空
    context.m_pNewDocTemplate = NULL;//文档模板为空
    context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
    //1.动态调用CreateObject创建一个对象并获得指针
    m_pView = (CMyView*)context.m_pNewViewClass->CreateObject();//通过指针创建视图对象
    //以下代码参考CFrameWnd类中的CreateView函数
    if (m_pView==NULL) {
        TRACE1("Warning: Dynamic create of view type %hs failed.\n",
            context.m_pNewViewClass->m_lpszClassName);
    }
    ASSERT_KINDOF(CWnd,m_pView);
    //2.真正创建视图窗口
    if (!m_pView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,RectTargetCtrl,this,
        AFX_IDW_PANE_FIRST,&context)) 
    {
        TRACE0("Warning: Couldn't create view for frame.\n");
        return FALSE;
    }


    return TRUE;  // 除非将焦点设置到控件,否则返回TRUE
}


### 回答1: 在MFC中,可以通过以下步骤在对话框中创建一个视图: 1. 首先,打开MFC应用程序的代码。 2. 在对话框资源中定义一个静态控件,该控件将用于容纳视图。 3. 在对话框类的头文件中添加一个成员变量,用于表示视图对象。 4. 打开对话框类的源文件,并在OnInitDialog()函数中进行如下操作: a. 调用基类的OnInitDialog()函数。 b. 创建视图对象,使用CreateView()函数并传入静态控件的ID和对话框指针。 c. 将视图对象指针保存到成员变量中。 ```c++ BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); // 创建视图对象 CRect rect; GetDlgItem(IDC_STATIC_VIEW)->GetWindowRect(&rect); ScreenToClient(&rect); m_pView = new CMyView(); m_pView->Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, this, IDC_STATIC_VIEW); return TRUE; } ``` 5. 最后,别忘记在对话框类的析构函数中删除视图对象。 ```c++ CMyDialog::~CMyDialog() { if (m_pView != nullptr) { delete m_pView; m_pView = nullptr; } } ``` 通过以上步骤,就可以在对话框中成功创建一个视图对象,并将其显示在静态控件中。这样就可以在对话框中展示自定义的图形、数据等内容,并实现与用户的交互。 ### 回答2: 在MFC中,在对话框中创建一个视图有两种方法可以实现。 方法一:使用视图类(CView)和文档类(CDocument) 1. 创建一个新的MFC应用程序项目,选择“单文档”或“多文档”模式。 2. 在资源视图中,打开对话框资源文件(.rc)。 3. 在对话框上选择插入->ActiveX 控件。 4. 在弹出的对话框中,选择“Visual C++ 控件类”,然后点击“添加新控件类…”按钮。 5. 输入控件类名,选择CView作为基类,然后点击“完成”。 6. 给控件设置一个唯一的ID。 7. 在对话框类(CDialog)的代码文件中,添加对CView类的成员变量。 8. 在OnInitDialog()函数中,使用Create()函数创建视图方法二:使用静态控件(CStatic)和视图类(CView) 1. 创建一个新的MFC应用程序项目。 2. 在资源视图中,打开对话框资源文件(.rc)。 3. 在对话框上选择插入->控件->静态文本。 4. 调整静态文本的大小和位置,使其占据你想要的视图区域。 5. 在对话框类(CDialog)的代码文件中,添加对CView类的成员变量。 6. 在OnInitDialog()函数中,使用Create()函数创建视图,并将其父窗口设置为静态文本的句柄。 无论使用哪种方法创建视图后,需要在对话框类的OnSize()函数中调整视图的大小和位置,以保证视图随着对话框的大小改变而调整。 总结:以上是两种在MFC对话框创建视图方法。使用方法一可以使视图和文档类关联,方便进行数据的读写和操作;而方法二则更加简单直接。根据项目需求以及个人偏好,选择合适的方法创建视图即可。 ### 回答3: 在MFC中,我们可以在对话框中创建一个视图,可以通过以下步骤实现: 1. 首先,在MFC应用程序的资源文件夹中打开对话框编辑器,选择一个适当的对话框进行编辑。 2. 在对话框编辑器中,将“工具箱”窗口中的“控件”组件显示出来。 3. 在“控件”组件中找到“ActiveX Control”(“ActiveX 控件”),并在对话框中绘制一个合适大小的矩形。 4. 右键单击绘制的矩形,选择“添加变量”。 5. 在“添加变量”对话框中,将控件名称设置为适当的名称,选择“值”类型为“Control”(“控件”),然后单击“完成”。 6. 在对话框的头文件中,找到对控件变量的声明,并将其类型更改为“CWnd”。 7. 在对话框类的源文件(.cpp)中,找到OnInitDialog()函数。 8. 在OnInitDialog()函数中添加以下代码: ``` // 获取控件指针 CWnd* pWnd = GetDlgItem(IDC_YOUR_CONTROL_ID); // 创建视图对象 CYourViewClass* pView = new CYourViewClass(); // 获取视图的矩形区域 CRect rect; pWnd->GetWindowRect(rect); ScreenToClient(rect); // 创建视图窗口 pView->Create(NULL, NULL, WS_VISIBLE | WS_CHILD | WS_BORDER, rect, this, IDC_YOUR_VIEW_ID); // 调整视图窗口的大小和位置 pView->MoveWindow(rect); ``` 注意:需要将“IDC_YOUR_CONTROL_ID”和“IDC_YOUR_VIEW_ID”替换为适当的控件和视图ID。 9. 编译并运行应用程序,你翻看对话框时将会在指定的位置看到创建的视图。 在对话框创建视图可以实现为用户提供更丰富的交互功能,例如通过绘图或显示图形等。但也需要处理好视图的生命周期和内存管理,防止内存泄漏和其他问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值