有关Splitter的难题!(不信谁试试)

52java 2003-05-28 07:21:02
改了一天这个破程序还是没有找到哪里的错!!

我想可能是左边是个CWND功能条,整个程序是个frame的,右边是个view ,现在用菜单来实现右边的变化是可以的,可是用左边的功能条就有了问题!!

猜想是消息或者是全局变量被那个cwnd给截获,改变了!!

在CMainFrame::CMainFrame()中的事件触发函数
long CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam)中的

wndSplitter.DeleteView(0,1);
wndSplitter.CreateView(0,1,RUNTIME_CLASS(ClickView1),m_FrameSize,&m_Context);

这两句话出错!! 我把这两句放到
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 中建立Create这个Splitter之后就可以,放到外边就稿不定!! m_FrameSize,&m_Context这两个都是全局变量!不会有错的呀!!


一团糟!!!

谁要代码,我给您看看也行!
...全文
38 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmm1122 2003-05-30
  • 打赏
  • 举报
回复
我的 vc 只学了一点点
只是想说两句 希望对你会有帮助


CSplitterWnd::CreateView (键 msdn)

....
...
...
Remarks
Call this member function to create the panes for a static splitter window. All panes of a static splitter window must be created before the framework displays the splitter.

所以 改变一下思路

The framework also calls this member function to create new panes when the user of a dynamic splitter window splits a pane, row, or column.


mmm1122 2003-05-29
  • 打赏
  • 举报
回复
meng_xi_peng@163.com
taianmonkey 2003-05-29
  • 打赏
  • 举报
回复
cong119@sohu.com
lld1111 2003-05-29
  • 打赏
  • 举报
回复
haiboshi@21cn.com
52java 2003-05-29
  • 打赏
  • 举报
回复
CCreateContext m_Context;


m_Context.m_pCurrentDoc = pContext->m_pCurrentDoc;
m_Context.m_pCurrentFrame = pContext->m_pCurrentFrame;
m_Context.m_pLastView = pContext->m_pLastView;
m_Context.m_pNewDocTemplate = pContext->m_pNewDocTemplate;
m_Context.m_pNewViewClass = pContext->m_pNewViewClass;


我就是保存的m_Context呀!!!而且证明m_Context是有效的了
kingtsui 2003-05-29
  • 打赏
  • 举报
回复
把OnCreateClient里的pContext所指的Context值保存下来,但是不要保存这个指针,因为OnCreateClient返回后这个指针就无效了
然后用这存下来的Context去CreateView
52java 2003-05-29
  • 打赏
  • 举报
回复
lygfqy(风清扬) :

我单步调试,从watch窗口看出的m_FrameSize,&m_Context全局变量都是想要的值!!我和在OnCreateClient函数中得到的值一一比较完全相同,没有问题!!本来就不该有问题!!:)

windows_editor(色即是空) :

wndSplitter是CMainFrame的成员,所以怕出错,我用
CMainFrame* mainframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
mainframe->wndSplitter.DeleteView(0,1);
mainframe->wndSplitter.CreateView(0,1,RUNTIME_CLASS(ClickView1),mainframe->m_FrameSize,&mainframe->m_Context);
也试过了,没有什么差别!其实本不是_FrameSize,&m_Context值的问题,再说wndSplitter.DeleteView(0,1);是正确的


再探索:

当我在CreateView那行step into是发现也是在相应的Create语句出错!!
基于以上原因,我想和普通的程序不同之处,就在于我是从一个CWND功能条里调用该相应函数的,就是错在这了吧!!他的 CCreateContext已经不是我们需要的环境参数值了!!需要重新来!随后,我干脆就创建一个新的

CCreateContext Context ;
Context.m_pNewViewClass = RUNTIME_CLASS(CView); // 视类
Context.m_pCurrentFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd;//框架
Context.m_pCurrentDoc = GetActiveDocument(); // 与文档连接
Context.m_pLastView = GetActiveView(); // 视类
Context.m_pNewDocTemplate = m_Context.m_pNewDocTemplate;

然后
wndSplitter.DeleteView(0,1);
wndSplitter.CreateView(0,1,RUNTIME_CLASS(ClickView1),m_FrameSize,&Context);
还是不行呀!!!不知道创建一个新的CCreateContext 有特别什么讲究的!其实当时的那pContext在OnCreateClient函数中m_pLastView和m_pCurrentFrame也都是空值的呀!



等待高手!!
需要代码的我留下地址,需要分数的尽管说好了!
windows_editor 2003-05-29
  • 打赏
  • 举报
回复
wndSplitter是CMainFrame中的成员把 放到外面就8行了
GoogleGeek 2003-05-29
  • 打赏
  • 举报
回复
itanynj@msn.com
lygfqy 2003-05-29
  • 打赏
  • 举报
回复
调试一下看看,执行到错误地方时候你需要的全局量是否如你所愿
52java 2003-05-29
  • 打赏
  • 举报
回复
我可是给大家都发了邮件,怎么没见谁的回复呀!
52java 2003-05-29
  • 打赏
  • 举报
回复
真的没有高手吗?

我想会不会是因为在自定义的消息里传递全局变量,或是对整个frame做操作有什么限制呀!!
comfile 2003-05-29
  • 打赏
  • 举报
回复
comfilejpi@hotmail.com
wwtfisher 2003-05-29
  • 打赏
  • 举报
回复
wwtfisher@sina.com
GoogleGeek 2003-05-29
  • 打赏
  • 举报
回复
将你的程序传到
ftp://vc:vc@itanynj.dns0755.net:10766
上!我看看到底是什么难题!!!

另外公布我得共享的ftp
ftp://pub:pub@itanynj.dns0755.net:10766
52java 2003-05-29
  • 打赏
  • 举报
回复
越讨论越清晰了!

现在是
wndSplitter.CreateStatic(this, 1, 2);之后
//对于左边有两种选择的不同,
//1--view
wndSplitter.CreateView(0, 0,pContext->m_pNewViewClass, m_FrameSize, pContext);
//2--cwnd
mywnd.Create(NULL,NULL,WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), &wndSplitter, wndSplitter.IdFromRowCol(0, 0), NULL);

当是1--view时候,可以通过菜单命令来对右边view控制变化
当是2--cwnd时候,出错


而我现在的程序一定要用这个bar条他是cwnd类型的!!怎么办呢!?·









ruihuahan 2003-05-29
  • 打赏
  • 举报
回复
我把这两句放到
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 中建立Create这个Splitter之后就可以,放到外边就稿不定!!

不能放到外边,因为Splitter Window属于Client Window(他是一个Windows预定义的窗口类,用来实现MDI)
zhouzcy 2003-05-29
  • 打赏
  • 举报
回复
upcskit@163.com
共同学习
52java 2003-05-29
  • 打赏
  • 举报
回复
When create a static splitter window, you create nonview classes (cwnd)in it.
this destroy this control!

how to solve this bug!
qiang006 2003-05-29
  • 打赏
  • 举报
回复
icq_wyq0006@sina.com
加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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