SetCurSel & GetCurSel不知为什么出错?

ghxmagic 2005-01-04 11:50:42
.h
afx_msg void OnEditupdateCmbdatetime();
-------------------------------------------------

.cpp
BEGIN_MESSAGE_MAP(CDlgPortLD, CDialog)
//{{AFX_MSG_MAP(CDlgPortLD)
ON_CBN_EDITUPDATE(IDC_CMBDATETIME, OnEditupdateCmbdatetime)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CDlgXX::OnEditupdateCmbdatetime()
{
m_CmbDateTime.SetCurSel(0);
}

void CDlgXX::OnButNarrow()
{
int nSelIndex = m_CmbDateTime.GetCurSel();
// ERROR, -1 return here ???
}
...全文
480 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老夏Max 2005-01-04
  • 打赏
  • 举报
回复
主要是控件初始化的时候,即控件创建的时候也可能调用了OnEditupdateCmbdatetime,但是此时控件没有创建,所以出错了。你最好使用一个标志位bFirst去除第一次对m_CmbDateTime.SetCurSel(0);的调用,例如:
if(bFirst)
{
bFisrt = FALSE;
}
else
{
m_CmbDateTime.SetCurSel(0);
}
ghxmagic 2005-01-04
  • 打赏
  • 举报
回复
窗体及组合框已经创建.

m_CmbDateTime :CComboBox映射变量
OnEditupdateCmbdatetime() ;组合框编辑消息
DentistryDoctor 2005-01-04
  • 打赏
  • 举报
回复
m_CmbDateTime.SetCurSel(0);
?
此时窗口尚未创建,SetCurSel当然不能成功。
ghxmagic 2005-01-04
  • 打赏
  • 举报
回复
问题已解决, 和各位好友共同分享.

原因CBN_EDITUPDATE消息响应函数OnEditupdateCmbdatetime是一个消息阻塞型处理函数.在里面调用SetCurSel(), 面SetCurSel()也是内部调用SendMessage发送CB_SETCURSEL消息, 这样SetCurSel()调用返回时, 在上一级的OnEditupdateCmbdatetime中把CB_SETCURSEL消息丢弃了.

修改方法:
void CDlgXX::OnEditupdateCmbdatetime()
{
m_CmbDateTime.SetCurSel(0);
}
->
void CDlgXX::OnEditupdateCmbdatetime()
{
m_CmbDateTime.SetCurSel(nSelIndex);
m_CmbDateTime.PostMessage(CB_SETCURSEL, (WPARAM)nSelIndex, 0);
}
再一次将CB_SETCURSEL消息追加到消息队列的末尾.这样就可以保证在OnEditupdateCmbdatetime处理结束时一定会再一次响应CB_SETCURSEL.

总结:
SendMessage MSG1调用中再次调用SendMessage MSG2, MSG1响应结束时, MSG2消息响应结果不被保留.

15,979

社区成员

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

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