关于在Dialog中添加ComboBox控件的问题

BeginnerCpp 2005-02-01 05:46:59
使用VS2003中的VC+MFC,
在VC的资源编辑器中创建一个对话框,对话框中添加一个ComboBox控件,
然后选中ComboBox控件,鼠标右键,添加一个变量m_comboboxForSort,类型是CComboBox.

接着,在对话框中调用comboboxForSort,发现几乎是100%会运行时候系统提示错误,
比如下面的代码:
BOOL CDialogNew::OnInitDialog()
{
CItem* pitemold;
for( POSITION pos = m_pitemlisOld->GetHeadPosition(); pos != NULL; )
{
pitemold = m_pitemlisOld->GetNext(pos);
CString stroldsort = pitemold->GetPItemRootName();

//m_comboboxForSort.AddString(stroldsort.GetBuffer());
TRACE("In BOOL CDialogNew::OnInitDialog(), add %s\n", stroldsort );
}

return CDialog::OnInitDialog();
}

//m_comboboxForSort.AddString(stroldsort.GetBuffer());这句调用必须注释掉,
要不然就会运行时候出错,
不要怀疑其它部分代码,经过TRACE观察,是正常的.
...全文
336 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumjohn 2005-02-05
  • 打赏
  • 举报
回复
挂个号
呵呵
BeginnerCpp 2005-02-04
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3765/3765153.xml?temp=.8064234
谢谢上面的回复,又学到一些东西了.
结贴,散分
chuanke 2005-02-03
  • 打赏
  • 举报
回复
汉!怎么已经来过了呢?汉.....
chuanke 2005-02-03
  • 打赏
  • 举报
回复
m_comboboxForSort.AddString(stroldsort.GetBuffer(0));
chuanke 2005-02-03
  • 打赏
  • 举报
回复
说完了
legendhui 2005-02-02
  • 打赏
  • 举报
回复
up
koko1998 2005-02-02
  • 打赏
  • 举报
回复
楼上正解

也可以写成
m_comboboxForSort.AddString(stroldsort.GetBuffer(0));
zhanghk 2005-02-02
  • 打赏
  • 举报
回复
up happyparrot(快乐鹦鹉)
快乐鹦鹉 2005-02-02
  • 打赏
  • 举报
回复
你的错误很简单,因为你将return CDialog::OnInitDialog()写在了最后。应该如下:
BOOL CDialogNew::OnInitDialog()
{
CDialog::OnInitDialog();//基类调用放在第一句!这样才能正确创建各个控件!
CItem* pitemold;
for( POSITION pos = m_pitemlisOld->GetHeadPosition(); pos != NULL; )
{
pitemold = m_pitemlisOld->GetNext(pos);
CString stroldsort = pitemold->GetPItemRootName();

//m_comboboxForSort.AddString(stroldsort.GetBuffer());
TRACE("In BOOL CDialogNew::OnInitDialog(), add %s\n", stroldsort );
}

return TRUE;
}
必须首先调用基类的初始化,然后才能正确使用对话框中的各个控件!
hongtog 2005-02-02
  • 打赏
  • 举报
回复
应该不是控件的问题..
检查一下Combox属性..
Owner Draw: NO.

快乐鹦鹉 2005-02-02
  • 打赏
  • 举报
回复
m_comboboxForSort.AddString(stroldsort.GetBuffer());
为什么要这样呢?
m_comboboxForSort.AddString(stroldsort);不就可以了么
  • 打赏
  • 举报
回复
添加一行ReleaseBuffer,GetBuffer后一定要ReleaseBuffer

CString stroldsort = pitemold->GetPItemRootName();
m_comboboxForSort.AddString(stroldsort.GetBuffer());
stroldsort.ReleaseBuffer();


BeginnerCpp 2005-02-01
  • 打赏
  • 举报
回复
上面的代码有点小小的问题,
更新的代码如下:

BOOL CDialogNew::OnInitDialog()
{
CItem* pitemold;
for( POSITION pos = m_pitemlisOld->GetHeadPosition(); pos != NULL; )
{
pitemold = m_pitemlisOld->GetNext(pos);
CString stroldsort = pitemold->GetPItemRootName();

//m_comboboxForSort.AddString(stroldsort.GetBuffer());
TRACE("In BOOL CDialogNew::OnInitDialog(), add %s\n", stroldsort );
}

CComboBox* pcomboboxSort = (CComboBox*)this->GetDlgItem(IDC_DLGNEW_COMBO_SORT);
TRACE("In BOOL CDialogNew::OnInitDialog(), pcomboboxSort is : %i\n", (int)pcomboboxSort );
TRACE("In BOOL CDialogNew::OnInitDialog(), pcomboboxSort'Hwnd is : %i\n", (int)pcomboboxSort->GetSafeHwnd() );
TRACE("In BOOL CDialogNew::OnInitDialog(), m_comboboxForSort is : %i\n", (int)(m_comboboxForSort.GetSafeHwnd()) );
pcomboboxSort->InitStorage(256, 10);
pcomboboxSort->AddString("test");
//m_comboboxForSort.AddString("test1");

return CDialog::OnInitDialog();
}

程序的输出信息是:
In BOOL CDialogNew::OnInitDialog(), pcomboboxSort is : 3645484
In BOOL CDialogNew::OnInitDialog(), pcomboboxSort'Hwnd is : 658288
In BOOL CDialogNew::OnInitDialog(), m_comboboxForSort is : 0

呵呵,
头大啊,SOS SOS
BeginnerCpp 2005-02-01
  • 打赏
  • 举报
回复
最后,
这样的代码产生了:

BOOL CDialogNew::OnInitDialog()
{
CItem* pitemold;
for( POSITION pos = m_pitemlisOld->GetHeadPosition(); pos != NULL; )
{
pitemold = m_pitemlisOld->GetNext(pos);
CString stroldsort = pitemold->GetPItemRootName();

//m_comboboxForSort.AddString(stroldsort.GetBuffer());
TRACE("In BOOL CDialogNew::OnInitDialog(), add %s\n", stroldsort );
}

CComboBox* pcomboboxSort = (CComboBox*)this->GetDlgItem(IDC_DLGNEW_COMBO_SORT);
TRACE("In BOOL CDialogNew::OnInitDialog(), pcomboboxSort is : %i\n", (int)pcomboboxSort );
TRACE("In BOOL CDialogNew::OnInitDialog(), m_comboboxForSort is : %i\n", (int)(m_comboboxForSort.GetSafeHwnd()) );
pcomboboxSort->InitStorage(256, 10);
pcomboboxSort->AddString("test");
//m_comboboxForSort.AddString("test1");

return CDialog::OnInitDialog();
}

程序在调试模式下,
输出窗口上有这样信息:
In BOOL CDialogNew::OnInitDialog(), pcomboboxSort is : 3645484
In BOOL CDialogNew::OnInitDialog(), m_comboboxForSort is : 0

很奇怪,
pcomboboxSort 和 m_comboboxForSort 对应同一个控件ID,
为什么他们的结果会这样呢?

请看:
http://community.csdn.net/Expert/topic/3765/3765153.xml?temp=.288006
其实是同一个问题,
谁能给出思路来,
2个帖子的分一起散给他.
BeginnerCpp 2005-02-01
  • 打赏
  • 举报
回复
然后怀疑是m_comboboxForSort它没有被创建,
有了下面的代码:
BOOL CDialogNew::OnInitDialog()
{
CItem* pitemold;
for( POSITION pos = m_pitemlisOld->GetHeadPosition(); pos != NULL; )
{
pitemold = m_pitemlisOld->GetNext(pos);
CString stroldsort = pitemold->GetPItemRootName();

//m_comboboxForSort.AddString(stroldsort.GetBuffer());
TRACE("In BOOL CDialogNew::OnInitDialog(), add %s\n", stroldsort );
}

CComboBox* pcomboboxSort = (CComboBox*)this->GetDlgItem(IDC_DLGNEW_COMBO_SORT);
TRACE("In BOOL CDialogNew::OnInitDialog(), pcomboboxSort is : %i\n", (int)pcomboboxSort );
pcomboboxSort->InitStorage(256, 10);
pcomboboxSort->AddString("test");

return CDialog::OnInitDialog();
}

结果就不会运行时候出错,其中IDC_DLGNEW_COMBO_SORT就是对话框上面ComboBox的控件ID,
但是,在对话框上面,还是空空如己,没有任何内容,很奇怪?

15,980

社区成员

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

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