2016-05-16 164 views
-1

某些人可以告訴我一個如何使用LVM_SUBITEMHITTEST的示例嗎?LVM_SUBITEMHITTEST的示例

我試過下面的代碼,但SendMessage()myinfo的相關成員的返回值總是-1,無論我在ListView中的哪個位置單擊。

case NM_RCLICK: 
{ 
    NMITEMACTIVATE itemClicked = *(NMITEMACTIVATE*)lParam; 
    LVHITTESTINFO myinfo; 
    memset(&myinfo, 0, sizeof(myinfo)); 
    POINT cursorPos; 
    GetCursorPos(&cursorPos); 
    myinfo.pt = cursorPos; 
    // I find that itemNumber as well as myinfo->iItem and myinfo->iSubItem 
    // are always set to -1 by the following line 
    int itemNumber = SendMessage(myListviewHwnd, LVM_SUBITEMHITTEST, 0,(LPARAM)&myinfo); 
} 

我根據我的代碼從下面的MSDN文章:

NM_RCLICK (list view) notification code

LVM_SUBITEMHITTEST message

但他們並沒有列出任何的例子,所以我很擔心,我在做什麼一些愚蠢的東西:(

+2

'LVM_SUBITEMHITTEST'想要客戶端座標,您給它的屏幕座標。 –

+1

@Jnathan Potter謝謝,就是這樣。知道這將是一件愚蠢的事情。 – aquirdturtle

+0

@aquirdturtle如果你有你的問題的答案,寫一個答案,而不是用它更新你的問題。 –

回答

1

更新:我做了一些愚蠢的事情。LVM_SUBITEMHITTEST函數需要客戶端座標,而不是屏幕座標。這裏有一個工作示例:

case NM_RCLICK: 
{ 
    NMITEMACTIVATE itemClicked = *(NMITEMACTIVATE*)lParam; 
    LVHITTESTINFO myinfo; 
    memset(&myinfo, 0, sizeof(myinfo)); 
    POINT cursorPos; 
    GetCursorPos(&cursorPos); 
    ScreenToClient(myListviewHwnd, &cursorPos); 
    myinfo.pt = cursorPos; 
    int itemNumber = SendMessage(myListviewHwnd, LVM_SUBITEMHITTEST, 0, (LPARAM)&myinfo); 
} 
+1

根本不需要使用'GetCursorPos()'和'ScreenToClient()'。 'NM_RCLICK'通知給你客戶端發生點擊的座標,它們在'NMITEMACTIVATE :: ptAction'字段中:'*'POINT'結構,表示事件發生的位置,在客戶端座標系中。*「So你可以這樣做:'myinfo.pt = itemClicked-> ptAction;' –