首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 开发频道>用VC++在单文档界面中创建多视图

用VC++在单文档界面中创建多视图

2004-03-23 10:12作者:周伟出处:CESDN责任编辑:方舟

  方法二:动态创建切换法
 
  步骤描述:

  1.删除当前的视图

  首先需要获得当前视图的指针,不能使用GetActiveView()和GetActiveDocument()这两个函数,当前视图有可能处在未激活状态,

  所以应该使用EnumChildWindows这个Win32API函数,函数定义如下:

  BOOL EnumChildWindows(
  HWND hWndParent, // 父窗口的句柄
  WNDENUMPROC lpEnumFunc, // 用户自定义回调函数
  LPARAM lParam // 传给回调函数的自定义参数
  );
  回调函数的定义如下:
  BOOL CALLBACK EnumChildProc(
  HWND hwnd, // 字窗口的句柄
  LPARAM lParam // 自定义参数
  );

  EnumChildWindows函数遍历父窗口的所有子窗口,递归调用用户定义的回调函数,当回调函数返回FALSE时,停止遍历,

  至于何时返回FALSE,这根据用户自己需要编写的回调函数来决定。

  删除视图使用DeleteWindow()这个函数,用delete也可以删除,但还要其他底层的操作,这里就不详细介绍了,因为删除视图使用DeleteWindow()最合适、方便了。在删除视图的时候还要注意不能将文档同时自动删除。

  删除视图的代码如下:

  { ......
  CWnd* pWnd;
  CWnd* pWndToDelete;
  // 使用EnumChildWindows查找从CView继承的子窗口
  ::EnumChildWindows(m_hWnd, MyWndEnumProc, (LPARAM)&(pWnd));
  if(pWnd == NULL)
  {// 没有发现子窗口
  return FALSE;}
  // 发现子窗口,找到级别最高的子窗口,即父窗口为CMainFrame的窗口
  while( lstrcmp(pWnd->GetRuntimeClass()->m_lpszClassName, ″CMainFrame″) )
  {
  pWndToDelete = pWnd;
  pWnd = pWnd->GetParent();
  }
  // 确保视图被删除时文档不被删除
  pDoc->m_bAutoDelete = FALSE;}

  // 删除视图
   pWndToDelete->DestroyWindow();
   pDoc->m_bAutoDelete = TRUE;
   ......
   }

   用户定义的回调函数:

   BOOL CALLBACK MyWndEnumProc(HWND hWnd, LPARAM ppWndLPARAM)
   {
   CWnd* pWndChild = CWnd::FromHandlePermanent(hWnd);
   CWnd** ppWndTemp = (CWnd**)ppWndLPARAM;
   if( pWndChild && pWndChild->IsKindOf(RUNTIME_CLASS(CView)) )
   {
   // 发现任何从CView继承的子窗口,将子窗口指针传递出去
   *ppWndTemp = pWndChild;
   // 停止继续搜索
   return FALSE;
   }
   else
   {
   *ppWndTemp = NULL;
   // 继续搜索
   return TRUE;
   }}

   2.创建新的视图

   CDocument* pCurrentDoc = ((CFrameWnd*) m_pMainWnd)->GetActiveDocument();
   // 初始化创建上下文相关指针
   CCreateContext newContext;
   newContext.m_pNewViewClass = RUNTIME_CLASS(CView1);
   newContext.m_pCurrentDoc = pCurrentDoc;
   newContext.m_pNewDocTemplate = NULL;
   newContext.m_pLastView = NULL;
   newContext.m_pCurrentFrame = NULL;
   CView* pNewView = STATIC_DOWNCAST(CView, CreateView(&newContext));
   if( pNewView == NULL )
   {
   return FALSE;
   }
   // 使用CreateView创建的视图不能自动调用OnInitialUpdate函数,需要人工调用OnInitialUpdate函数或者发送WM_INITIALUPDATE消息
   pNewView->OnInitialUpdate();
   // 使用CreateView创建的视图不会自动显示并且激活,需要人工操作
   pNewView->ShowWindow(SW_SHOW);
   SetActiveView(pNewView);
   RecalcLayout();

  注:RUNTIME_CLASS宏含义

  每一个从CObject类继承的类,在定义DECLARE_DYNAMIC、DECLARE_DYNCREATE、DECLARE_SERIAL三个中任意一个宏时都会产生一个CRuntimeClass结构的静态对象,RUNTIME_CLASS返回的就是这个对象的指针,这个对象包含了其基类和本身在运行时刻的信息。以上是笔者在编写多个视应用在单文档的程序时整理出来的两种方法,因为VC++的强大和灵活,笔者相信还有更加巧妙的方法实现这个功能,希望这篇文章能够起到抛砖引玉的作用,也希望广大VC++编程爱好者对本文能够给予批评和指正。

共2页。 9 1 2

关注此文的读者还看过:

返回开发频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络