windows-nt/Source/XPSP1/NT/admin/pchealth/sysinfo/control/pseudomenu.h
2020-09-26 16:20:57 +08:00

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;
};