2016-05-16 14 views
-1

Kann mir eine nette Person ein Beispiel für die Verwendung von LVM_SUBITEMHITTEST zeigen?Beispiel für LVM_SUBITEMHITTEST

Ich habe den folgenden Code versucht, aber sowohl der Rückgabewert von SendMessage() und die relevanten Mitglieder von myinfo sind immer -1, egal wo in meinem ListView ich klicke.

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); 
} 

I basierend meinen Code aus Artikel der folgenden MSDN:

NM_RCLICK (list view) notification code

LVM_SUBITEMHITTEST message

Aber sie Liste keine Beispiele, so dass ich mir Sorgen mache ich etwas dummes :(

+2

'LVM_SUBITEMHITTEST' will Client-Koordinaten, geben Sie ihm Bildschirmkoordinaten. –

+1

@Jnathan Potter Danke, das war es. Wusste, dass es etwas Dummes sein würde. – aquirdturtle

+0

@aquirdturtle Wenn Sie eine Antwort auf Ihre Frage haben, schreiben Sie eine Antwort, anstatt Ihre Frage damit zu aktualisieren. –

Antwort

1

Update: Ich habe etwas Dummes getan. Die LVM_SUBITEMHITTEST Funktion will Client-Koordinaten, nicht Bildschirm Koordinaten. Hier ist ein Arbeitsbeispiel:

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

Sie müssen 'GetCursorPos()' und 'ScreenToClient()' überhaupt nicht verwenden. Die 'NM_RCLICK'-Benachrichtigung gibt Ihnen die Client-Koordinaten, an denen der Klick erfolgte, sie befinden sich im' NMITEMACTIVATE :: ptAction'-Feld: "*' POINT'-Struktur, die den Ort angibt, an dem das Ereignis aufgetreten ist, in Client-Koordinaten. * "So Sie können dies stattdessen tun: 'myinfo.pt = itemClicked-> ptAction;' –