![]() |
![]() |
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
To access the contents, click the chapter and section titles.
Fast Track Visual C++ 6.0 Programming
Listing 2.2 MDIView.h and MDIView.cpp // MDIView.h : interface of the CMDIView class // ///////////////////////////////////////////////////////////////////////////// #if !defined(AFX_MDIVIEW_H__81CAFB2F_9C82_11D1_887F_D42B07C10710__INCLUDED_) #define AFX_MDIVIEW_H__81CAFB2F_9C82_11D1_887F_D42B07C10710__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CMDIView : public CView { protected: // create from serialization only CMDIView(); DECLARE_DYNCREATE(CMDIView) // Attributes public: CMDIDoc* GetDocument(); // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMDIView) public: virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint); //}}AFX_VIRTUAL // Implementation public: virtual ~CMDIView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: //{{AFX_MSG(CMDIView) afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // debug version in MDIView.cpp inline CMDIDoc* CMDIView::GetDocument() { return (CMDIDoc*)m_pDocument; } #endif ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_MDIVIEW_H__81CAFB2F_9C82_11D1_887F_D42B07C10710__INCLUDED_) // MDIView.cpp : implementation of the CMDIView class // #include "stdafx.h" #include "MDI.h" #include "MDIDoc.h" #include "MDIView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMDIView IMPLEMENT_DYNCREATE(CMDIView, CView) BEGIN_MESSAGE_MAP(CMDIView, CView) //{{AFX_MSG_MAP(CMDIView) ON_WM_CHAR() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMDIView construction/destruction CMDIView::CMDIView() { // TODO: add construction code here } CMDIView::~CMDIView() { } BOOL CMDIView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMDIView drawing void CMDIView::OnDraw(CDC* pDC) { CMDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); for(int loop_index = 0; loop_index <= pDoc->number_lines; loop_index++){ pDC->TextOut(0, loop_index * tm.tmHeight, pDoc->text[loop_index]); } // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CMDIView printing BOOL CMDIView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CMDIView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CMDIView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CMDIView diagnostics #ifdef _DEBUG void CMDIView::AssertValid() const { CView::AssertValid(); } void CMDIView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CMDIDoc* CMDIView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMDIDoc))); return (CMDIDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMDIView message handlers void CMDIView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { CMDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(nChar != '\r'){ pDoc->text[pDoc->number_lines] += nChar; Invalidate(); } else{ pDoc->number_lines++; } // TODO: Add your message handler code here and/or call default pDoc->UpdateAllViews(this, (long) pDoc->number_lines, NULL); pDoc->SetModifiedFlag(); CView::OnChar(nChar, nRepCnt, nFlags); } void CMDIView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CClientDC dc(this); TEXTMETRIC tm; CMDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); dc.GetTextMetrics(&tm); dc.TextOut(0, (int) lHint * tm.tmHeight, pDoc->text[lHint]); // TODO: Add your specialized code here and/or call the base class } When working with multiple views, theres no reason any two views should show the same part of the same document, so lets allow the user to move around in MDI documents with scrolling views. Scrolling MDI ViewsThe MFC library provides the CScrollView class, which is a view class that supports scrolling. We put this class to work in a new example, ScrollMDI. In this example, the user is able to scroll each view independently. Create a new MDI project now named ScrollMDI. To install the CScrollView class as our view class, stop in Step 6 of the AppWizard and make sure CMDIScrollView is selected in the Class name box, as shown in Figure 2.5. Select CScrollView in the Base class box, as also shown in Figure 2.5. After youve selected CScrollView, click Finish to create the new project. The CScrollMDIView is derived from the CScrollView class, as shown in ScrollMDIView.h. class CScrollMDIView : public CScrollView ⇐ { protected: // create from serialization only CScrollMDIView(); DECLARE_DYNCREATE(CScrollMDIView) . . . This means we have the CScrollView functions available to us for our own use.
To make sure we have something to scroll, we set up ScrollMDI to accept multiline text input as we did with our previous program, MDI. To do that, we add OnChar() to the view class using ClassWizard. void CScrollMDIView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { CScrollMDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(nChar != '\r'){ pDoc->text[pDoc->number_lines] += nChar; Invalidate(); } else{ pDoc->number_lines++; } pDoc->UpdateAllViews(this, pDoc->number_lines, NULL); pDoc->SetModifiedFlag(); CScrollView::OnChar(nChar, nRepCnt, nFlags); }
|
![]() |
Products | Contact Us | About Us | Privacy | Ad Info | Home
Use of this site is subject to certain Terms & Conditions, Copyright © 1996-2000 EarthWeb Inc. All rights reserved. Reproduction whole or in part in any form or medium without express written permission of EarthWeb is prohibited. Read EarthWeb's privacy statement. |