两个对话框之间如何交互

gxylwx1314 2009-01-08 03:30:22
一个新手问题。我要在对话框aDlg中使用主对话框mainDlg中的listview控件,来给listview中添加item一个记录.是这样做的
CReportDlg mainDlg = new CReportDlg() ;
LV_ITEM lvitem;
lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvitem.state = 0;
lvitem.stateMask = 0;
lvitem.iItem =0;
lvitem.iSubItem = 0;
char temp[50];
CString TempSql;
lvitem.pszText =itoa(0, temp, 10);
mainDlg.m_ListCtrl.InsertItem(&lvitem);
mainDlg.m_ListCtrl.SetItemText(0, 1, (LPCTSTR)m_id);
mainDlg.m_ListCtrl.SetItemText(0, 2, (LPCTSTR)m_type);
mainDlg.m_ListCtrl.SetItemText(0, 3, (LPCTSTR)m_address);
其中CReportDlg 是主对话框。请高手们帮我看一下,我的代码哪有问题。还是我的调用对话框的控件的方式压根就不对。
...全文
276 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgy_come_on 2009-01-09
  • 打赏
  • 举报
回复

void CLoginDlg::OnButton1()
{
CRegistDlg* pDlg = new CRegistDlg;
pDlg->Create(IDD_Regist);
pDlg->ShowWindow(SW_SHOW);//显示Register
::SendMessage(this->GetSafeHwnd(), WM_CLOSE, NULL, NULL);//关闭Login

}

在CLoginDlg对话框点击按钮OnButton1()进入CRegistDlg(它是非模态的,需要创建),并关闭前一个对话框
,具体代码看你怎么写的了......
lichanghai3166 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gxylwx1314 的回复:]
说老实话,我没看懂,aDlg和主对话框没关系的,就是在同一工程里。。


SetMainDlg 传this指针,不就相当于把本对话框对象给了实例了主对话框对象吗,这样就能调用主对话框中的方法了,为什么啊?帮我理解一下好吗,多谢

上次就是你给我解答的
[/Quote]
两个对话框之间调用,比如在A对话框中调用B对话框的一个函数,完成一定的功能。如果在A中访问不到B的对象,也就是实例,你怎么调用B的方法,毕竟很多方法不是静态的呀。所以,我们需要得到B的对象,如果这个对象已经存在了,那如何能访问到呢?如果A和B的关系是:B是主对话框,A是在B中弹出的对话框,无论A是模态的还是非模态的,A的构造都会在B中完成,这时候,this指针就表示的是B的地址了,然后在A中使用这个指针来调用其公有方法,就可以达到目的。
这个方法最容易理解。
一般不提倡传递listview对象或者指针,毕竟listview是主对话框中的一个成员变量,为了保持一定的封装性,对类的成员访问应该用方法,而不是设成public

如果不明白,看下面的伪代码:
// MainDlg.h
BOOL AddItem(LV_ITEM item); // 声明,向listview中新增一个子项,当然,也可以是其他操作
// MainDlg.cpp
BOOL MainDlg::AddItem(LV_ITEM item)
{
m_listView.Insert(...) // 插入数据
}
BOOL MainDlg::OnOK()// 假设在主对话框中,在OnOK函数中弹出aDlg对话框,当然可以是其他函数,我随便写的
{
...
aDlg *dlg = new dlg;
dlg->SetMainDlg(this);
dlg->DoModal();
...
}
//aDlg.h
MainDlg *m_pMainDlg;
BOOL SetMainDlg(MainDlg *pMain);
//aDlg.cpp
BOOL SetMainDlg(...)
{
...
}

BOOL Add(...)
{
...
m_pMainDlg.AddItem(...)
...
}

基本就是这样了。
明白了的话,再告诉你,CWinApp类有一个公有变量m_pMainDlg,可以直接访问。
这个留给你自己琢磨去

gxylwx1314 2009-01-08
  • 打赏
  • 举报
回复
说老实话,我没看懂,aDlg和主对话框没关系的,就是在同一工程里。。



SetMainDlg 传this指针,不就相当于把本对话框对象给了实例了主对话框对象吗,这样就能调用主对话框中的方法了,为什么啊?帮我理解一下好吗,多谢

上次就是你给我解答的
lichanghai3166 2009-01-08
  • 打赏
  • 举报
回复
这为兄弟很雷人哦。
既然主对话框已经存在了,为什么还要new一个?

还有,你至少说清楚aDlg和主对话框的关系吧。

如果主对话框显示的时候,弹出aDlg,
这个时候,你可以在aDlg调用的地方把listview的指针传递到aDlg中,
或者把主对话框的指针传递到aDlg中。
考虑到封装,建议用第二种方法,在aDlg中声明一个主对话框的指针,
例如:
Class aDlg : public CDialog....
{
....
private:
MainDlg* m_pMainDlg;
public:
BOOL SetMainDlg(MainDlg *pDlg);
....
}
BOOL aDlg::SetMainDlg(MainDlg *pDlg)
{
if (pDlg != NULL)
{
m_pMainDlg = pDlg;
return TRUE;
}
....
}

在主对话框中,可以添加一个函数,用来给listview添加一个子项
在aDlg对象创建之后,把this指针传递进去,就是这个SetMainDlg方法。
然后,在aDlg中,如果你需要添加子项,调用m_pMainDlg->AddItem(...)就可以了。

方法有很多,就看你能不能明白为什么要这么做。

gxylwx1314 2009-01-08
  • 打赏
  • 举报
回复
非常感谢,发消息的这种是可以的

不过还有简单的方式吗
fhinalibob 2009-01-08
  • 打赏
  • 举报
回复
如果已经有了空间,那直接获取这个空间的handle就行,不要再new了。
show_jfx 2009-01-08
  • 打赏
  • 举报
回复
"mainDlg.m_ListCtrl.InsertItem(&lvitem)"不是吧...

添加一个全局数据结构.

你可以在含有listctrl的窗口中(MainDlg)写个添加记录的自定义消息函数.

然后通过aDlg发送消息到MainDlg,参数wparam为操作标识,lparam为数据结构
gxylwx1314 2009-01-08
  • 打赏
  • 举报
回复
我不太明白,你能写个例子吗,我是初学者
gxylwx1314 2009-01-08
  • 打赏
  • 举报
回复
我想调的主对话框啊,主对话框已经有了,为什么还要创建
shailen126 2009-01-08
  • 打赏
  • 举报
回复
你应该在主对话框类中某个成员函数中实例化一个aDlg,通过aDlg得到相应的值后传给listview,
oyljerry 2009-01-08
  • 打赏
  • 举报
回复
CReportDlg* mainDlg = new CReportDlg() ;
mainDlg->Create

你还要创建对话框,然后才能操作
gxylwx1314 2009-01-08
  • 打赏
  • 举报
回复
那怎么调啊,你能给讲一下吗
shailen126 2009-01-08
  • 打赏
  • 举报
回复
调用对话框的控件的方式压根就不对。

15,980

社区成员

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

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