可以定义两个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;
}
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;
}
出现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
的错误有没有代码实例给我看看?
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文件。
看到你的回复之前,我心急如焚,就找啊找啊找代码,我找了一个formView切换的代码改到我的程序里去了,现在呢,一点“切换”View就换啦~可是,那个View是对话框(child)套进来的···
形容不出来啊,总之很可笑,用着么,还可以.
我在对话框里加了CRichEditCtrl(让richedit充满整个子窗口),
这样就算实现了htmlview和edit共存了。 现在存在的问题就是,新的view出来之后原来htmlview的菜单,工具栏、地址栏···全都不能按了,一按就非法操作,怎么重画菜单、工具栏、地址栏呢?
我学VC才两、三个月啊~我进了VC世界就跟山炮一样·····还请指点!
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自己有没有控制函数?
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在构造复杂界面的时候确实非常麻烦。
要改变菜单就给菜单项添加OnUpdateCommandUI处理:pCmdUI->Enable(IsInHTMLView());
现在只存在一个问题就是菜单上有一个收藏夹下拉菜单,怎么把它变成灰色?
哦,我又想起来了,我这还有一个REBAR用来做浏览器的地址栏(组合框),这个家伙怎么消失?或者不响应消息(键入地址的消息···等等)
要隐藏Rebar的话用ShowControlBar也应该可以的,ShowControlBar对所有CControlBar都有效,包括ToolBar,StatusBar,Rebar,DialogBar等等。要是不响应消息么我倒没试过,要么就是EnableWindow(FALSE),要么就是处理LBUTTONDOWN或者NCLBUTTONDOWN消息,一概简单的返回,不做任何处理就是了。
OnCreate里面是没有,但是菜单的构造在CFrameWnd::Create里面。
CEditView和CHtmlView共存的。
每次新建文档都有对话框让选择VIEW
怎么使其默认的只是CHTMLVIEW?
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,不过不是很难懂,就是麻烦一些.
我有新的问题PreTranslateMessage怎么用?我想用他在CHtmlView里截获wm_char消息。
{
...
// 如果自己处理消息,就返回1,如果让系统作进一步处理,就返回0
return 1;
}
else
CHtmlView::PreTranslateMessage(pMsg);
不过HtmlView和一般的窗口不太一样,实际上是WebBrowser的一个ActiveX控制,未必所有消息都捕捉得到.祝你好运.