6.1 框架窗口

Click here to load reader

Upload: taryn

Post on 13-Jan-2016

77 views

Category:

Documents


0 download

DESCRIPTION

6.1 框架窗口. 多文档应用程序的框架窗口. 主框架窗口是应用程序直接放置在桌面 (DeskTop) 上的那个窗口,每个应用程序只能有一个主框架窗口,主框架窗口的标题栏上往往显示应用程序的名称。. 1. 主框架窗口和文档窗口. 文档窗口对于单文档应用程序来说,它和主框架窗口是一致的,即主框架窗口就是文档窗口;而对于多文档应用程序,文档窗口是主框架窗口的子窗口。. 6.1 框架窗口. 2. 窗口状态的改变. - PowerPoint PPT Presentation

TRANSCRIPT

  • 6.1

    1.

    (DeskTop)

  • 6.1

    2.

    MFC AppWizard ShowWindow

  • 6.1

    3.

  • 6.1

    2. MFC AppWizard MFC AppWizard(exe)Ex_SDI2[] (2)

  • 6.1

    (3) [] Step 2

  • 6.1

    (4) []ActiveX

  • 6.1

    (5) []

  • 6.1

    (6)[]

  • 6.1

    (7) [][]

  • 6.1

    (8) []MFC AppWizard

  • 6.1

    3. CREATESTRUCTPreCreateWindowMFC AppWizardMFC BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // [] cs.style &= ~WS_MAXIMIZEBOX; // 1/3 cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3; cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3; cs.y = ((cs.cy * 3) - cs.cy) / 2; cs.x = ((cs.cx * 3) - cs.cx) / 2; // PreCreateWindow return CFrameWnd::PreCreateWindow(cs); }

  • 6.1

    4. ModifyStyleModifyStyleExCWndModifyStyleModifyStyleExModifyStyleEx

  • 6.1

    5.

    CWndSetWindowPosMoveWindowSetWindowPos(Z)

  • 6.2

    1.

    (Ex_SDI)InitInstance BOOL CEx_SDI2App::InitInstance(){ CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, // ID RUNTIME_CLASS(CEx_SDIDoc), // RUNTIME_CLASS(CMainFrame), // RUNTIME_CLASS(CEx_SDIView)); // AddDocTemplate(pDocTemplate); return TRUE;}

  • 6.2

    2.

    MFC AppWizardIDR_MAINFRAME

  • 6.2

    3.

    MFC AppWizard(exe)Ex_MDIDemo(2) String TableString Table

  • 6.2

    (3) IDR_MAINFRAME(4) IDR_EX_MDITYPE

    (5) ID IDR_MAINFRAME

  • 6.2

    (6) Ctrl+WMFC ClassWizard[Add Class]NewNew ClassNameCOtherDocBase classCDocument(7) [OK]COtherDocEx_MDIDemo (8) CEx_MDIDemoApp::InitInstance. (9) CEx_MDIDemoAppEx_MDIDemo.cpp. COtherDoc

  • 6.2

  • 6.3.1 MFC

    1. InitInstanceAddDocTemplateCWinApp:: ProcessShellCommandCWinAppOnFileNew2. MFC AppWizard(File)(Open)(IDID_FILE_OPEN)CWinAppOnFileOpen 3. MFC AppWizard(File)(Save)CDocumentOnFileSave

  • 6.3.1 MFC4. (1) (2) CDocument::OnCloseDocumentCDocumentDeleteContents5. SerializeMFC AppWizardSerialize ar

  • 1. CByteArray CByteArray( ); CDWordArray CDWordArray( ); CObArray CObArray( ); CPtrArray CPtrArray( ); CStringArray CStringArray( ); CUIntArray CUIntArray( ); CWordArray CWordArray( );

    6.3.2.

  • 6.3.2.

    2. MFCGetAt[] // CObArray::operator [] CObArray array; CAge* pa; // CAge array.Add( new CAge( 21 ) ); // array.Add( new CAge( 40 ) ); // pa = (CAge*)array[0]; // 0 ASSERT( *pa == CAge( 21 ) ); array[0] = new CAge( 30 ); // 0; ASSERT( *(CAge*) array[0] == CAge( 30 ) ); // CObArray::GetAt CObArray array; array.Add( new CAge( 21 ) ); // 0 array.Add( new CAge( 40 ) ); // 1 ASSERT( *(CAge*) array.GetAt( 0 ) == CAge( 21 ) );

  • 6.3.2.

    3. (1) GetSize(2) delete(3) RemoveAll CObArray array;CAge* pa1;CAge* pa2; array.Add( pa1 = new CAge( 21 ) ); array.Add( pa2 = new CAge( 40 ) ); ASSERT( array.GetSize() == 2 ); for (int i=0;i

  • 6.3.3.

    CArchiveSerializeCArchive MFCCObjectDECLARE_SERIALIMPLEMENT_SERIALSerialize

  • 6.3.4.

  • 6.3.4.

    2. Ex_StudentDoc.cppCStuInfoDlg (2) (&S)(&A)(ID_STUINFO_ADD)(3) MFC ClassWizardCEx_StudentDocID_STUINFO_ADDCOMMAND void CEx_StudentDoc::OnStuinfoAdd() { CStuInfoDlg dlg; if (dlg.DoModal() != IDOK) return; // CStudentInfo *pStudent = new CStudentInfo(dlg.m_strName, dlg.m_strNo, dlg.m_bMale, dlg.m_tBirth, dlg.m_strSpecial); m_stuObArray.Add(pStudent); SetModifiedFlag(); // UpdateAllViews(NULL); // }

  • 6.3.4.

    3. CEx_StudentDocEx_StudentDoc.hclass CEx_StudentDocCStudentInfo (2) CEx_StudentDocpublic: CObArray m_stuObArray; // (3) CEx_StudentDocCStudentInfo* GetStudentInfoAt(int nIndex)m_stuObArrayCStudentInfo CEx_StudentDocint GetAllRecNum(void) int CEx_StudentDoc::GetAllRecNum(){ return m_stuObArray.GetSize();}

  • 6.3.4.

    (5) CEx_StudentDoc~CEx_StudentDocCEx_StudentDoc::~CEx_StudentDoc(){int nIndex = GetAllRecNum();while (nIndex--)delete m_stuObArray.GetAt(nIndex); // m_stuObArray.RemoveAll();} (6) CEx_StudentDoc::Serialize void CEx_StudentDoc::Serialize(CArchive& ar){ if (ar.IsStoring()) { m_stuObArray.Serialize(ar); } else { m_stuObArray.Serialize(ar);}}

  • 6.3.4.

    4. CEx_StudentView void CEx_StudentView::OnDraw(CDC* pDC){ CEx_StudentDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int y = 0; for (int nIndex = 0; nIndex < pDoc->GetAllRecNum(); nIndex++) { pDoc->GetStudentInfoAt(nIndex)->Display(y, pDC); y += 16;} }CEx_StudentView::OnDraw

  • 6.3.4.

    5. IDR_MAINFRAME 6. Ex_Student Ex_Student\nStudentRec\nEx_Stu\n(*.rec)\n.rec\nExStudent.Document\nEx_Stu Document

  • 6.3.5. CFile

    (1) CFile(2) Open CFile

  • 6.3.5. CFile

    2. CFile rStatusCFileStatus CTime m_ctime CTime m_mtime CTime m_atime LONG m_size DOSDIR BYTE m_attribute char m_szFullName[_MAX_PATH] 3. CFileCArchiveCArchive

  • 6.4.1.

    MFCCViewWindows CView

  • 6.4.1.

    1. CEditViewCEditViewCEdit CEx_EditView Ex_Edit

  • 6.4.1.

    2. CRichEditViewCRichEditViewCRichEditViewCRichEditDocCRichEditCntrItemActiveX3. CFormView(1) New Form

  • 6.4.1. (2) Ex_FormEx_Form (3) CHtmlView CHtmlView WebBrowser (4) CScrollView (5) CScrollViewCListViewMFCCListCtrl (6)

  • 6.4.2.

    CView::GetDocumentGetDocument 2. CDocument::UpdateAllViews 3. CView::OnUpdate 4. CView::OnInitialUpdateCView 5. CDocument::OnNewDocument

  • 6.4.3.

    CDocumentGetFirstViewPositionGetNextView void CMyDoc::OnRepaintAllViews(){ POSITION pos = GetFirstViewPosition(); while (pos != NULL) { CView* pView = GetNextView(pos); pView->UpdateWindow(); } } // UpdateAllViews(NULL); CDocument::GetFirstViewPositionGetNextView

  • 6.4.3.

    2. GetDocument 3. CFrameWndGetActiveView

  • 6.4.4.

    1. 2. CSplitterWnd BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE |WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST );BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );

  • 6.4.4. 3. (1) MFC AppWizard(exe)Ex_SplitSDI (2) MainFrm.hCMainFrame.(3) MFC ClassWizardCDemoView(CView)(4) MFC ClassWizardCMainFrameOnCreateClient(). (5) MainFrm.cppCDemoView(6) #include "DemoView.h"

  • 6.4.4. 4. MFC AppWizard(exe)Ex_DySplit (2) Components and Controls(3) Visual C++ ComponentsVisual C++Splitter BarVisual C++

  • 6.4.4. (4) [Insert]Splitter Bar[] (5) Both[OK][]CMainFrame (6) Splitter Bar Ex_DySplit

  • 6.4.5. MFC MDI(2) (3) Ex_Rect

  • 6.4.5. 1.(1) MFC AppWizard(exe)Ex_Rect (2) IDD_EX_RECT_FORM

  • 6.4.5. (3) MFC ClassWizardMember VariablesClass nameCEx_RectViewID(4) CEx_RectDocCPointm_ptRect

  • 6.4.5. (5) CEx_RectDoc CEx_RectDoc::CEx_RectDoc(){ m_ptRect.x = m_ptRect.y = 0;// m_ptRect = CPoint(0,0)}(6) MFC ClassWizardIDC_EDIT1IDC_EDIT2EN_CHANGEOnChangeEdit void CEx_RectView::OnChangeEdit() { UpdateData(TRUE); CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument(); pDoc->m_ptRect.x = m_CoorX; pDoc->m_ptRect.y = m_CoorY; CPoint pt(m_CoorX, m_CoorY); pDoc->UpdateAllViews(NULL, 2, (CObject *)&pt);}

  • 6.4.5. (7) MFC ClassWizardCEx_RectViewOnUpdatevoid CEx_RectView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) {if (lHint == 1){CPoint* pPoint = (CPoint *)pHint;m_CoorX = pPoint->x;m_CoorY = pPoint->y;UpdateData(FALSE);// CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument();pDoc->m_ptRect = *pPoint;// m_ptRect}}

  • 6.4.5. (8) CEx_RectView::OnInitialUpdate void CEx_RectView::OnInitialUpdate() { CFormView::OnInitialUpdate(); ResizeParentToFit(); CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument(); m_CoorX = pDoc->m_ptRect.x;m_CoorY = pDoc->m_ptRect.y; m_SpinX.SetRange(0, 1024); m_SpinY.SetRange(0, 768); UpdateData(FALSE); }

  • 6.4.5. (9) (10) CEx_RectViewBOOLm_bEditOK(11) CEx_RectViewm_bEditOKFALSE(12) CEx_RectView::OnInitialUpdatem_bEditOKTRUE void CEx_RectView::OnInitialUpdate(){ UpdateData(FALSE); m_bEditOK = TRUE;}(13) CEx_RectView::OnChangeEdit

  • 6.4.5. BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {CRect rect;GetWindowRect( &rect );BOOL bRes = m_wndSplitter.CreateStatic(this, 1, 2);// 2m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEx_RectView), CSize(0,0), pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDrawView), CSize(0,0), pContext); m_wndSplitter.SetColumnInfo(0, rect.Width()/2, 10);// m_wndSplitter.SetColumnInfo(1, rect.Width()/2, 10); m_wndSplitter.RecalcLayout();// return bRes;//CMDIChildWnd::OnCreateClient(lpcs, pContext);} 2. MFC ClassWizardCViewCDrawView (2) MFC ClassWizardCChildFrameOnCreateClient

  • 6.4.5. (3) ChildFrm.cpp#include "ChildFrm.h" #include "Ex_RectView.h" #include "DrawView.h" (4) ChildFrm.hCChildFramepublic: CSplitterWnd m_wndSplitter;(5) (6) Ex_RectView.h class CEx_RectDoc; class CEx_RectView : public CFormView{}

  • 6.4.5. void CDrawView::OnDraw(CDC* pDC){CDocument* pDoc = GetDocument();CRect rc(m_ptDraw.x-5, m_ptDraw.y-5, m_ptDraw.x+5, m_ptDraw.y+5);pDC->Rectangle(rc);}3. CDrawViewCDrawViewCPointm_ptDraw (2) CDrawView::OnDraw

  • 6.4.5. void CDrawView::OnInitialUpdate() {CView::OnInitialUpdate();CEx_RectDoc* pDoc = (CEx_RectDoc*)m_pDocument;m_ptDraw = pDoc->m_ptRect;}(3) MFC ClassWizardCDrawViewOnInitialUpdate (4) DrawView.cppCEx_RectDoc#include "Ex_Rect.h" #include "DrawView.h" #include "Ex_RectDoc.h"

  • 6.4.5. void CDrawView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) {if (lHint == 2){CPoint* pPoint = (CPoint *)pHint;m_ptDraw = *pPoint;Invalidate();}}(5) MFC ClassWizardCDrawViewOnUpdate

  • 6.4.5. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {m_ptDraw = point;GetDocument()->UpdateAllViews(NULL, 1, (CObject*)&m_ptDraw);Invalidate();// CDrawView::OnDrawCView::OnLButtonDown(nFlags, point);}(6) MFC ClassWizardCDrawViewWM_LBUTTONDOWN

  • 6.4.5. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { ...GetDocument()->UpdateAllViews(NULL, 1, (CObject*)&m_ptDraw); // ...}void CEx_RectView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) {if (lHint == 1)// {...}}(7)