在SDI中如何增加一个CView类?

chenxx96 2004-11-22 09:30:30
在SDI中如何增加一个CView类?
...全文
138 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjz800800 2004-11-24
  • 打赏
  • 举报
回复
你的问题说白了就是单文档多视图之间的转换,网上有大量个例子,或者说下你的QQ或email我现在给你串一个例子
chenxx96 2004-11-24
  • 打赏
  • 举报
回复
to: fengqinggao(风清高)
1.要是把第二个模板语句放在if(!ProcessShellCommand(cmdInfo))return FALSE;后边的话,运行后新建文档时,选择第二个就会出错。这个方法只是学习,我不想用这种。
2。这种方法编译时出了一大堆的错误:
CTestEditView *pView = new CTestEditView; //CTestEditView::CTestEditView' : cannot access
// protected member declared in class 'CTestEditView'
CCreateContext* pContext = new CCreateContext;
pContext->m_pCurrentFrame = m_pMainWnd;//error C2440: '=' : cannot convert from 'class
//CWnd *' to 'class CFrameWnd *
pContext->m_pLastView = m_pMainWnd->GetActiveView();//'GetActiveView' : is not a
//member of 'CWnd'
pContext->m_pNewViewClass = RUNTIME_CLASS(CTest2View);
pView = (CTestEditView*)m_pMainWnd->CreateView(pContext);//error C2039: 'CreateView' :
//is not a member of 'CWnd'
delete pContext;

fengqinggao 2004-11-24
  • 打赏
  • 举报
回复
不好意思,上面“其次”部分的第一个语句少了一个“*”,即应该是:
CNewView *pView = new CNewView;

其实你调试的时候肯定能调试出来,我纠正不过是为了不贻笑大方而已,呵呵
fengqinggao 2004-11-24
  • 打赏
  • 举报
回复
首先:
采用多模板的方法的话,有几个模板,就会产生几个框架。如果这样也可以,只需要去掉那个问你要建立哪个文档的对话框的话,是比较简单的,你把那个添加第二个模板的语句放到:
CApp类的函数InitInstance()中的:
if(!ProcessShellCommand(cmdInfo))
return FALSE;
语句后面就可以了,如果要用第二个模板建立文档时,先找到第二个模板(CApp类里有相关函数),然后打开一个空文档即可。

其次:
如果就只要建立一个View,则没有必要用模板,那样麻烦,可以在CApp类中采用如下语句(注意,最起码要放在主框架建立后):
设你要新建的类为CNewView,主框架View类为CMainView,则:
CNewView pView = new CNewView;
CCreateContext* pContext = new CCreateContext;
pContext->m_pCurrentFrame = m_pMainWnd;
pContext->m_pLastView = m_pMainWnd->GetActiveView();
pContext->m_pNewViewClass = RUNTIME_CLASS(CMainView);
pView = (CNewView*)m_pMainWnd->CreateView(pContext);
delete pContext;

这样pView就是你想要的了,如果需要文档类,就继续设置pContext的文档,具体可以参考CCreateContext类的类参数
chenxx96 2004-11-24
  • 打赏
  • 举报
回复
to:erensheep(鄂人)
有两点不理解:
1。怎么有两个框架窗口了,CTestViewFrame和CMainFrame,不是一个吗?
2。第二个也加入模板的话,运行时就会产生一个提问框,问要建立哪个文档,我试过好几次都这样。
fengqinggao 2004-11-24
  • 打赏
  • 举报
回复
看来楼主的基础还有待加强啊,呵呵

第一个错误,说的是你的CTestEditView的构造函数是protected类型的,你把它改成public就行了;
后面几个错误都是因为m_pMainWnd不是CFrameWnd的原因,先将其强制转换成这个类型就可以了,即
在这些语句的前面加上:
CFrameWnd *pFrameWnd = (CFrameWnd*)m_pMainWnd;
然后用pFrameWnd代替m_pMainWnd,就可以了;

因为这段代码是我从我的代码拷贝出来的,修改得还不彻底,给你带来了不便,谅解谅解。
chenxx96 2004-11-24
  • 打赏
  • 举报
回复
to:zjz800800(万人斩(对不起,偶是卧底))
你理解错了,不是单文档多视图的转换。
chenxx96 2004-11-23
  • 打赏
  • 举报
回复
to: I_Love_CPP(我爱C++)
你能不能说具体点?
erensheep 2004-11-23
  • 打赏
  • 举报
回复
我觉得比较好的解决办法是增加文档模板,将两个视图类跟同一个文档类绑定在一起,
例如:
m_ptImageDocTemplate = new CSingleDocTemplate(
IDR_IMAGEFRAME,
RUNTIME_CLASS(CEYRSImageDoc),
RUNTIME_CLASS(CTestViewFrame),
RUNTIME_CLASS(CTest2View));
AddDocTemplate(m_ptImageDocTemplate);

m_ptDocTemplate = new CSingleDocTemplate(
IDR_USEDEFINE,
RUNTIME_CLASS(CEYRSImageDoc),
RUNTIME_CLASS(CMainFrame), // custom MDI child frame
RUNTIME_CLASS(CTestEditView));
AddDocTemplate(m_ptDocTemplate);
具体实现方法可以参考《MFC经典问答》
chenxx96 2004-11-22
  • 打赏
  • 举报
回复
在SDI中,原来有一个CTest2View继承CScrollView,后来我又增加了一个CTestEditView继承CEditView。分割窗口一分为二,分别指向CTest2View和CTestEditView。
如何实现:1。在工具条上按下的某个键能在两个窗口中得到响应。
2。这个窗口的消息又怎么发给另一个窗口(比如:CTestEditView窗口中输入一个命令,
在CTest2View中做相应的处理)。
riverboat 2004-11-22
  • 打赏
  • 举报
回复
仿照它给你的View类自己再写一个(基本上就是Copy/Paste),注意要改下类名和一些标志字符串 :)
然后再在app类的InitInstance中仿照它给的添加文档模板的方法添加你自己的View类模板,以后就可以用DocTemplate的方法来新建你自己的文档了。
基本上跟MDI没有太大的区别,只是不能同时打开多个文档而已。
I_Love_CPP 2004-11-22
  • 打赏
  • 举报
回复
在DOC里面处理消息即可。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧