可以定义两个View,一个从CRichEditView继承,另一个从CHtmlView继承。然后用这两个view分别建立一个实例。在mainfram里定义切换消息。
class CView1: public CRichEditView
{
..............
}
class CView2: public CHtmlView
{
.............
}
class CMainFrame : public CFrameWnd
{
public:
CView1 view1;
CView2 view2;
CView* m_pCurView;
   ..............
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   ......................
   m_pCurView = &view1;
   return 0;
}
void CMainFrame::ChangeView()
{
  CView* pnewview;
  if (m_pCurView == &view1)
     pnewview = &view2;
  else
     pnewview = &view2;  pnewview->OnInitialUpdate();
  pnewview->ShowWindow(SW_SHOW);
  pnewview->ShowWindow(SW_SHOW);
  m_pCurView->ShowWindow(SW_HIDE);
  m_pDoc->AddView(pnewview);
  m_pDoc->RemoveView(m_pCurView);
  SetActiveView(pnewview);
  m_pCurView = pnewview;
}

解决方案 »

  1.   

    CmyDoc里面的OnNewDocument()是不是也应该该有所改动,怎么改?((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);//我这里使用CEditView实验了是不是得在Doc里设置一个BOOL变量判断是否为CEditView中?
      

  2.   

    CHtmlView和CEditView的OnNewDocument()有很多不同哦
      

  3.   

    不成啊,我在原来的HTMLVIEW基础上加了editview(从SDI里分离出来的)之后呢,两个类的GetDocument();出现错误,我注释掉了editVIEW的GetDocument();之后又
    出现htmldocview.h(21) : error C2143: syntax error : missing ';' before '*'
    htmldocview.h(21) : error C2501: 'CHTMLDocDoc' : missing storage-class or type specifiers
    htmldocview.h(21) : error C2501: 'GetDocument' : missing storage-class or type specifiers
    的错误有没有代码实例给我看看?
      

  4.   

    你这个错误很常见,因为View类中声明的函数GetDocument用到了特定的Doc类,但是View.H文件中又没有包含Doc.H,所以交叉引用的时候容易出错。看提示出错的是那个文件,在文件头加上#include <xxdoc.h>就行了。
      

  5.   

    已经加了啊,#include "HTMLView.h"
      

  6.   

    不对,我加的是#include "HTMLdocView.h"
      

  7.   

    我常用的方法是在onCreateClient的时候把所有View都建立起来。
    int CMainFrame::OnCreateClient(...)
    {
      CCreateContext cc;
      cc.m_pCurrentDoc=lpCreateContext->m_pCurrentDoc;
      cc.m_pNewViewClass = RUNTIME_CLASS(CView1);
      m_pView1=(CView1*)CreateView(&cc,ID_VIEW1);
      cc.m_pNewViewClass = RUNTIME_CLASS(CView2);
      m_pView2=(CView2*)CreateView(&cc,ID_VIEW2);
      SwitchToView(ID_VIEW1);
    }void CMainFrame::SwitchToView(UINT nView)
    {
        m_pView1->SetDlgCtrlID(ID_VIEW1);
        m_pView1->ShowWindow(SW_HIDE);
        m_pView2->SetDlgCtrlID(ID_VIEW2);
        m_pView2->ShowWindow(SW_HIDE);
        if (nView==ID_VIEW1)
        {
          m_pView1->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
          m_pView1->ShowWindow(SW_SHOW);
        }
        else
       {
          m_pView2->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
          m_pView2->ShowWindow(SW_SHOW);
       }
       RecalcLayout();
    }
    至于包含文件的问题就要你自己判断了,一般我都是在每个View.H文件头包含相应的Doc.H文件。
      

  8.   

    YuHao:
           看到你的回复之前,我心急如焚,就找啊找啊找代码,我找了一个formView切换的代码改到我的程序里去了,现在呢,一点“切换”View就换啦~可是,那个View是对话框(child)套进来的···
    形容不出来啊,总之很可笑,用着么,还可以.
    我在对话框里加了CRichEditCtrl(让richedit充满整个子窗口),
    这样就算实现了htmlview和edit共存了。       现在存在的问题就是,新的view出来之后原来htmlview的菜单,工具栏、地址栏···全都不能按了,一按就非法操作,怎么重画菜单、工具栏、地址栏呢?
      

  9.   

    HTMLVIEW和其他的View确实很不同,我也没有试过在HTMLView和其他视图切换。你可以试试看用HTMLView的函数SetToolBar,SetStatusBar这些把和工具栏脱离关系,再进行切换;或者干脆多做一个ToolBar,切换视图的同时把工具栏也换掉.如果还不能解决问题的话,我建议做两个框架算了,一个用于HTMLView,一个用于RichEditView,各得其所。
      

  10.   

    我现在能想出门道的只有是换成新的TOOLBAR两个frame怎么做?我这个是SDI的,两个看起来是最理想的了,可是,我不会~~~·····
    我学VC才两、三个月啊~我进了VC世界就跟山炮一样·····还请指点!
      

  11.   

    SetToolBar不可以啊~~我刚刚看了MSDN
    void SetToolBar( int nNewValue );Applies to Internet Explorer. If you use this call with a WebBrowser control, it will return no error, but it will ignore this call.我这个不是IE啊~~~~被忽略掉的
    TOOLBAR自己有没有控制函数?
      

  12.   

    要用两个框架很麻烦的,首先你要生成自己的类,包括Frame,Doc,View,当然Doc也可以用原来的,然后做出来必要的资源,比如字符串,菜单,要使用同一个ID,比如IDR_SECONDFRAME,格式可以照着IDR_MAINFRAME的格式来做。再来就是在App::InitInstance里面,照个那个AddDocTemplate加上自己的Template,要构造新框架的时候这样做:
    POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
    CDocTemplate* pDocTemp = AfxGetApp()->GetNextDocTemplate(pos);
    如果要更复杂的界面,就要用pDocTemp->GetDocString来分析到底要用那一个模板。如果你确切的知道第一个模板是HTMLView的,第二个是RichEditView的就用不着了。
    CDocument* pDoc = pDocTemp->CreateNewDocument();
    CFrameWnd* pFrame = pDocTemp->CreateNewFrame(pDoc,NULL);
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    很麻烦是吧?还没有完呢。如果在App::InitInstance里面有多个Template,那么框架出来的时候回弹出来一个对话框,问你要使用哪个摸板。其实绝大部分情况下是不希望这个东西出现的于是还要改写App::InitInstance,把CommandLineInfo那一段话去掉用上面动态生成框架的方法把第一个框架建立起来,同时要把App.m_pMainWnd指向这个框架。
    如果真要用这么复杂的界面的话,我是宁愿去用Delphi的,VC在构造复杂界面的时候确实非常麻烦。
      

  13.   

    我看到困难一往无前的退缩了(病句哦)我想,以我的低能水平还是来点简单的,我想法把TOOLBAR不显示喽吧,平时怎么控制TOOLBAR是否显示啊?查看——就能控制。菜单就留着,然后把收藏夹灰置了,这样基本杜绝了用户掉CHTMLVIEW的按钮死机了。怎么灰置菜单和不显示工具栏?
      

  14.   

    隐藏工具栏:CFrameWnd::ShowControlBar(&m_wndToolBar,FALSE,FALSE);
    要改变菜单就给菜单项添加OnUpdateCommandUI处理:pCmdUI->Enable(IsInHTMLView());
      

  15.   

    ooooo哦~~~OOOOOOOOOOO我又看了看,TOOLBAR在换VIEW之后自动变成灰色不可按了。
    现在只存在一个问题就是菜单上有一个收藏夹下拉菜单,怎么把它变成灰色?
    哦,我又想起来了,我这还有一个REBAR用来做浏览器的地址栏(组合框),这个家伙怎么消失?或者不响应消息(键入地址的消息···等等)
      

  16.   

    顶层菜单不象普通菜单项,用一般的方法好象没有办法变灰吧?我知道也是有办法的,就是处理WM_NCLBUTTONDOWN和WM_NCPAINT消息,不过除非万不得已我是绝不用此方法的,因为这样一来要做的工作实在太多了,和自己把菜单全部画出来没什么两样。
    要隐藏Rebar的话用ShowControlBar也应该可以的,ShowControlBar对所有CControlBar都有效,包括ToolBar,StatusBar,Rebar,DialogBar等等。要是不响应消息么我倒没试过,要么就是EnableWindow(FALSE),要么就是处理LBUTTONDOWN或者NCLBUTTONDOWN消息,一概简单的返回,不做任何处理就是了。
      

  17.   

    SetMenu(NULL); 之后菜单就不显示了,可是,我还想通过按按钮让菜单重新显示出来,那样,是不是需要重画啊,关键,是顶层菜单啊,oncreate里面并没有找到构造顶层菜单的语句,我不知道方法,望指点~~~
      

  18.   

    在SetMenu以后还应该用DrawMenuBar,菜单才会画出来。如果显示以后主框架有些显示不正常的话,可以用RecalcLayout刷新。
    OnCreate里面是没有,但是菜单的构造在CFrameWnd::Create里面。
      

  19.   

    YuHao我重建了工程,改成了mdi
    CEditView和CHtmlView共存的。
    每次新建文档都有对话框让选择VIEW
    怎么使其默认的只是CHTMLVIEW?
      

  20.   

    为App添加ID_FILE_NEW的处理函数OnFileNew:
        ASSERT(m_pDocManager);
        POSITION pos = m_pDocManager->GetFirstDocTemplatePosition();
        while (pos)
        {
          CDocTemplate* pDocTemp = m_pDocManager->GetNextDocTemplate(pos);
          CString str;
          pDocTemp->GetDocString(str,CDocTemplate::docName);
          if (str == "HtmlView")
          {
             pDocTemp->OpenDocumentFile(NULL);
             return;
          }
        }
    如果还有什么问题的话,可以看看CWinApp::OnFileNew是怎么做的,牵涉到一个WinApp的内部类CDocManager,不过不是很难懂,就是麻烦一些.
      

  21.   

    打开文档的弄清楚了,我把OnFileNew函数替换成了直接打开htmlview的···这个只需要几行代码就搞定了(在程序员大本营找到了源代码)
    我有新的问题PreTranslateMessage怎么用?我想用他在CHtmlView里截获wm_char消息。
      

  22.   

    if (pMsg->message==WM_CHAR)
    {
        ...
        // 如果自己处理消息,就返回1,如果让系统作进一步处理,就返回0
        return 1;
    }
    else
      CHtmlView::PreTranslateMessage(pMsg);
    不过HtmlView和一般的窗口不太一样,实际上是WebBrowser的一个ActiveX控制,未必所有消息都捕捉得到.祝你好运.