热情软件屋

 

ListCtrl控件,如何确定被点击单元的Item和subItem


编号:QA004058
建立日期: 2001年3月29日 最后修改日期:2003年11月30日
所属类别:

hua:
    操作系统: win2000 svr
    编程工具: vc6
    问题: Report风格的ListCtrl控件,当鼠标点击时,如何确定被点击单元的Item和subItem?
    水平: 中级

回答:

    你可以使用HitTest方法知道用户点击的是哪个条目。下面是kailoon提供的代码:
    
    void CListCtrlDlg::OnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult)
    
{
    
// TODO: Add your control notification handler code here
    
POINT pt;
    
    
int j;
    
GetCursorPos(&pt);
    
CRect rect;
    
m_listCtrl.GetWindowRect(rect);
    
pt.x-=rect.left;
    
pt.y-=rect.top;
    
i=m_listCtrl.HitTestEx(CPoint(pt),&j);
    
*pResult = 0;
    
}
    
    

    yeliang的意见:
    用 HitTest的时候需要给定条目的点的位置,不是很方便,而用另外一个函数GetItemState会更好一点具体实现如下:
    int n,n0,n1;
    
n0=m_copyList.GetTopIndex();
    
n1=m_copyList.GetItemCount();
    
n1+=n0;
    
for(n=n0;n<=n1;n++)
    
{
    
if(m_copyList.GetItemState(n,LVIS_SELECTED)==LVIS_SELECTED)
    
index=n;
    
}
    

    
    小王的意见:
    可以这样
     CString name;
    
int i;
    
int iItem=m_nList.GetNextItem(-1,LVNI_SELECTED);
    
name=m_m_nList.GetItemText(iItem,i);
    

    其中 name即为选中第i列的值。
    
    jmpinto的意见:
    POSITION pos;
    
CRect rect;
    
int iItem;
    
int iSubItem;
    
iItem=m_nList.GetNextItem(-1,LVNI_SELECTED);
    
POINT pt;
    
GetCursorPos(&pt);
    
GetWindowRect(rect);
    
pt.x-=rect.left;
    
pt.y-=rect.top;
    
    
for ( int i=0, j=0; ; i++)
    
{
    
j+=GetColumnWidth(i);
    
if ( pt.x < j )
    
break;
    
}
    
    
iSubItem = i;
    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, Windows 9x控件, listview, treeview, monthview, progress bar

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio