如何在CView中的弹出对话框里面得到当前文档的指针(在线等,解决立即结帐-50分)

try1225 2004-03-29 06:12:01
我在CView的事件中定义了一个弹出的模式对话框(CMyDlg dlg(this)),我在对话框分初始化时要用到一些CDocument中的一些值,并且对话框结束的时候一些值要传给CDocument的,可是我自己得到的指针没有用。我是这样做的:
1)
BOOL CDlgSelect::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
CMSWaverView *pView=(CMSWaverView *)GetParent();
CMSWaverDoc *pDoc=pView->GetDocument();

return TRUE;
}
2)
BOOL CDlgSelect::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here

CMSWaverDoc *pDoc=CMainFrame::GetActiveDocument();//编译就报错,不知道什么意思,好像是不可以调用非静态成员函数

return TRUE;
}

可是两种方法都不对呀,不知道各位高手是否有什么好的方法。
...全文
52 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2004-03-30
  • 打赏
  • 举报
回复
bjyst2008(追风) : 得到的不一定是框架窗体,新的对话框如果是个child而且它的父窗口是CxxxView的话,则是
bjyst2008 2004-03-30
  • 打赏
  • 举报
回复
njg_jh(糨糊)兄弟说得很对,完全可行;
另外我想对楼主说在对话框中GetParent()得到的应该是框架窗体吧,你看呢?:)
try1225 2004-03-30
  • 打赏
  • 举报
回复
To: jszj(老板说mis部不是赚钱的部门) ,你这样很有道理,我当时想到了传值,可是没想到要传指针,一直没转过弯来,总是想得到指针,唉,郁闷,不过问题总算解决了,结帐
red-fly 2004-03-30
  • 打赏
  • 举报
回复
你可以把一个CDocument的指针传给你的窗体对话框就行了
like this:

//在CxxxView中
CMyDlg dlg;
dlg.pDoc = GetDocument();
if ( dlg.DoModal() != IDOK ) return;

//在CMyDlg中
CxxxDoc *pDoc;
//如果要用document中的数据,就这样子:
var1 = pDoc->var1;
var2 = pDoc->var2;
快乐鹦鹉 2004-03-30
  • 打赏
  • 举报
回复
CMainFrame* pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
CMSWaverView *pView = (CMSWaverView *)(pFrame->GetActiveView());
try1225 2004-03-30
  • 打赏
  • 举报
回复
To: commandconque(马江王),你的想法和我前面提到的一样,就是要做好多中间的变量,很麻烦
蒋晟 2004-03-29
  • 打赏
  • 举报
回复
可以让命令在Doc类中处理么
View有把WM_COMMAND转发到文档类的
commandconque 2004-03-29
  • 打赏
  • 举报
回复
你看这样行么:
1.CMyDlg 中定义一个变量数据,比较多时定义一个ArrayByte;
2.CMyDlg dlg,在视图调用前对该变量赋值,或指定指针,dlg.xxx=???,该数据来源于文档,用GetDocument()获得文档指针。
3.然后在dlg.DoModal();
4.在CMyDlg的初试化中处理xxx
真糨糊 2004-03-29
  • 打赏
  • 举报
回复
我试了一下是正确的
try1225 2004-03-29
  • 打赏
  • 举报
回复
To:jiangsheng(蒋晟.MSMVP2004Jan),调试出来的*pDoc的值怎么总是0x00000000,是不可以在那里调用吗?
try1225 2004-03-29
  • 打赏
  • 举报
回复
To:jiangsheng(蒋晟.MSMVP2004Jan)
这样倒是一个方法,可是这样我的保存就必须在CView中做了,利用CView的GetDocument()。在CDocument中又要定义一份相同的针对dlg的变量。我当时那样考虑就是不想做过多的中间变量。
大虾,有更好的办法吗?
try1225 2004-03-29
  • 打赏
  • 举报
回复
To: njg_jh(糨糊)我不知道为什么,调试出来的*pDoc的值总是0x00000000,肯定是不对了。也不知道是不是调用的地方不对?还是别的原因
蒋晟 2004-03-29
  • 打赏
  • 举报
回复
写错了,应该是if(dlg.DoModal()!=IDOK)return;
蒋晟 2004-03-29
  • 打赏
  • 举报
回复
你可以把这些变量复制一份到对话框的对应成员变量中,用户确认了之后再复制回来
CDlgData dlg;
dlg.data=m_data;
if(dlg.DoModal())return;
m_data=dlg.data;
//下面是数据处理函数
try1225 2004-03-29
  • 打赏
  • 举报
回复
To: njg_jh(糨糊)象你这样我以前也试过,可以得到*pDoc,但是*pDoc使用起来就报错,我试了调用一个CDocument中的一个CString成员来弹出一个AfxMessageBox。Why?
真糨糊 2004-03-29
  • 打赏
  • 举报
回复
CMSWaverDoc *pDoc=(CMSWaverDoc *)((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
try1225 2004-03-29
  • 打赏
  • 举报
回复
To: njg_jh(糨糊)通过CMainFrame怎么办?好像也不好办呀
真糨糊 2004-03-29
  • 打赏
  • 举报
回复
(CMainFrame*)AfxGetMainWnd();

16,471

社区成员

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

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

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