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 + -
显示快捷键?