VC文章 VB文章
返回首页
当前位置: 主页 > 源码文档 > VC文章 >

Visual C++从入门到精通(2)

时间:2010-02-23 11:24来源:未知 作者:admin 点击:
AddDocTemplate(pDocTemplate); ... } []MDI程序(p450) () 1.与SDI相比,MDI程序多一个类:子帧窗口类CChildFrame。 2.与SDI复制同一实例不同,MDI程序对每个打开文档生成这

 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)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容