ListCtrl 的选择可见有关问题
ListCtrl 的选择可见问题
void CTestDialog::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
LPNMLISTVIEW pNMLV = reinterpret_cast <LPNMLISTVIEW> (pNMHDR);
int nItem = pNMLV-> iItem;
//如果选中了零件列表的一行,则显示此零件图形
if( nItem < 0 )
nItem = 0;
this-> m_ListPartInfo.EnsureVisible(nItem,FALSE);
this-> m_ListPartInfo.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
*pResult = 0;
}
void CTestDialog::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
// LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast <LPNMLVKEYDOWN> (pNMHDR);
// TODO: 在此添加控件通知处理程序代码
UINT uSelectedCount = this-> m_ListPartInfo.GetSelectedCount();
int nItem = -1;
if( uSelectedCount == 1 )
{
nItem = this-> m_ListPartInfo.GetNextItem(nItem, LVNI_SELECTED);
this-> m_ListPartInfo.SetItemState(nItem,0, LVIS_SELECTED);
}
bool bSendClickMsg = false;
switch( pLVKeyDow-> wVKey )
{
case VK_DOWN:
{
if( nItem <= -1 )
{
nItem = 0;
}
else
nItem++;
if( nItem == this-> m_ListPartInfo.GetItemCount() )
nItem = 0;
bSendClickMsg = true;
}
break;
case VK_UP:
{
if( nItem > 0 )
nItem--;
else if( nItem == 0 )
{
nItem = this-> m_ListPartInfo.GetItemCount() - 1;
}
else
{
nItem = 0;
}
bSendClickMsg = true;
}
break;
default:
break;
}
if( bSendClickMsg )
{
NMHDR nh;
nh.hwndFrom = this-> m_ListPartInfo.m_hWnd;
nh.idFrom = this-> m_ListPartInfo.GetDlgCtrlID();;
nh.code = 0xfffffffe;
NMLISTVIEW pNMLV;
pNMLV.hdr = nh;
pNMLV.iItem = nItem;
SendMessage(WM_NOTIFY, NM_CLICK, (LPARAM)&pNMLV);
}
*pResult = 0;
}
ListCtrl中有180行数据
------------------------
首先 选择第1行
然后按Up键,可以让第180行可见并选中,继续Up一次
然后使用Down键则直接使第2行可见并选中
过程反过来也是如此
这个为什么?
如何解决?
---------------
在线等
------解决方案--------------------
你用的是PAGE UP和PAGEDN吗?
如果是这个你消息函数 如:
BOOL CDlgInfo::PreTranslateMessage(MSG* pMsg)
{
if(pMsg-> message ==WM_KEYDOWN)
{
if(pMsg-> wParam == VK_DOWN)
{
int nItem =0;
nItem = m_ListPartInfo.GetSelectMake();
if( nItem < 0 )
nItem = 0;
void CTestDialog::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
LPNMLISTVIEW pNMLV = reinterpret_cast <LPNMLISTVIEW> (pNMHDR);
int nItem = pNMLV-> iItem;
//如果选中了零件列表的一行,则显示此零件图形
if( nItem < 0 )
nItem = 0;
this-> m_ListPartInfo.EnsureVisible(nItem,FALSE);
this-> m_ListPartInfo.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
*pResult = 0;
}
void CTestDialog::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
// LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast <LPNMLVKEYDOWN> (pNMHDR);
// TODO: 在此添加控件通知处理程序代码
UINT uSelectedCount = this-> m_ListPartInfo.GetSelectedCount();
int nItem = -1;
if( uSelectedCount == 1 )
{
nItem = this-> m_ListPartInfo.GetNextItem(nItem, LVNI_SELECTED);
this-> m_ListPartInfo.SetItemState(nItem,0, LVIS_SELECTED);
}
bool bSendClickMsg = false;
switch( pLVKeyDow-> wVKey )
{
case VK_DOWN:
{
if( nItem <= -1 )
{
nItem = 0;
}
else
nItem++;
if( nItem == this-> m_ListPartInfo.GetItemCount() )
nItem = 0;
bSendClickMsg = true;
}
break;
case VK_UP:
{
if( nItem > 0 )
nItem--;
else if( nItem == 0 )
{
nItem = this-> m_ListPartInfo.GetItemCount() - 1;
}
else
{
nItem = 0;
}
bSendClickMsg = true;
}
break;
default:
break;
}
if( bSendClickMsg )
{
NMHDR nh;
nh.hwndFrom = this-> m_ListPartInfo.m_hWnd;
nh.idFrom = this-> m_ListPartInfo.GetDlgCtrlID();;
nh.code = 0xfffffffe;
NMLISTVIEW pNMLV;
pNMLV.hdr = nh;
pNMLV.iItem = nItem;
SendMessage(WM_NOTIFY, NM_CLICK, (LPARAM)&pNMLV);
}
*pResult = 0;
}
ListCtrl中有180行数据
------------------------
首先 选择第1行
然后按Up键,可以让第180行可见并选中,继续Up一次
然后使用Down键则直接使第2行可见并选中
过程反过来也是如此
这个为什么?
如何解决?
---------------
在线等
------解决方案--------------------
你用的是PAGE UP和PAGEDN吗?
如果是这个你消息函数 如:
BOOL CDlgInfo::PreTranslateMessage(MSG* pMsg)
{
if(pMsg-> message ==WM_KEYDOWN)
{
if(pMsg-> wParam == VK_DOWN)
{
int nItem =0;
nItem = m_ListPartInfo.GetSelectMake();
if( nItem < 0 )
nItem = 0;