CMenuButton的实现

来源:互联网 发布:深圳警察收入知乎 编辑:程序博客网 时间:2024/05/16 07:26

     这几天工作上需要在原先的主菜单栏上添加几个Checkbox, 直接贴吧,翻烂了MSDN都没找到相关的内容。

如果直接建个dialog,然后在上面用cmenu实现,则这个dialog必须是popup类型,这样会引起很多问题,不好用。

只好自己想别的办法实现, 大致思路:

     建一个长条dialog,在dialog上动态生成点击能产生菜单,并能响应菜单的Button (我取了个名字CMenuButton) ,然后在dialog的右侧放上几个checkbox。 难点就是CMenuButton的设计。

     建个类:

class CMenuButton : public CButton
{
    DECLARE_DYNAMIC(CMenuButton)
public:
    CMenuButton();        //构造函数
    void SetMenuID(int nID);        //设置关联菜单ID
    void SetForeColor(COLORREF color);   //设置文本颜色
    void SetBkColor(COLORREF color);     //设置背景颜色
    void SetText(CString str); //设置按钮文本
    BOOL isClick();            //是否单击主按钮区
    void SetMenuHandle(HMENU hMenu);   //设计menu句柄 (一个button带一个popup的menu)  
    void OnShowMenu(int x, int y);                  //显示menu,这个方法可用可不用,看情况选择
    void SetSubMenux(WORD subMenu_x);
   WORD GetSubMenux();
   WORD GetSubMenuy();
   void SetMaxSubMenuy(WORD MaxSubMenu_y);

private:
    int         m_State;        //按钮状态   不同状态按钮形状不同  
    BOOL        b_InFlag;       //鼠标进入标志
    BOOL        b_ClickFlag;    //单击选择区
    BOOL        b_ClickBut;     //单击主体区
    CString     m_strText;      //按钮文字
    COLORREF    m_ForeColor;    //文本颜色
    COLORREF    m_BackColor;    //背景色
    CRect       m_ButRect;      //按钮尺寸
    CRect       m_LRect;        //按钮左部尺寸
    CRect       m_RRect;        //按钮右部尺寸
    CMenu       m_Menu;         //弹出菜单
    int         m_MenuID;       //菜单ID
    HMENU       m_hMenu;    //菜单句柄
 WORD        m_subMenu_x;    //用于定位菜单
 WORD        m_subMenu_y;    //用于定位菜单
 WORD        m_MaxSubMenu_y;
 BOOL        m_LButtonFlag;    //左键点击标志
    void DrawButton(CDC *pDC);    //绘制按钮

 LRESULT SendMessageToParenet(WPARAM wParam, LPARAM lParam);    //发送消息给父窗口,处理菜单命令

public:


 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

 public:
 virtual void PreSubclassWindow();

//用于处理菜单消息,在这里面调用SendMessageToParenet()
 virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);

 // Generated message map functions
public:
 //{{AFX_MSG(CMenuButton)
 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()
};

在使用时候调用基类的Create动态生成CMenuButton,然后读配置文件(菜单项更改时候只需要更改配置文件而不需要重新编译程序)生成popupmenu,

然后调用CMenuButton::SetMenuHandle()把该popupmenu跟CMenuButton关联起来

最后就剩下比较具体的消息响应,方法逻辑等东西了。

全部完成后,测试下,大功告成,只是某些细节还需要改进下。

原创粉丝点击