CListCtrl NM_CLICK kann man da an NM_MOUSE heran?
-
ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1) void CTest001Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { CString str; str.Format("Code: %i IdFrom: %i FensterFrom: %i", pNMHDR->code, pNMHDR->idFrom, pNMHDR->hwndFrom); MessageBox(str); *pResult = 0; }Kann man über die Nachricht NM_CLICK an weitere Infos kommen außer an diese in NMHDR, z.B. an die NMMOUSE Struktur? Was kann man mit pResult anfangen außer auf 0 setzen?
Auszug aus commctrl.h:
typedef NMMOUSE NMCLICK; typedef struct tagNMMOUSE { NMHDR hdr; DWORD dwItemSpec; DWORD dwItemData; POINT pt; DWORD dwHitInfo; // any specifics about where on the item or control the mouse is } NMMOUSE, FAR* LPNMMOUSE; #define NM_FIRST (0U- 0U) // generic to all controls #define NM_LAST (0U- 99U) //====== Generic WM_NOTIFY notification codes ================================= #define NM_OUTOFMEMORY (NM_FIRST-1) #define NM_CLICK (NM_FIRST-2) // uses NMCLICK struct #define NM_DBLCLK (NM_FIRST-3) #define NM_RETURN (NM_FIRST-4) #define NM_RCLICK (NM_FIRST-5) // uses NMCLICK struct #define NM_RDBLCLK (NM_FIRST-6) #define NM_SETFOCUS (NM_FIRST-7) #define NM_KILLFOCUS (NM_FIRST-8) #if (_WIN32_IE >= 0x0300) #define NM_CUSTOMDRAW (NM_FIRST-12) #define NM_HOVER (NM_FIRST-13) #endif #if (_WIN32_IE >= 0x0400) #define NM_NCHITTEST (NM_FIRST-14) // uses NMMOUSE struct #define NM_KEYDOWN (NM_FIRST-15) // uses NMKEY struct #define NM_RELEASEDCAPTURE (NM_FIRST-16) #define NM_SETCURSOR (NM_FIRST-17) // uses NMMOUSE struct #define NM_CHAR (NM_FIRST-18) // uses NMCHAR struct #endif #ifndef CCSIZEOF_STRUCT #define CCSIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) #endif #if (_WIN32_IE >= 0x0400) //====== Generic WM_NOTIFY notification structures ============================Wie komme ich an das pt in NM_MOUSE?
-
Durch einen cast
NMCLICK *pnmClick = (NMCLICK*)pNMHDR;
Aber Du kommst auch per GetMessagePos an die Cursor Position der Maus ran.
-
Befindet sich NMHDR und NMCLICK an der gleichen Adresse?
-
BOOL CLVCDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if( wParam == IDC_LIST1 && ((NMHDR*)lParam)->code == NM_CLICK)
{
static int i = 0;
i++;
CString str;
str.Format("%i %i",((NMCLICK*)lParam)->pt.x, ((NMCLICK*)lParam)->pt.y);
m_List2.InsertItem(i,str);
}return CDialog::OnNotify(wParam, lParam, pResult);
}Ergibt 0 und 1031 egal, wohin in IDC_LIST1 geklickt wird. Warum?
...->dwHitInfo funktioniert z.B.
-
BOOL CLVCDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if( wParam == IDC_LIST1 && ((NMHDR*)lParam)->code == NM_CLICK)
{
static int i = 0;
i++;
CString str;
str.Format("%i %i",((NMCLICK*)lParam)->pt.x, ((NMCLICK*)lParam)->pt.y);
m_List2.InsertItem(i,str);
}return CDialog::OnNotify(wParam, lParam, pResult);
}Ergibt 0 und 1031 egal, wohin in IDC_LIST1 geklickt wird. Warum?
...->dwHitInfo funktioniert z.B.
-
..
-
void CListCtrlDemoDlg::OnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { CPoint point; ::GetCursorPos(&point); CString str; str.Format(_T("OnClickListCtrl. Cursor position is x: %d, y: %d"), point.x, point.y); m_Log.AppendString(str); *pResult = 0; }Das ist die Variante mit
::GetCursorPos(...)Hier allerdings nicht auf das Listenelement, sondern auf den Dialog bezogen,
aus: http://www.codeproject.com/listctrl/listctrldemo.asp