Click here to load reader
Upload
taryn
View
80
Download
0
Embed Size (px)
DESCRIPTION
6.1 框架窗口. 多文档应用程序的框架窗口. 主框架窗口是应用程序直接放置在桌面 (DeskTop) 上的那个窗口,每个应用程序只能有一个主框架窗口,主框架窗口的标题栏上往往显示应用程序的名称。. 1. 主框架窗口和文档窗口. 文档窗口对于单文档应用程序来说,它和主框架窗口是一致的,即主框架窗口就是文档窗口;而对于多文档应用程序,文档窗口是主框架窗口的子窗口。. 6.1 框架窗口. 2. 窗口状态的改变. - PowerPoint PPT Presentation
Citation preview
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)