在一个Dialog中,怎么操作另一个Dialog下的控件?

cyberdavinci 2010-12-10 04:28:22
在一个Dialog中,怎么操作另一个Dialog的控件?

有两个Dialog,分别为Dialog A 和Dialog B。
在Dialog A中,想操作Dialog B的ID为IDC_EDIT_RECVDATA的控件,Dialog B的caption是 ver1

代码如下:
在dialog A中:

HWND hMainDialog;
hMainDialog=::FindWindow(NULL,"ver1");

CEdit* pEdit;
pEdit=(CEdit*)(::GetDlgItem(hMainDialog, IDC_EDIT_RECVDATA));
pEdit->GetWindowText(strText);


在此,得到的pEdit的值和在Dialog B中,用GetDlgItem(IDC_EDIT_RECVDATA)得到的值不同
运行pEdit->GetWindowText(strText);这一行后,内存报错。。。

求各位牛人指教!一个Dialog中,该怎么操作另一个Dialog里的控件?上面的代码中,FindWindow()、GetDlgItem()和GetWindowText()的使用是否正确?
菜鸟恳请大家指教了!


...全文
134 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Metrosexual 2010-12-10
  • 打赏
  • 举报
回复
既然解决了就接分吧!
cyberdavinci 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jackson35296 的回复:]

引用 10 楼 cyberdavinci 的回复:
引用 8 楼 jackson35296 的回复:

The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function d……
[/Quote]

老大,用你说的方法,搞定了!
非常感谢,你太伟大了!!
jackson35296 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cyberdavinci 的回复:]
引用 8 楼 jackson35296 的回复:

The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows……
[/Quote]

根本无须用FindWindow的方式去操作DialogB,在创建DialogA的时候传指针就行了,做法如下:
1.在DialogA类里定义一个public成员CEdit *m_pEditOnDialogB;
2.你是在DialogB的Tab里创建的DialogA。
假设创建的函数如下,DialogA是DialogB的成员m_dlgA;
CDialogB::BtnClickCreate()
{
//先获取edit的指针
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_RECVDATA);
if(pEdit != NULL )
{
//这里把edit的指针直接赋给DialogB的成员,以后就可以在DialogA里用m_pEditOnDialogB去访问
m_dlgA.m_pEditOnDialogB = pEdit;
m_dlgA.Create(...);
}
}
cyberdavinci 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackson35296 的回复:]

FindWindow只会找所有的top window,如果top window中没有名字为"ver1"的窗口就找不到
[/Quote]

啥叫top window,还请指教啊!
cyberdavinci 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jackson35296 的回复:]

The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

1.子窗口的查找不能用FindWindow……
[/Quote]

我的DialogB是原来存在的主窗体,DialogA是在DialogB中的一个Tab里,用一个Creat()生成的。上面的代码是在Dialog A中,想操作的是Dialog B中的一个控件。
刚学VC,不太清楚子窗口的概念,这里的原来存在的Dialog B,是子窗体吗?
另外,如果这种情况下不能用FindWindow,那么该怎么做呢?

烦请大侠赐教了!!
jackson35296 2010-12-10
  • 打赏
  • 举报
回复
FindWindow只会找所有的top window,如果top window中没有名字为"ver1"的窗口就找不到
jackson35296 2010-12-10
  • 打赏
  • 举报
回复
The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

1.子窗口的查找不能用FindWindow
2.你的代码写得不规范,对函数的返回值没有判断,这也是很多新手容易犯的错误

HWND hMainDialog = NULL;
hMainDialog=::FindWindow(NULL,"ver1");

if( hMainDialog == NULL )
{
AfxMessageBox("窗口未找到!");
return;
}

CEdit* pEdit = NULL;
pEdit=(CEdit*)(::GetDlgItem(hMainDialog, IDC_EDIT_RECVDATA));
if( pEdit == NULL )
{
AfxMessageBox("IDC_EDIT_RECVDATA控件未找到!");
return;
}
pEdit->GetWindowText(strText);
cyberdavinci 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abesky 的回复:]

是否跨进程了呢?如果是跨进程可能就麻烦了
[/Quote]
应该没有吧,我才刚学VC,不会搞这么复杂的。。
在Dialog B的一个Tab控件里,用Create()插入了Dialog A

而后,想在Dialog A里,操作下Dialog B中的一个Edit控件,貌似这是挺简单的事情啊,我怎么就搞不出来,郁闷。。。。
wateryh 2010-12-10
  • 打赏
  • 举报
回复
似乎可以用发送消息的方式,跨进程也可以
abesky 2010-12-10
  • 打赏
  • 举报
回复
跨进程可以尝试钩子回调方式
abesky 2010-12-10
  • 打赏
  • 举报
回复
是否跨进程了呢?如果是跨进程可能就麻烦了
cyberdavinci 2010-12-10
  • 打赏
  • 举报
回复
或者,有没其他的操作方法?
谢谢1楼的 :)
cyberdavinci 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sparrow429 的回复:]

好像是正确的啊,帮顶
[/Quote]
结果就悲剧地内存报错了。。。 T_T

16,472

社区成员

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

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

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