对话框使用VIEW (转)

来源:互联网 发布:million years ago知乎 编辑:程序博客网 时间:2024/06/16 18:37

现在的程序功能越来越复杂,很多功能要求能在对话框中实现复杂的功能,而在对话框中使用视图不像使用一些诸如静态控件,编辑控件等那么方便,下面文章用实例说明如何在对话框中使用视图。
正文   //http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1674
首先用VC向导建立一个基于对话框的工程。我们这里试验一下无模式对话框使用视图的情况(原理和模式对话框是一样的)。通过创建相关的对话框,并进行显示。准备工作就绪,我们着手处理对话框上创建VIEW了。
    第一步:通过ClassWizard新建一个基于CVIEW的新类,这里命名为CTestView,然后在建立一个基于CDocument的类CTestDoc;
    第二步:在需要显示视图的对话框中定义视图对象
private:
    CFrameWnd m_Frame;
    CTestView *pView;
    第三步:建立视图:
CCreateContext pContext;
    CWnd* pFrameWnd = this;
    pContext.m_pCurrentDoc = new CTestDoc;
    pContext.m_pNewViewClass = RUNTIME_CLASS(CTestView);
    pView =(CTestView *) ((CFrameWnd*)pFrameWnd)->CreateView(&pContext);
    ASSERT(pView);
    pView->ShowWindow(SW_NORMAL);
    CRect rectWindow;
    GetWindowRect(rectWindow);
    ScreenToClient(&rectWindow);
    pView->MoveWindow(rectWindow);

完成,是不是很简单呢,但是相关的工作还没有完成
为了避免主控程序将CTestView对象看作是文档/视图框架,需要重载,CView::OnMouseActivate和CView::OnDestroy。此外,当用户在控制中单击时,OnMouseActivate要负责响应(WM_MOUSEACTIVATE)。 int CTestView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg)
{   
    //旁路 CView 文档/框架   
    return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);
}

void CTestView::OnDestroy()
{   
    CWnd::OnDestroy(); // 旁路 CView 文档/框架
}

通常,CTestView是在virtual void PostNcDestroy()中释放空间,但对话框中的控制常常是作为堆栈对象实现的,所以,在PostNcDestroy()中不必在做什么。    
virtual void PostNcDestroy() {  }   

同时没有给CView使用DYNAMIC_CREATE宏时,MFC不调用OnMouseActivate所以在这里需要进行处理。于是在创建的视图类中间手工添加消息映射ON_MESSAGE(WM_MOUSEACTIVATE,   OnMouseActivate) 

编译运行,OK,为了能够证明我们是在对话框中间使用了视图,我们对OnDraw函数进行修改,进行我们需要的信息的显示,这里采用前面文章提到的叠加字体显示一些信息
void CTestView::OnDraw(CDC* pDC)
{
    CDocument* pDoc = GetDocument();
    // TODO: add draw code here
    CFont pUnitFont, *pOldFont;
    LOGFONT lf;
    lf.lfEscapement = 0;
    lf.lfItalic = NULL;
    lf.lfUnderline = NULL;
    lf.lfStrikeOut = NULL;
    lf.lfCharSet = DEFAULT_CHARSET;
    lf.lfHeight = 45;
    strcpy(lf.lfFaceName, "隶书");
    pUnitFont.CreateFontIndirect(&lf);
    pOldFont = (CFont *)pDC->SelectObject(&pUnitFont);   
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0, 0, 0));
    CRect rectText(10 + 3, 10 + 3, 520 + 3, 300 + 3);
    pDC->DrawText("对话框使用视图的例子", rectText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    pDC->SetTextColor(RGB(255, 0, 0));
    rectText = CRect(10, 10, 520, 300);
    pDC->DrawText("对话框使用视图的例子", rectText, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    pDC->SelectObject(pOldFont);
    pUnitFont.DeleteObject();
}

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyijc/archive/2008/05/20/2463006.aspx

原创粉丝点击