访问父窗口冲突?

vampireal 2004-11-25 11:50:05
有窗口A,它的子窗口B,现在在B中用GetParent();获得了父窗口的句柄,然后操作父窗口的控件,结果被告知访问冲突?
这是怎么回事?
请指教!
...全文
148 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
vampireal 2004-11-30
  • 打赏
  • 举报
回复
终于解决了,使用了自定义消息,SendMessage(...)搞定了
我怀疑应该是因为我的父窗体的style为Child的原因(因为是作为formview的一个view)
我在对话框上测试,用GetParent()和构造函数的方法都可以解决,在这就不行,只要用最苯的方法消息来解决了,谢谢各位的参与!
simpleson 2004-11-28
  • 打赏
  • 举报
回复
不要的把问题想得太复杂了,从最简单的开始再仔细想想吧
比如:从调试父窗口句柄是否真的已得到、IDC_LIST1是否唯一等方面着手检查
vampireal 2004-11-28
  • 打赏
  • 举报
回复
UP
vampireal 2004-11-28
  • 打赏
  • 举报
回复
UP
vampireal 2004-11-28
  • 打赏
  • 举报
回复
父窗体的函数
void CMainForm::UpdateSpecify(CString SNo)
{

_RecordsetPtr m_pRecordset;
GetDlgItem(IDC_LIST1)->EnableWindow(true);//到这句就出错了
// CListCtrl* mListCtrl2=(CListCtrl*)GetDlgItem(IDC_LIST1);
CCreateDB* cDB2=new CCreateDB("StuManage.mdb");
CString sql_str;
sql_str.Format("select * from T_Stu_Status where StuNo='%s'",SNo);
m_pRecordset=cDB2->QueryPtr(sql_str);
//修改数据
//...........
}

子窗口构造函数
CEditStu::CEditStu(CMainForm* pParent /*=NULL*/)
: CDialog(CEditStu::IDD, pParent)
, mAddr(_T(""))
, mAge(_T(""))
, mName(_T(""))
, mStuNo(_T(""))
, mStuRes(_T(""))
, cDb(NULL)
, m_Parent(pParent)
{
m_Parent=pParent;
}

调用父窗体函数的函数
m_Parent->UpdateSpecify(mStuNo);

请各位兄弟帮看看哪出错了,谢谢各位的关注!!
vampireal 2004-11-28
  • 打赏
  • 举报
回复
UP
我已经检查了那些东西
yerencao 2004-11-27
  • 打赏
  • 举报
回复
qiqiyeye(导航组打杂的@_@) 正解,
GetParent不是很可靠,我一直用

子窗体B的类的声明
CA* m_pParent;
子窗体B的构造函数中加
m_pParent=pParent;

以后访问很方便。
alphakiller 2004-11-27
  • 打赏
  • 举报
回复
我在MFC中做过类似的功能

先在子窗体B的类的声明中添加一个父窗体A型对象
CA* m_pParent;//存放传入的指针

然后修改子窗体B的构造函数,让它只接收父窗体A的指针
CB::CModeLess(CA* pParent /*=NULL*/)
: CA(CModeLess::IDD,pParent),m_pParent(pParent)//将m_pParent初始化为pParent指针

你试着按照我的思路改一下
vampireal 2004-11-27
  • 打赏
  • 举报
回复
晕啊,都两天了,怎么没人呢?
hundlom 2004-11-27
  • 打赏
  • 举报
回复
遇到问题,别着急,换个思路可以吗?
Mr-Chen 2004-11-27
  • 打赏
  • 举报
回复
代码?
linxy2002 2004-11-27
  • 打赏
  • 举报
回复
强烈建议重载B的构造函数:
B::b(A *a)
{
m_a = a;
}
A *m_a//是B的成员,
如果这样还有错的话,那就可能是你的代码其它地方的问题了
贴一写你访问的代码,好帮你查错啊
vampireal 2004-11-27
  • 打赏
  • 举报
回复
郁闷死我了,怎么会出这种问题?
以前都没出过问题,太郁闷了!!
vampireal 2004-11-27
  • 打赏
  • 举报
回复
不行,试了,还是冲突,怎么回事呢??
我的父窗体是cformview型的,有关系吗?应该没问题的
哪位再来解释一下,谢谢了!
vampireal 2004-11-25
  • 打赏
  • 举报
回复
我的做法与 laiyiling(陌生人·V2.0)基本是一样的,而且我跟踪进去后,发现可以执行父对话框的函数,但一访问里面的控件就提示访问冲突
我的父对话框是放在formview里的,所以style是child型的,不知道这会不会有影响
Kudeet 2004-11-25
  • 打赏
  • 举报
回复
参考

两个个对话框中变量值的传递
假设父对话框为CFatherDlg;
子对话框为CSonDlg,其为CFatherDlg的成员变量;
在CFatherDlg中的变量有:
public:
int m_nValue;
CSonDlg m_SonDlg;
在CSonDlg中的变量有:
public:
int m_nValue;
CButton m_btnTansfer;//传递m_nValue到父对话框的m_nValue;

为按钮m_btnTansfer添加消息响应函数:
void CSonDlg::OnButtonTransfer()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);//根据需要,是否有需要更新的控件变量
m_nValue=100;//如果m_nValue不是控件变量;
((CFatherDlg*)(CDialog*)GetParent())->m_nValue=m_nValue;
////////注意这里要强制转换两次!!!
//1:还可以利用这个方法直接给CFatherDlg中的控件赋值
//((CFatherDlg*)(CDialog*)GetParent())->SetDlgItemInt(IDC_EDIT_VALUE,m_nValue);
//2:直接从父对话框中获得变量,传到子对话框
//((CFatherDlg*)(CDialog*)GetParent())->GetDlgItem(IDC_EDIT_VALUE)->GetWindowText(m_strValue);m_strValue是CSonDlg的成员变量;可以直接看到变化;
//m_nYear=((CFatherDlg*)(CDialog*)GetParent())->m_nValue
}
老夏Max 2004-11-25
  • 打赏
  • 举报
回复
如果可以的话,可以将程序发到:xia_qingqi@broadxent.com.cn
我帮你看看!注明帖子的URL!
DentistryDoctor 2004-11-25
  • 打赏
  • 举报
回复
GetParent的返回值?
老夏Max 2004-11-25
  • 打赏
  • 举报
回复
如果可以的话,可以将程序发到:xia_qingqi@broadxent.com.cn
我帮你看看!注明帖子的URL!
vampireal 2004-11-25
  • 打赏
  • 举报
回复
变量不冲突,连函数都可以访问,只是控件冲突,怎么回事呢?
怎么没人帮我?
加载更多回复(3)

16,472

社区成员

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

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

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