您的位置:首页 > 其它

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

2013-09-02 21:49 323 查看
首先创建一个基于对话框的工程: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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: