我一开始想用WindowProc或者OnWndMsg函数让它的子窗口来处理这个消息,但是我发现这两个函数都是受保护的函数,无法访问。于是我用了AfxCallWndProc这个函数,但是我发现AfxCallWndProc的返回值不能判断它的子窗口是否处理了该消息,而且为什么AfxCallWndProc能访问调用WindowProc和OnWndMsg这两个受保护的成员呢?后来我又用SendMessage来让子窗口处理该消息,但是还是不能判断子窗口是否处理了该消息

解决方案 »

  1.   


    不行,只有OnWndMsg函数的返回值才能判断,但是这个函数受保护,没法调用它,其它函数都不能判断
      

  2.   

    你这个问题,根本不需要重写PreTranslateMessage只要重写OnWndMsg,如果,是滚轮消息则送到子窗口处理,子窗口如果处理,子窗口返回True,其它消息调用基类的OnWndMsg
      

  3.   


    不行,只有OnWndMsg函数的返回值才能判断,但是这个函数受保护,没法调用它,其它函数都不能判断
    重载OnWndMsg
      

  4.   


    我该怎么重写OnWndMsg函数呢?请您详细说一下吧
      

  5.   


    不行,只有OnWndMsg函数的返回值才能判断,但是这个函数受保护,没法调用它,其它函数都不能判断
    重载OnWndMsg
    我该怎么重写OnWndMsg函数呢?请您详细说一下吧 
      

  6.   

    左侧选择类视图,点选你的视图类,然后点击右侧如图上面绿色的按钮,下拉onwndmsg重载
      

  7.   


    难道你是让我的CFormViewEx类重载这个函数吗?但是重载后,这个函数该怎么写呢?
      

  8.   

    哎呀,你这个连OnWndMsg都不需要重写,重写
    afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
    {
    for(遍历子窗口)
    {
    if(pChild->SendMessage(...)) return TRUE;
    pChild=下一个;
    }
    };
      

  9.   


    BOOL CFormViewEx::PreTranslateMessage( MSG* pMsg )
    {
    if (pMsg->message == WM_MOUSEWHEEL)
    {
    CWnd* pWnd = GetFocus();
    BOOL bResult = pWnd->SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
    if (bResult)
    return TRUE;
    else
    {
    WindowProc(pMsg->message,pMsg->wParam,pMsg->lParam/*,&lResult*/);
    return TRUE;
    }
    }
    return CFormView::PreTranslateMessage(pMsg);
    }
    我的解决方法,分给你吧