正文 //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();
}
对话框使用VIEW (转)
最新推荐文章于 2019-06-01 09:51:25 发布
现在的程序功能越来越复杂,很多功能要求能在对话框中实现复杂的功能,而在对话框中使用视图不像使用一些诸如静态控件,编辑控件等那么方便,下面文章用实例说明如何在对话框中使用视图。