一个新手问题。我要在对话框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 是主对话框。请高手们帮我看一下,我的代码哪有问题。还是我的调用对话框的控件的方式压根就不对。
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 是主对话框。请高手们帮我看一下,我的代码哪有问题。还是我的调用对话框的控件的方式压根就不对。
mainDlg->Create你还要创建对话框,然后才能操作
既然主对话框已经存在了,为什么还要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(...)就可以了。方法有很多,就看你能不能明白为什么要这么做。
这个方法最容易理解。
一般不提倡传递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,可以直接访问。
这个留给你自己琢磨去
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(它是非模态的,需要创建),并关闭前一个对话框
,具体代码看你怎么写的了......