父窗口监控CGridCtrl的消息

首先看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()

结果

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值