在MainFrame里创建了一个新窗口,在该新窗口中画了自定义的几个按钮,消息响应函数也写了,但是点击按钮就是没响应,哪位高手能帮我看下,我现在还没有分,等有分了以后补上,谢谢.

解决方案 »

  1.   

    是这样的,我写了两个类,CNdBar和CNDButton.下面是这两个类的定义文件:#pragma once
    #include "NDButton.h"
    #include "StdAfx.h"
    #include "resource.h"
    //频道按钮的指针链表和id
    #define WM_BTNPUSHED WM_USER + 1001typedef struct _BUTTONLIST
    {
    int nButtonId;
    CNDButton *pBtn;
    _BUTTONLIST *pNext;
    } BTNLIST, *PBTNLIST;
    class CNdBar : public CWnd
    {
    DECLARE_DYNAMIC(CNdBar)public:
    CNdBar();
    virtual ~CNdBar();protected:
    // 工具条包含的按钮个数
    public:
    // 设置bar的按钮个数
    void setBtnNum(int nNum);
    public:
    // virtual bool CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT & rect, CWnd* pParentWnd, UINT uID);
    virtual bool Create(UINT wStyle, const CRect & rect, CWnd * pParentWnd, UINT nID);
    virtual bool InsertButton(DWORD dwStyle, UINT nWidth, UINT nHeight, UINT uID, HICON hIco, UINT nIconX, UINT nIconY);
    afx_msg LRESULT OnBtnPushed(WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
    protected:
    LPCSTR m_strPushedBmp;
    LPCSTR m_strNormalBmp;
    LPCSTR m_strHoverBmp;
    LPCSTR m_strIcon;
    public:
    //窗体高度
    int m_nHeight;
    //窗体宽度
    int m_nWidth;
    int m_nX;
    int m_nY;
    int m_nNumButton;
    PBTNLIST m_btnList;
    UINT m_uID;
    CRITICAL_SECTION m_btnListLock;
    public:
    void SetBtnImages(LPCSTR strPushedBmp, LPCSTR strNormalBmp, LPCSTR strHoverBmp, LPCSTR strIcon);
    };----------------------------------------------------------------------------------------------------------------
    #pragma once
    #include "StdAfx.h"
    #include "resource.h"// CNDButton
    enum {NDBS_PUSHED, NDBS_HOVER, NDBS_DOWN, NDBS_NORMAL};#define WM_BTNPUSHED WM_USER + 1001class CNDButton : public CButton
    {
    DECLARE_DYNAMIC(CNDButton)public:
    CNDButton();
    CNDButton(LPCSTR szBmpNormal, LPCSTR szBmpHover, LPCSTR szBmpPushed, LPCSTR szIcon, UINT nWidth, UINT nHeight, UINT nIconWidth, UINT nIconHeight);
    virtual ~CNDButton();
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    virtual void setIcon(int nX, int nY, HICON hIcon);protected:
    public:
    HICON m_hIcon;
    //按钮按下时的按钮背景
    HBITMAP m_hBmpPushed;
    //鼠标放在按钮上的按钮背景
    HBITMAP m_hBmpHover;
    //按钮的一般标准状态背景图片
    HBITMAP m_hBmpNormal;
    //按钮是否处于按下状态
    bool m_bPushed;
    //是否鼠标停留
    bool m_bHover;
    //按钮是否被按下且还没有释放
    bool m_bDown;
    UINT m_nHeight;
    UINT m_nWidth;
    int m_nIconWidth;
    int m_nIconHeight;
    int m_nIconX;
    int m_nIconY;
    //按钮id
    UINT m_uID;
    protected:
    virtual void PreSubclassWindow();
    public:
    //设置按钮为非按下状态
    void setNoPushed();
    public:
    DECLARE_MESSAGE_MAP()
      afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
      afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    public:
    virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
    };然后在MainFrame.cpp中的OnCreate()函数里是这样调用的:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1; // TODO: Add your specialized creation code here
            // m_leftBar是CNdBar类,属于CMainFrame的一个成员变量
    if (!m_leftBar.Create(WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN , CRect(0, 0, 100, 100), this, 123))
    {
    AfxMessageBox("1111");
    }
    m_leftBar.SetBtnImages(MAKEINTRESOURCE(IDB_BITMAP3), MAKEINTRESOURCE(IDB_BITMAP1), MAKEINTRESOURCE(IDB_BITMAP2), MAKEINTRESOURCE(IDI_ICON1));
    m_leftBar.InsertButton(0 , 30, 35, 12345, NULL, 15, 15);
    m_leftBar.InsertButton(0 , 30, 35, 12346, NULL, 15, 15);
    m_leftBar.InsertButton(0 , 30, 35, 12347, NULL, 15, 15); return 0;
    }执行后,按钮有显示出来,但是点击按钮没任何响应.我在按钮响应函数里加了句:AfxMessageBox("我被按了"); 发现点击按钮的时候没进入到响应函数里.