双击消息的结构
NMHDR nmh; nmh.code = CUSTOM_SELCHANGE; // Message type defined by control. nmh.idFrom = GetDlgCtrlID(m_controlHwnd); nmh.hwndFrom = m_controlHwnd; SendMessage(GetParent(m_controlHwnd), WM_NOTIFY, (WPARAM)m_controlHwnd, (LPARAM)&nmh);
子控件向父窗口发送WM_NOTIFY消息
父窗口响应函数分为两种方法:
1:添加ON_NOTIFY_RANGE(NM_CLICK, IDC_X,IDC_X+100, OnClick×)消息,
响应函数:void CView::OnDblclkX(NMHDR* pNMHDR, LRESULT* pResult)
2:添加OnNotify函数
BOOL CView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
根据实际情况决定是否应该调用基类的响应函数
第一种方法是第二种方法的高级封装;
微软的封装形式:
BOOL CWnd::OnNotify(WPARAM, LPARAM lParam, LRESULT* pResult)
{ ASSERT(pResult != NULL); NMHDR* pNMHDR = (NMHDR*)lParam; HWND hWndCtrl = pNMHDR->hwndFrom; // get the child ID from the window itself UINT nID = _AfxGetDlgCtrlID(hWndCtrl); int nCode = pNMHDR->code; ASSERT(hWndCtrl != NULL); ASSERT(::IsWindow(hWndCtrl)); if (_afxThreadState->m_hLockoutNotifyWindow == m_hWnd) return TRUE; // locked out - ignore control notification // reflect notification to child window control if (ReflectLastMsg(hWndCtrl, pResult)) return TRUE; // eaten by child AFX_NOTIFY notify; notify.pResult = pResult; notify.pNMHDR = pNMHDR; return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY), ¬ify, NULL); }