//============================================================================= // This file contains definitions of classes to implement the pseudo menus // and menu bars for the msinfo control. //============================================================================= #pragma once //----------------------------------------------------------------------------- // This class implements a single pseudo-menu on the screen. Caller should // construct it, attach an HMENU and use Render, HitTest and TrackMenu // to manage the menu. //----------------------------------------------------------------------------- class CPseudoMenu { public: CPseudoMenu(LPCTSTR szCaption, COLORREF crNormal, COLORREF crHighlight); ~CPseudoMenu(); public: // Methods for setting the location for this menu (by the upper left // corner) and getting the bounding rectangle for the label. void SetLocation(int cx, int cy); void GetSize(HDC hdc, int * pcx, int * pcy); const RECT * GetRect() { return &m_rect; }; void GetMenuPoint(POINT * pPoint) { pPoint->x = m_rect.left; pPoint->y = m_rect.bottom; }; CString GetCaption() { return m_strCaption; }; void UpdateColors(COLORREF crNormal, COLORREF crHighlight); // Render the label for the menu (possibly highlighted if the mouse // is over the menu). Determine if the given coordinate intersects // the menu label. BOOL SetHighlight(BOOL fHighlight); void Render(HDC hdc); BOOL HitTest(int cx, int cy) { return PtInRect(&m_rect, CPoint(cx, cy)); }; // Attach new HMENU. Return the original HMENU (for the caller to deal with). HMENU AttachMenu(HMENU hmenu); HMENU GetHMENU() { return m_hMenu; }; // Track the user's selection of a menu, and return the ID of the // selected item. UINT TrackMenu(HWND hwnd, POINT * pPoint); private: RECT m_rect; HMENU m_hMenu; CString m_strCaption; COLORREF m_crNormal; COLORREF m_crHighlight; BOOL m_fHighlight; }; //----------------------------------------------------------------------------- // This class implements a pseudo menu bar. It contains a collection of // CPseudoMenu objects, and encapsulates hit testing, rendering, etc. for the // group of menus. //----------------------------------------------------------------------------- class CPseudoMenuBar { public: CPseudoMenuBar(); ~CPseudoMenuBar(); // Functions for inserting and accessing CPseudoMenu objects. void LoadFromResource(HINSTANCE hinstance, UINT uResourceID, COLORREF crNormal, COLORREF crHighlight); void InsertMenu(int index, CPseudoMenu * pMenu); CPseudoMenu * GetMenu(int index); void UpdateColors(COLORREF crNormal, COLORREF crHighlight); // Functions for managing the size of the total menu bar, testing for // hits, rendering, etc. const RECT * GetRect(HDC hdc) { RecomputeRect(hdc); return &m_rect; }; BOOL HitTest(HDC hdc, int cx, int cy) { RecomputeRect(hdc); return PtInRect(&m_rect, CPoint(cx, cy)); }; void GetMenuPoint(HDC hdc, int index, POINT * pPoint); void GetMenuPoint(HDC hdc, int cx, int cy, POINT * pPoint); BOOL NoHighlight(); BOOL TrackHighlight(HDC hdc, int cx, int cy); UINT TrackMenu(HWND hwnd, POINT * pPoint, int cx, int cy); void SetOrigin(HDC hdc, POINT point); void Render(HDC hdc); private: void RecomputeRect(HDC hdc); private: enum { MaxMenus = 20 }; CPseudoMenu * m_pmenus[MaxMenus]; // TBD - arbitrary limit RECT m_rect; BOOL m_fNeedToComputeRect; POINT m_ptOrigin; public: // Temporarily adding on a find button using the menu bar. This will go // eventually go away. RECT m_winRect; };