
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;
}
或许楼下老兄说的正确,请问如何解决?帮帮忙
----------------------------------------
还是不行,有没有具体的代码或例子.谢谢.我提高悬赏 展开
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;
}
或许楼下老兄说的正确,请问如何解决?帮帮忙
----------------------------------------
还是不行,有没有具体的代码或例子.谢谢.我提高悬赏 展开
3个回答
展开全部
我是这么猜测的,未经测试,楼主自己调试看看吧。
当空间监听到键盘消息‘下’时,开始响应函数,此时光标并未移动,所以取得的数据时当前行。
当键盘响应函数完成时,mfc内部发送消息 将光标下移。
在用户看来,前2步会在一瞬间完成。就造成了光标下移,但数据确是上一行的现象。
----------------------------
更新数据的响应函数单用一个按钮来解决?
如果非要实现按‘下’后就立刻更新数据,试试响应‘下’ 弹起时响应。也许可以也许不可以- - 总之要试试。
要扯远点就每当按‘下’就建立一个临时线程,线程中随便sleep 1秒,然后获取当前选中的数据。
当空间监听到键盘消息‘下’时,开始响应函数,此时光标并未移动,所以取得的数据时当前行。
当键盘响应函数完成时,mfc内部发送消息 将光标下移。
在用户看来,前2步会在一瞬间完成。就造成了光标下移,但数据确是上一行的现象。
----------------------------
更新数据的响应函数单用一个按钮来解决?
如果非要实现按‘下’后就立刻更新数据,试试响应‘下’ 弹起时响应。也许可以也许不可以- - 总之要试试。
要扯远点就每当按‘下’就建立一个临时线程,线程中随便sleep 1秒,然后获取当前选中的数据。
展开全部
这样用:
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;
}
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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当然就是 cknight123 他说的都是在wnproce中处理 而光标是由系统处理的 在的defXXXXproce里面 当然一个在最后了 如果在wnproce中直接 RETURN 光标就不会下移 永远不会下移了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询