AddDocTemplate(pDocTemplate); ... } [] MDI程序 (p450) () 1.与SDI相比,MDI程序多一个类:子帧窗口类CChildFrame。 2.与SDI复制同一实例不同,MDI程序对每个打开文档生成这个文档类的一个实例。 3.MDI程序的主帧窗口不是象SDI从CFrameWnd类派生,而是从CMDIFrameWnd类派生。 () 1.每个MDI程序一个主帧窗口(CMDIFrameWnd),管理整个程序的工作空间。 2.每个打开的文档又有自己的子帧窗口(CMDIChildWnd),每个子帧窗口对应一个视图 窗口。 () MDI程序不必在文档类中加入DeleteContents(),因为MDI程序的New命令生成新的视 图窗口而不是复用现有视图窗口,所以程序不需删除文本。 () MDI程序的代码除了InitInstance()与不同外,其他Doc类和View类的程序没什么差别 。两者不同的实现方法已经隐藏在以上不同概念当中。 例子:(p459) BOOL CMiniEditApp :: InitInstance() { CMultiDocTemplate *pDocTemplate; /* 与SDI的CSingleDocTemplate不同, 这里是CMultiDocTemplate */ pDocTemplate = new CMultiDocTemplate( IDR_TEXTTYPE, /* 与SDI的IDR_MAINFRAME不同,这里是子帧窗口的IDR_TEXTTYPE。当 打开文档时,显示IDR_CHARTYPE菜单。 */ RUNTIME_CLASS(CMiniEditDoc), /* 文档类 */ RUNTIME_CLASS(CChildFrame), /* 与SDI的主帧窗口类不同,这里是子帧窗口类 */ RUNTIME_CLASS(CMiniEditView)); /* 视图类 */ AddDocTemplate(pDocTemplate); /* 由于文档首次打开时主帧窗口不像SDI程序中一样自动生成,要加入以下代码 */ CMainFrame *pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) /* 用IDR_MAINFRAME的资源生成主帧窗口 */ return FALSE; ... pMainFrame->ShowWindow(m_nCmdShow); /* 在最后,手工加入显示窗口 */ pMainFrame->UpdateWindow(); /* 画出窗口客户区 */ } []如何在View类中得到对应Doc类 (p138) void CWinGreetView :: OnDraw(CDC *pDC) { CWinGreetDoc *pDoc = GetDocument(); /* 其实GetDocment()就是取得Doc类的m_pDocument */ } []CClientDC (p167) MFC CClientDC类的设备情境对象允许从OnDraw以外的函数在视图窗口 内绘图。用CClientDC ClientDC()得到CClientDC对象。 如:以下例子在OnMouseMove()函数中进行绘图。 void CMiniDrawView :: OnMouseMove() { ::SetCursor(m_HCross); /* 设置鼠标,m_HCross为View类成员,可由以下方法得到 */ /* * CMiniDrawView :: CMiniDrawView() /* 在View类构造函数中得到 */ * { * m_HCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS); * } */ CClientDC ClientDC(this); /* 用CClientDC ClientDC()得到CClientDC对象 */ CClientDC.SetROP(R2_NOT); /* 可以调用CDC函数进行绘图了 */ CClientDC.MoveTo(); CClientDC.LineTo(); } []CView :: PreCreateWindow() (p172) CView :: PreCreateWindow()接收CREATESTRUCT结构(定义窗口风格) 定义。所以,可以在CView :: PreCreateWindow()中进行修改窗口风格。 BOOL CMiniDrawView :: PreCreateWindow(CREATESTRUCT &cs) { m_ClassName = AfxRegisterWndClass /* 生成新的Windows窗口类 */ (CS_HREDRAW | CS_VREDRAW, 0, (HBRUSH) :: GetStockObject(WHITE_BRUSH), 0); cs.lpszClass = m_ClassName; /* 重新指定窗口类,从而修改窗口风格; 注意:m_ClassName必须是类成员,不能是局部变量,因为要求全局有效 */ (责任编辑:admin) |