首先,自定义了一个CControlBar类,想在该类添加一个自定义按钮控件,试了一下,发现自定义的按钮CSpecButton不能响应任何消息(点击、鼠标移动等),而默认的按钮就可以。
在MainFrame的OnCreate中创建按钮
CButton *myButton = new CButton();
myButton->Create(_T("X"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect (160,2,175,17),m_MyBar,3);CSpecButton *MyButton = new CSpecButton();
MyButton->Create(_T("Button"),WS_CHILD|WS_VISIBLE|BS_OWNERDRAW  /*BS_PUSHBUTTON*/,CRect(20,50,100,100),&m_MyBar,101);BOOL CExtControlBar::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类 if(LOWORD(wParam) == 3)
{
MessageBox(_T("Hello"));
}
if(LOWORD(wParam) == 11)
{
MessageBox(_T("Hello"));
}
return CControlBar::OnCommand(wParam, lParam);
}自定义按钮CSpecButton自是改写了DrawItem函数,和添加了一些鼠标消息而已,其他都没改动过。不知道原因何在?

解决方案 »

  1.   

    if(LOWORD(wParam) == 11)
    {
    MessageBox(_T("Hello"));
    }
    上面为101啊!ID不对...
      

  2.   

    一样不行,框架窗口CMainFrame或者父窗口一样接受不到消息。根本没调用过鼠标消息和单击消息。
      

  3.   

    WM_COMMAND消息,主框架应该能收到的!!!
    这点代码看不出问题,你把源码发一下!!
      

  4.   

    大致就这样了 
    是不是动态创建的子类默认的消息处理函数是它的基类?class CSpecButton : public CButton
    {
    DECLARE_DYNAMIC(CSpecButton)public:
    CSpecButton();
    virtual ~CSpecButton();protected:
    DECLARE_MESSAGE_MAP()
    virtual void PreSubclassWindow();
    bool m_bMouseHover;
    bool m_bMouseDown; //鼠标按下标志
    CRgn m_btnRgn; //按钮区域
    CRgn m_btnDownRgn; //按钮按下区域 bool m_bInitDraw; //是否初始化按钮标志
    CBitmap *m_pbmBkBtn; //按钮所在窗口背景
    UINT m_nButtonStyle;public:
    //WNDPROC m_oldhwnd;
    public:
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg LRESULT CSpecButton::OnMouseLeave (WPARAM wParam ,LPARAM lParam);
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point); void SetButtonMode(UINT action, UINT mode);

    protected:
    void InitBK(void);
    void DrawNormalButton(LPDRAWITEMSTRUCT lpDIS);public:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
    };
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    CRect DockRect;
    CRect tempRect; //获取工具栏、状态栏的矩形大小
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("未能创建工具栏\n");
    return -1;      // 未能创建
    } if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("未能创建状态栏\n");
    return -1;      // 未能创建
    } GetClientRect(&DockRect);
    // ScreenToClient(&DockRect);
    DWORD dwToolBarHeight = (m_wndToolBar.GetToolBarCtrl()).GetButtonSize();      
    //GetClientRect(&tempRect);
    DockRect.bottom -=(int)HIWORD(dwToolBarHeight);
    m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(20);
    DockRect.bottom -= 30;
    DockRect.right =  DockRect.left + 200;

    BOOL b = m_MyBar.Create(_T("MyBar"),0,DockRect,this,AFX_IDW_CONTROLBAR_FIRST+40);

    CButton *myButton = new CButton();
    myButton->Create(_T("X"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(160,2,175,17), &m_MyBar, 3);
    m_MyButton = new CSpecButton();
    m_MyButton->Create(_T("Button"),WS_CHILD|WS_VISIBLE|BS_OWNERDRAW /*BS_PUSHBUTTON*/,CRect(20,50,100,100),&m_MyBar,33); EnableDocking(CBRS_ALIGN_ANY);
    m_MyBar.EnableDocking(CBRS_ALIGN_LEFT);
    DockControlBar(&m_MyBar);
    // TODO: 如果不需要工具栏可停靠,则删除这三行
    EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

    DockControlBar(&m_wndToolBar);
    return 0;
    }
      

  5.   

    BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if(LOWORD(wParam) == 3)
    {
    MessageBox(_T("Hello"));
    }
    if(LOWORD(wParam) == 33)
    {
    // MessageBox(_T("Hello"));
    }
    return CFrameWnd::OnCommand(wParam, lParam);
    }
      

  6.   

    用SubClassWindow想改变子控件的消息路由,但是调试的时候老是报错?m_MyButton->SubclassWindow(m_MyButton->GetSafeHwnd())
    加了这个语句,但是调试老是报错,各位又遇到这样问题吗?这个控件直接作为其他窗口的子控件,不是对话框上创建的,能用这个函数吗?