107 lines
3.5 KiB
C++
107 lines
3.5 KiB
C++
//=============================================================================
|
|
// 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;
|
|
};
|
|
|