首先看GridCtrl.cpp源码里消息函数里是否调用了
SendMessageToParent(int nRow, int nCol, int nMessage)
比如你需要监控GridCtrl内的双击事件,则需要找到下面这个函数
void CGridCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TRACE0("CGridCtrl::OnLButtonDblClk\n");
CCellID cell = GetCellFromPt(point);
if( !IsValid( cell) )
{
//ASSERT(FALSE);
return;
}
// TRACE("CGridCtrl::OnLButtonDblClk 0x%08X\n",this->GetItemData(cell.row,0));
#ifdef _WIN32_WCE
if (MouseOverColumnResizeArea(point))
#else
if (m_MouseMode == MOUSE_OVER_COL_DIVIDE)
#endif
{
CPoint start;
if (!GetCellOrigin(0, cell.col, &start))
return;
if (point.x - start.x < m_nResizeCaptureRange) // Clicked right of border
cell.col--;
// ignore columns that are hidden and look left towards first visible column
BOOL bFoundVisible = FALSE;
while( cell.col >= 0)
{
if( GetColumnWidth( cell.col) > 0)
{
bFoundVisible = TRUE;
break;
}
cell.col--;
}
if( !bFoundVisible)
return;
AutoSizeColumn(cell.col, GetAutoSizeStyle());
Invalidate();
}
#ifdef _WIN32_WCE
else if (MouseOverRowResizeArea(point))
#else
else if (m_MouseMode == MOUSE_OVER_ROW_DIVIDE)
#endif
{
CPoint start;
if (!GetCellOrigin(0, cell.col, &start))
return;
if (point.y - start.y < m_nResizeCaptureRange) // Clicked below border
cell.row--;
// ignore rows that are hidden and look up towards first visible row
BOOL bFoundVisible = FALSE;
while( cell.row >= 0)
{
if( GetRowHeight( cell.row) > 0)
{
bFoundVisible = TRUE;
break;
}
cell.row--;
}
if( !bFoundVisible)
return;
AutoSizeRow(cell.row);
Invalidate();
}
else if (m_MouseMode == MOUSE_NOTHING)
{
CPoint pointClickedRel;
pointClickedRel = GetPointClicked( cell.row, cell.col, point);
CGridCellBase* pCell = NULL;
if (IsValid(cell))
pCell = GetCell(cell.row, cell.col);
// Clicked in the text area? Only then will cell selection work
BOOL bInTextArea = FALSE;
if (pCell)
{
CRect rectCell;
if (GetCellRect(cell.row, cell.col, rectCell) && pCell->GetTextRect(rectCell))
bInTextArea = rectCell.PtInRect(point);
}
if (cell.row >= m_nFixedRows && IsValid(m_LeftClickDownCell) &&
cell.col >= m_nFixedCols && bInTextArea)
{
OnEditCell(cell.row, cell.col, pointClickedRel, VK_LBUTTON);
}
else if (m_bListMode)
{
if (!IsValid(cell))
return;
if (cell.row >= m_nFixedRows && cell.col >= m_nFixedCols && bInTextArea)
OnEditCell(cell.row, cell.col, pointClickedRel, VK_LBUTTON);
}
if (IsValid(cell))
{
CGridCellBase* pCell = GetCell(cell.row, cell.col);
if (pCell)
pCell->OnDblClick(pointClickedRel);
SendMessageToParent(cell.row, cell.col, NM_DBLCLK);
}
}
CWnd::OnLButtonDblClk(nFlags, point);
}
可以看到函数里调用了 SendMessageToParent(cell.row, cell.col, NM_DBLCLK);
下一步在父窗口添加响应函数
void CMyDlg::OnNotifyGridCtrlLDoubleClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNMHDR;//此item为双击的item
}
然后在消息列表里增加
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_NOTIFY(NM_DBLCLK, IDC_CUSTOM_HISTORY_GRID, &CMyDlg::OnNotifyGridCtrlLDoubleClick)
END_MESSAGE_MAP()
GridCtrl.cpp里实现的消息函数大部分都调用了SendMessageToParent(int nRow, int nCol, int nMessage),也有没调用的。比如
void CGridCtrl::OnVScroll(UINT nSBCode, UINT /*nPos*/, CScrollBar* /*pScrollBar*/)
我想监控这个消息的话只需要在函数内调用SendMessageToParent
然后在父窗口增加响应函数,在消息列表注册消息
void CMyDlg::OnNotifyGridCtrlVScroll(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNMHDR;
//item 为 最顶部非固定行或列第一个cell指针
TRACE("pItem->iRow=%d,pItem->iColumn=%d\n",pItem->iRow,pItem->iColumn );
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_NOTIFY(NM_DBLCLK, IDC_CUSTOM_HISTORY_GRID, &CMyDlg::OnNotifyGridCtrlVScroll)
END_MESSAGE_MAP()
结果