导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

【请教】关于单文档中对话框里的CListctrl控件问题

nffly11 2010-07-16 02:14:30
小生小学期做程序,主程序是单文档型,然后在单文档上添加了一个对话框,在对话框中有一个列表控件

请问 怎么对它进行初始化(就是设置表头)?

在View类中的表头很容易设置,就是在View类中的除书画函数添加代码即可


但是回到上面的对话框,这个对话框根本就没有初始化函数啊,这可怎么办?
无奈之下我在对话框头文件中声明了一下初始化函数,然后在对话框的app中添加之。可是编译的时候报错说'm_pSet' : undeclared identifier,等等一大堆的错误


我自己新建的初始化函数如下
void CDlg_Fayoujian::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_my20100714Set;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

m_Record_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

LV_COLUMN h;
h.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
h.fmt=LVCFMT_CENTER;
h.cx=90;

//显示控件列表
h.pszText="姓名";
m_Record_List.InsertColumn(1,&h);
h.pszText="地址";
m_Record_List.InsertColumn(2,&h);

}


居然说什么未定义 还有非法函数之类的,唉


求大牛指点啊。
...全文
271 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zc_china 2010-07-23
你没初始化 m_pSet,

使用前加上
m_pSet = new CMy20100714Set;
回复
nffly11 2010-07-19
今天我在对话框的头文件中参照View类里的声明,声明了这个指针,代码是:、
CMy20100714Set* m_pSet;

然后奇迹发生了,这样居然可以编译成功。可是悲剧的是,点击显示所有数据库的函数的按钮时,居然说内存错误,xxxxxxx不可读,这可咋整啊?
回复
nffly11 2010-07-18
但是问题没有结束 接下来我想用这个单文档中对话框里的CListctrl控件链接数据库


为了链接并数据库,并使用指针变量m_pset以及MoveFirst、IsEOF等函数,我甚至新建了一个基类为CRecordset的类,建立的时候就将其关联了我要用的数据库。然后也在对话框类所在的cpp文件包含了上述类的头文件了,便衣的时候用到了下面代码:

DeleteAll();
m_pSet->MoveFirst();
int i=0;
while (!m_pSet->IsEOF())
{
m_Record_List.InsertItem(i, m_pSet->m_column1);
m_Record_List.SetItemText(i,1,m_pSet->m_column2);
m_Record_List.SetItemText(i,2,m_pSet->m_column3);
m_pSet->MoveNext();
i++;
}




可是气人的是,编译后居然说m_pset,还有MoveFirst IsEOF MoveNext这几个东西没有定义,怒了,怎么会没定义呢。
为了使用他们,我都新建了一个CRecordset类,并用对话框cpp包含了它的都文件,为啥还是说未定义的



请教下各位 我该怎么办?
回复
nffly11 2010-07-18
谢谢你,觉得你的知识掌握得挺牢,

对了 我已经解决问题了,我大仙用类向导,可以在那个对话框类中加一个WM_OnInitDialog响应函数,这样才能初始化,否则自己新建初始化函数会造成一系列的问题,而我上述初始化函数方法却是标准的。

[Quote=引用 10 楼 hztj2005 的回复:]

其实也简单:

首先你的“发邮件”对话框中不要手动画上“列表框”。

而在响应“发邮件”按钮的函数里,你肯定有一些代码,显示“发邮件”对话框,否则你的对话框如何出来?

你在之后,加上我上边所说的代码就可以了。
[/Quote]
回复
nffly11 2010-07-18
各个你就帮帮我把,我的问题复杂,但是对于你这样的高手来说,几乎没有难度的

我只是个小菜鸟,现在分少得可怜,几乎没啥发帖量,你就大发慈悲救救我的把

这个问题困扰的我这几天觉都睡不好了

[Quote=引用 13 楼 hztj2005 的回复:]
你分这么小,问题这么复杂。
[/Quote]
回复
hztj2005 2010-07-18
你分这么小,问题这么复杂。
回复
nffly11 2010-07-17
谢谢
但是这个 真的看不懂啊 大哥我的水平很低 没有学过C++,不知道啥意思耶
为啥要在view中动态创建列表控件,

[Quote=引用 6 楼 hztj2005 的回复:]

我直接在cview中动态创建了m_EditListCtrl,这样添加表头。
你把它创建到对话框就可以了。
CRect test2(400,0,600,678);
m_EditListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,test2,this,IDC_EDITLIST);

//把this换成对话框的句柄

m_Ed……
[/Quote]
回复
nffly11 2010-07-17
谢谢大家了,但是 怕大家不明白我的意思 我贴两张图

回复
nffly11 2010-07-17
对了 我想再请教一下,我的View类中已经本来就有了一个列表控件,然后我已经在你说的地方初始化过了

但现在我是想初始化单文档中新建的对话框里的列表控件,这个难道也是在你说的地方初始化吗?那岂不是两个初始化函数位置冲突了嘛?这可咋整?

[Quote=引用 3 楼 visualeleven 的回复:]

View类直接再OnInitialUpdate 中做初始化操作。。。
[/Quote]
回复
hztj2005 2010-07-17
我直接在cview中动态创建了m_EditListCtrl,这样添加表头。
你把它创建到对话框就可以了。
CRect test2(400,0,600,678);
m_EditListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,test2,this,IDC_EDITLIST);

//把this换成对话框的句柄

m_EditListCtrl.InsertColumn(0,"词句",LVCFMT_LEFT,100,-1);//
m_EditListCtrl.InsertColumn(1,"性质 ",LVCFMT_LEFT,100,-1);
m_EditListCtrl.InsertColumn(2,"备注 ",LVCFMT_LEFT,100,-1);
//m_List-> InsertColumn(1, "姓名 ", LVCFMT_LEFT);

static struct
{
LPTSTR szCol1;
LPTSTR szCol2;
LPTSTR szCol3;
} rows [] = {
"A123456", "A234567", "A345678",
"B123456", "B234567", "B3345678",
"C123456", "C234567", "C3345678"
};
int item1;
//for (int iCurrRow = 0; iCurrRow < sizeof rows / sizeof rows[0]; iCurrRow++)
for (int iCurrRow = 0; iCurrRow < 3; iCurrRow++)
{
item1=m_EditListCtrl.InsertItem(iCurrRow, rows[iCurrRow].szCol1, 0);
m_EditListCtrl.SetItemText(item1, 1, rows[iCurrRow].szCol2);
m_EditListCtrl.SetItemText(item1, 2, rows[iCurrRow].szCol3);
}
回复
nffly11 2010-07-17
对啊 这个我知道,比武你新建一个对话框的工程,然后在Dlg类里面就能找到这个函数

但关键是 我的主程序是一个单文档,单文档上有一个对话框,对话框里面有个列表控件,这种情况下这个对话框类里面是没有OnInitDialog()这个函数的 你可以去试试

最后感谢你的回答

[Quote=引用 2 楼 muzizongheng 的回复:]

Dlg的初始化函数 就是OnInitDialog()啊。
[/Quote]
回复
hztj2005 2010-07-17
其实也简单:

首先你的“发邮件”对话框中不要手动画上“列表框”。

而在响应“发邮件”按钮的函数里,你肯定有一些代码,显示“发邮件”对话框,否则你的对话框如何出来?

你在之后,加上我上边所说的代码就可以了。
回复
nffly11 2010-07-16
谢谢,可是我的程序按照功能来就是设计成这样,单文档中的对话框里有个 列表控件
要不然程序的功能就失去意义了
[Quote=引用 1 楼 an_bachelor 的回复:]

建议去掉这个对话框 多此一举 又凭空多出1窗口 看着就不爽
你可以给View类加一个
CListCtrl m_lc;的成员
给View一个WM_CREATE的响应函数
比如

C/C++ code
int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStru……
[/Quote]
回复
Eleven 2010-07-16
View类直接再OnInitialUpdate 中做初始化操作。。。
回复
muzizongheng 2010-07-16
Dlg的初始化函数 就是OnInitDialog()啊。
回复
陈仲甫 2010-07-16
建议去掉这个对话框 多此一举 又凭空多出1窗口 看着就不爽
你可以给View类加一个
CListCtrl m_lc;的成员
给View一个WM_CREATE的响应函数
比如

int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
m_lc.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
CRect(10,10,400,200), this, 5243);

return 0;
}


如果OnInitialUpdate是重载的虚函数
也可以把m_lc.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS, CRect(10,10,400,200), this, 5243);放在这里

也可以在生成工程的时候 直接用CListViewCtrl
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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