Je souhaite afficher un menu contextuel lorsqu'un utilisateur clique avec le bouton droit sur un élément dans une CListCtrl. Mon code est le suivant:HitTest ne fonctionne pas comme prévu
void DatastoreDialog::OnContextMenu(CWnd *pWnd, CPoint pos)
{
// Find the rectangle around the list control
CRect rectMainArea;
m_itemList.GetWindowRect(&rectMainArea);
// Find out if the user right-clicked the list control
if(rectMainArea.PtInRect(pos))
{
LVHITTESTINFO hitTestInfo;
hitTestInfo.pt = pos;
hitTestInfo.flags = LVHT_ONITEM;
m_itemList.HitTest(&hitTestInfo);
if (hitTestInfo.flags & LVHT_NOWHERE)
{
// No item was clicked
}
else
{
MyContextHandler(hitTestInfo)
}
}
}
Lorsque je cours réellement le code, peu importe où je clique; sur un élément, dans un espace vide dans CListCtrl, n'importe où ailleurs dans la boîte de dialogue (en supprimant la première instruction if); hitTestInfo.flags
est mis à 48, ce qui, si je lis correctement this, signifie "Ci-dessous, et à droite de l'ensemble CListCtrl". Ce qui n'a pas vraiment de sens quand je vérifie d'abord si c'est dans la CListCtrl.
Est-ce que j'ai une supposition incorrecte quelque part? Est-ce que mon code est incorrect? Est-ce que je manque quelque chose?
En tant que peut-être liée, ou peut-être pas, BONUS QUESTION, à la fois LVHT_ONITEMSTATEICON
et LVHT_ABOVE
sont #define
d comme 0x08 - pourquoi est-ce? Cela peut être la clé de mon malentendu.
Merci beaucoup! Je vais aussi regarder dans la chose WM_RBUTTONDOWN - vous avez raison, cela provoque l'affichage incorrect du menu contextuel. – Smashery
Si seulement je pouvais vous voter deux fois :-) – Smashery
Le Pos passé dans OnContextMenu sera (-1, -1) je crois, dans le cas de Shift-F10 ou de la touche Menu dédiée. –