flatpopupmenu.h

来自「《突破Visual C++.NET编程实例五十讲+源文件,初学者学习的好东东!」· C头文件 代码 · 共 218 行

H
218
字号
#ifndef _6911179a_00001c0022de
#define _6911179a_00001c0022de

class CFlatPopupMenu
{
public:
// 数据成员
  enum
  {
    itemSeparator=0x1,          // 分隔条
    itemNotSelectable=0x2,      // 不能选择该菜单项
    itemBold=0x4,               // 用 bold 字体显示文本
    itemGrayed=0x8              // 灰化显示
  };

  enum menuColor
  {
    colorBorder,                // 菜单边框或分隔条
    colorBackground,            // 背景
    colorText,                  // 文本
    colorGrayedText,            // 文本灰化
    colorHighlightText,         // 选定的文本
    colorHighlight,             // 选定的背景
    colorIconTransparent,       // 
    colorLightShadow,           // 
    colorDarkShadow,            // 
    numColors
  };

public:
  class CItem
  {
  public:
    int             m_Top;                 
    int             m_Height;             
    DWORD           m_dwFlags;             // 标志位
    std::string     m_strName;             // 文本名
    UINT            m_ItemID;              // 菜单项ID
    int             m_IconIndex;           // 位图图标索引

    CFlatPopupMenu *m_pPopup;              // 弹出式菜单

  protected:
    void Assign(const CItem& src);         // 复制src

  public:
    CItem();                               // 缺省构造函数
    CItem(const CItem& src);               

    CItem& operator=(const CItem& src);    // 赋值操作
  };

  static bool        m_bClassRegistered;   // 注册标志
  HINSTANCE          m_hInstance;          // 位图句柄
  UINT               m_BitmapID;           // 位图资源ID
  std::vector<CItem> m_Items;              // 菜单项
  std::string        m_strFont;            // 菜单项字体名
  int                m_FontSize;           // 菜单项字体点阵大小
  int                m_PopupDelay;         // 弹出式菜单延迟时间
  COLORREF           m_Colors[numColors];  // 颜色设置

// 内部状态设置
  enum
  {
    stateInactive,
    stateShow,
    stateTrack
  } m_State;

  int                m_Width;
  int                m_FontHeight;
  int                m_BoldFontHeight;
  HWND               m_hWnd;
  HWND               m_hWndCommand;
  int                m_SelectedItem;
  UINT               m_SelectedID;
  bool               m_bWaitRightButton;
  bool               m_bWaitLeftButton;
  bool               m_bModal;
  bool               m_bChild;
  CFlatPopupMenu    *m_pPrevious;

// GDI 对象
  HFONT              m_hFont;
  HFONT              m_hBoldFont;
  HPEN               m_hBorderPen;
  HPEN               m_hLightShadowPen;
  HPEN               m_hDarkShadowPen;
  HPEN               m_hBackPen;
  HPEN               m_hSelectedTextPen;
  HPEN               m_hTextPen;
  HBRUSH             m_hBackBrush;
  HBRUSH             m_hSelectedBrush;
  HBITMAP            m_hBitmap;

private:
  CFlatPopupMenu& operator=(const CFlatPopupMenu& src) { return *this; }    // not allowed

protected:
  bool RegisterClass(void);
  void Cleanup(void);
  void CreateObjects(void);
  bool CheckOutsideMenu(HWND hWnd,const RECT& rect,short x,short y);
  void DrawItem(HWND hWnd,HDC hDC,const int index,const CItem& item);
  void DrawTransparentBitmap(HDC hdc,const int xSrcOffset,const int xStart,const int yStart);
  void DrawSeparator(HDC hDC,int top);
  int GetItem(short x,short y,const RECT& rect);
  CItem *GetItem(const UINT itemid,const bool bByPosition);
  void DestroyAll(void);
  void ButtonDown(HWND hWnd,short x,short y,const bool bLeft);
  void SetReturn(const UINT id);

public:
  CFlatPopupMenu();
  ~CFlatPopupMenu();

  void SetColor(const menuColor id,const COLORREF cr);
  void SetFont(LPCTSTR pszFont);
  void SetFontSize(const int size);
  void SetPopupDelay(const int delay);

  bool Create(HINSTANCE hInstance,const UINT bitmap_id=(UINT)-1);
  bool AppendItem(const DWORD dwFlags,LPCTSTR pszName,const UINT itemid,const int icon=-1);
  bool AppendPopup(const DWORD dwFlags,LPCTSTR pszName,CFlatPopupMenu& popup,const int icon=-1);
  bool SetMenuItemText(const UINT itemid,LPCTSTR pszName,const bool bByPosition=false);
  bool SetMenuItemFlags(const UINT itemid,const DWORD dwFlags,const bool bByPosition=false);
  bool SetMenuItemIcon(const UINT itemid,const int icon,const bool bByPosition=false);
  bool GetString(const UINT itemid,LPTSTR pszText,const UINT cchText,const bool bByPosition=false);
  UINT Track(int x,int y,HWND hWnd,const bool bModal,const bool bPopup=false);

  void OnPaint(HWND hWnd,HDC hDC);
  void OnEraseBkgnd(HWND hWnd,HDC hDC);
  void OnLButtonDown(HWND hWnd,short x,short y);
  void OnRButtonDown(HWND hWnd,short x,short y);
  void OnLButtonUp(HWND hWnd,short x,short y);
  void OnRButtonUp(HWND hWnd,short x,short y);
  void OnDestroy(HWND hWnd);
  void OnMouseMove(HWND hWnd,short x,short y);
  void OnTimer(HWND hWnd,unsigned short id);
  void OnChar(HWND hWnd,TCHAR c);
};

// 设置弹出式菜单延迟时间
inline void CFlatPopupMenu::SetPopupDelay(const int delay)
{
  m_PopupDelay=delay;
}

// 设置颜色
inline void CFlatPopupMenu::SetColor(const menuColor id,const COLORREF cr)
{
  m_Colors[id]=cr;
}

// 设置字体
inline void CFlatPopupMenu::SetFont(LPCTSTR pszFont)
{
  m_strFont=pszFont;
}

// 设置字体大小
inline void CFlatPopupMenu::SetFontSize(const int size)
{
  m_FontSize=size;
}

// WM_PAINT消息
inline void CFlatPopupMenu::OnPaint(HWND hWnd,HDC hDC)
{
  std::vector<CItem>::const_iterator it;
  int pos;

// 绘制菜单项
  pos=0;
  for(it=m_Items.begin();it!=m_Items.end();it++)
    DrawItem(hWnd,hDC,pos++,*it);
}

// WM_LBUTTONDOWN消息
inline void CFlatPopupMenu::OnLButtonDown(HWND hWnd,short x,short y)
{
  ButtonDown(hWnd,x,y,true);
}

// WM_RBUTTONDOWN消息
inline void CFlatPopupMenu::OnRButtonDown(HWND hWnd,short x,short y)
{
  ButtonDown(hWnd,x,y,false);
}

inline void CFlatPopupMenu::DestroyAll(void)
{
  CFlatPopupMenu *pMenu;

  for(pMenu=this;pMenu->m_pPrevious;pMenu=pMenu->m_pPrevious);
  DestroyWindow(pMenu->m_hWnd);
}

// CItem 构造函数
inline CFlatPopupMenu::CItem::CItem()
{
}

// CItem 复制函数
inline CFlatPopupMenu::CItem::CItem(const CItem& src)
{
  Assign(src);
}

// CItem = 操作
inline CFlatPopupMenu::CItem& CFlatPopupMenu::CItem::operator=(const CItem& src)
{
  Assign(src);
  return *this;
}

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?