vc/mfc listcontrol响应键盘上下键问题

在使用listcontr控件的响应键盘上下键时,总是出现滞后的现象:比如我现在光标已经选择了第二行,而得到的数据确是第一行,然后再按上下键的"下",光标到了第三行,而得到... 在使用listcontr控件的响应键盘上下键时,总是出现滞后的现象:比如我现在光标已经选择了第二行,而得到的数据确是第一行,然后再按上下键的"下",光标到了第三行,而得到的数据是第二行,如此类推.求高人帮我解决.我贴上代码:
void CDialog1::OnKeydownListXueyuan1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
POSITION pos=m_ListXueyuan.GetFirstSelectedItemPosition();
m_selCur=m_ListXueyuan.GetNextSelectedItem(pos);
CString strItem[9];
if (m_ListXueyuan.GetSelectedCount()==1){
for (int i=0;i<9;i++)
{
strItem[i]=m_ListXueyuan.GetItemText(m_selCur,i);
GetDlgItem(1034+i)->SetWindowText(strItem[i]);
}}//获得选择列的数据并显示到栏目上
if(m_selCur>-1)
this->EnableButton(true);
else
this->EnableButton(false);
*pResult = 0;
}
或许楼下老兄说的正确,请问如何解决?帮帮忙
----------------------------------------
还是不行,有没有具体的代码或例子.谢谢.我提高悬赏
展开
 我来答
cknight123
2010-01-27 · TA获得超过964个赞
知道小有建树答主
回答量:532
采纳率:0%
帮助的人:601万
展开全部
我是这么猜测的,未经测试,楼主自己调试看看吧。

当空间监听到键盘消息‘下’时,开始响应函数,此时光标并未移动,所以取得的数据时当前行。

当键盘响应函数完成时,mfc内部发送消息 将光标下移。

在用户看来,前2步会在一瞬间完成。就造成了光标下移,但数据确是上一行的现象。
----------------------------
更新数据的响应函数单用一个按钮来解决?
如果非要实现按‘下’后就立刻更新数据,试试响应‘下’ 弹起时响应。也许可以也许不可以- - 总之要试试。

要扯远点就每当按‘下’就建立一个临时线程,线程中随便sleep 1秒,然后获取当前选中的数据。
魔高丈
2010-01-28 · TA获得超过9506个赞
知道大有可为答主
回答量:2066
采纳率:0%
帮助的人:3524万
展开全部
这样用:

UINT DelayLoop( LPVOID pParam );

void CDialog1::OnKeydownListXueyuan1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;

//启动延时线程
AfxBeginThread(DelayLoop, this);

}

//按下方向键后更新显示内容
void CDialog1::KeydownUpdate()
{
POSITION pos=m_ListXueyuan.GetFirstSelectedItemPosition();
m_selCur=m_ListXueyuan.GetNextSelectedItem(pos);
CString strItem[9];
if (m_ListXueyuan.GetSelectedCount()==1){
for (int i=0;i<9;i++)
{
strItem[i]=m_ListXueyuan.GetItemText(m_selCur,i);
GetDlgItem(1034+i)->SetWindowText(strItem[i]);
}}//获得选择列的数据并显示到栏目上
if(m_selCur>-1)
this->EnableButton(true);
else
this->EnableButton(false);
}

//延时线程
UINT DelayLoop( LPVOID pParam )
{
CDialog1 *pDlg = (CDialog1 *)pParam ;

//延时50毫秒
Sleep(50);
pDlg->KeydownUpdate();

return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
109117198lsm
2010-01-27 · TA获得超过560个赞
知道小有建树答主
回答量:184
采纳率:0%
帮助的人:86.4万
展开全部
当然就是 cknight123 他说的都是在wnproce中处理 而光标是由系统处理的 在的defXXXXproce里面 当然一个在最后了 如果在wnproce中直接 RETURN 光标就不会下移 永远不会下移了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式