处理NM_DBLCLK消息 NMLISTVIEW *pItem = (NMLISTVIEW *)pNotifyStruct;
pItem->iItem; //就是你双击的项目的Index
pItem->iItem; //就是你双击的项目的Index
解决方案 »
- vc,mfc单文档中如何实现当鼠标移动到相关位置时,自动显示出相关说明
- 如何设置多次写串口的优先级
- 请问打基础重要吗?如果未来想主要利用高级语言开发软件 有必要打一些底层的基础吗?请高手指点迷津
- VC中如何得到SQL语句的返回值
- 好好的数怎么就变了,在线急等
- 兄弟们看看印度人现在在学什么啊,我们报着VC不放是不是真的危险啊,哎
- 请问,在win98下,怎样让运行的win32 console application 程序不出现在任务栏中?多谢!
- MFC的问题
- 论坛里怎么进行多个关键词搜索阿? 搞不懂:(
- 关于VCI Formula One Workbook
- 有什么学windows编程的好书吗?(介绍api和底层机制)
- 求教函数地址做参数的用法
void CParamListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CString str;
LVHITTESTINFO lvhti;
// Clear the subitem text the user clicked on.
lvhti.pt = point;
SubItemHitTest(&lvhti);
if (lvhti.flags & LVHT_ONITEMLABEL)
{
int m=lvhti.iItem;
int n=lvhti.iSubItem;
str=GetItemText(lvhti.iItem, lvhti.iSubItem);
}
AfxMessageBox(str);
//str=GetItemText(m,n);
CListCtrl::OnLButtonDblClk(nFlags, point);
}
上面这种方法是可行的
用NM_DBLCLK消息不好取值
pItem->iItem; //就是你双击的项目的Index
你的错误在于没有理解 GetItem 这个函数的用法
用这个函数以前一定要先将 LVITEM 的一部分结构填充了才可以得到正确的值
应该这样用(你必须指定你要读的 item 及 subitem 以及你要读取的内容)int selected = m_ListView.GetNextItem( -1 , LVNI_SELECTED | LVNI_ALL );
if(selected != -1)
{
LV_ITEM lvi;
char text[MAXTEXT];
lvi.iItem = selected;
lvi.pszText = text;
lvi.iSubItem = 0;// modify this for any subitem you want read.
lvi.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE | LVIF_TEXT;
lvi.stateMask = LVIS_CUT | LVIS_DROPHILITED |
LVIS_FOCUSED | LVIS_SELECTED |
LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK;
GetItem(&lvi);
}如果你没法确定 item 的最大字符数,就应该把上面的 lvi.mask 中的 LVIF_TEXT
去掉,这样读内容
CString tempstr = GetItemText(selected,0);
单独用 GetItemText 读取字符串int selected = m_ListView.GetNextItem( -1 , LVNI_SELECTED ¦ LVNI_ALL );
if(selected != -1)
{
LV_ITEM lvi;
char text[MAXTEXT];
lvi.iItem = selected;
lvi.pszText = text;
lvi.iSubItem = 0;// modify this for any subitem you want read.
lvi.mask = LVIF_IMAGE ¦ LVIF_PARAM ¦ LVIF_STATE;
lvi.stateMask = LVIS_CUT ¦ LVIS_DROPHILITED ¦
LVIS_FOCUSED ¦ LVIS_SELECTED ¦
LVIS_OVERLAYMASK ¦ LVIS_STATEIMAGEMASK;
m_ListView.GetItem(&lvi);
CString tempstr;
DWORD data;
tempstr = m_ListView.GetItemText(m_iItemDrag,0);
data = m_ListView.GetItemData(m_iItemDrag);
}
{
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL);POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = pList->GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
}
如果你一定要这样用就可以检查返回的 lvi
如果 lvi.state & LVIS_SELECTED == TRUE
则该项被选中,你必须循环测试每一项
GetCursorPos(...)
if(rc.PtInRect(...))
{
.....
}
if(selected != -1)
{
CString tempstr;
DWORD data; LV_ITEM lvi;
lvi.iItem = selected;
lvi.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvi.stateMask = LVIS_CUT | LVIS_DROPHILITED |
LVIS_FOCUSED | LVIS_SELECTED |
LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK;
int columncount = ((CHeaderCtrl*)m_ListView.GetHeaderCtrl())->GetItemCount();
for(int i = 0 ; i < columncount ; i++)
{
lvi.iSubItem = i;
m_ListView.GetItem(&lvi);
if(lvi.state & LVNI_SELECTED)
{
tempstr = m_ListView.GetItemText(m_iItemDrag,0);
data = m_ListView.GetItemData(m_iItemDrag);
break;
}
}
}
先lvhti.pt=point;
然后SubItemHitTest(lvhti);
int n=lvhti.iSubItem;
n就是被选中项的iSubItem.