|
|
/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name :
odlbox.h
Abstract:
Owner draw listbox/combobox base class
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager
Revision History:
--*/
#ifndef _ODLBOX_H
#define _ODLBOX_H
//
// Get control rect in terms of
// parent coordinates
//
void COMDLL GetDlgCtlRect( IN HWND hWndParent, IN HWND hWndControl, OUT LPRECT lprcControl );
//
// Fit path to the given control
//
void COMDLL FitPathToControl( IN CWnd & wndControl, IN LPCTSTR lpstrPath );
//
// Show/hide _AND_ enable/disable control
//
void COMDLL ActivateControl( IN CWnd & wndControl, IN BOOL fShow = TRUE );
//
// Helper
//
inline void DeActivateControl(CWnd & wndControl) { ActivateControl(wndControl, FALSE); }
BOOL COMDLL VerifyState();
class COMDLL CMappedBitmapButton : public CBitmapButton /*++
Class Description:
Similar to CBitmapbutton, but use ::LoadMappedBitmap to reflect propert colour mapping.
Public Interface:
CMappedBitmapButton : Constructor
--*/ { //
// Constructor
//
public: CMappedBitmapButton();
protected: BOOL LoadMappedBitmaps( UINT nIDBitmapResource, UINT nIDBitmapResourceSel = 0, UINT nIDBitmapResourceFocus = 0, UINT nIDBitmapResourceDisabled = 0 ); };
class COMDLL CUpButton : public CMappedBitmapButton /*++
Class Description:
Up button.
Public Interface:
CUpButton : Constructor; does everything
--*/ { public: CUpButton(); };
class COMDLL CDownButton : public CMappedBitmapButton /*++
Class Description:
Down button
Public Interface:
CDownButton : Constructor; does everything
--*/ { public: CDownButton(); };
class COMDLL CRMCListBoxResources { /*++
Class Description:
Listbox resources, a series of bitmaps for use by the listbox. Will generate bitmaps against the proper background colours for both selected and non-selected states.
Public Interface:
CRMCListBoxResources : Constructor ~CRMCListBoxResources : Destructor
SysColorChanged : Regenerate bitmaps in response to change in colours DcBitMap : Get final DC BitmapHeight : Get bitmap height BitmapWidth : Get bitmap width ColorWindow : Get currently set window colour ColorHighlight : Get currently set highlight colour ColorWindowText : Get currently set window text colour ColorHighlightText : Get currently set text highlight colour
--*/ //
// Constructor
//
public: CRMCListBoxResources( IN int bmId, IN int nBitmapWidth, IN COLORREF crBackground = RGB(0,255,0) /* Green */ );
~CRMCListBoxResources();
//
// Interface
//
public: void SysColorChanged(); const CDC & dcBitMap() const; int BitmapHeight() const; int BitmapWidth() const; COLORREF ColorWindow() const; COLORREF ColorHighlight() const; COLORREF ColorWindowText() const; COLORREF ColorHighlightText() const;
//
// Internal Helpers
//
protected: void GetSysColors(); void PrepareBitmaps(); void UnprepareBitmaps(); void UnloadResources(); void LoadResources();
private: COLORREF m_rgbColorWindow; COLORREF m_rgbColorHighlight; COLORREF m_rgbColorWindowText; COLORREF m_rgbColorHighlightText; COLORREF m_rgbColorTransparent; HGDIOBJ m_hOldBitmap; CBitmap m_bmpScreen; CDC m_dcFinal; BOOL m_fInitialized; int m_idBitmap; int m_nBitmapHeight; int m_nBitmapWidth; int m_nBitmaps; };
class COMDLL CRMCListBoxDrawStruct { /*++
Class Description:
Drawing information passed on to ODLBox
Public Interface:
CRMCListBoxDrawStruct : Constructor
--*/ public: CRMCListBoxDrawStruct( IN CDC * pDC, IN RECT * pRect, IN BOOL sel, IN DWORD_PTR item, IN int itemIndex, IN const CRMCListBoxResources * pres );
public: const CRMCListBoxResources * m_pResources; int m_ItemIndex; CDC * m_pDC; CRect m_Rect; BOOL m_Sel; DWORD_PTR m_ItemData; };
/* abstract */ class COMDLL CODLBox /*++
Class Description:
abstract base class for owner-draw listbox and combobox
Public Interface:
AttachResources : Attach the resource structure to the list/combo box ChangeFont : Change the font NumTabs : Get the number of tabs currently set AddTab : Add tab AddTabFromHeaders : Add tab computed from the difference in left coordinate of two controls. InsertTab : Insert a tab RemoveTab : Remove a tab RemoveAllTabs : Remove all tabs SetTab : Set tab value GetTab : Get tab value TextHeight : Get the text height of the current font __GetCount : Pure virtual function to get the number of items in the list/combo box __SetItemHeight : Pure virtual function to set the text height of the font
--*/ { //
// Operations
//
public: void AttachResources( IN const CRMCListBoxResources * pResources );
BOOL ChangeFont( CFont * pNewFont );
int NumTabs() const;
int AddTab( IN UINT uTab );
int AddTabFromHeaders( IN CWnd & wndLeft, IN CWnd & wndRight );
int AddTabFromHeaders( IN UINT idLeft, IN UINT idRight );
void InsertTab( IN int nIndex, IN UINT uTab );
void RemoveTab( IN int nIndex, IN int nCount = 1 );
void RemoveAllTabs();
void SetTab( IN int nIndex, IN UINT uTab );
UINT GetTab( IN int nIndex ) const;
int TextHeight() const;
/* pure */ virtual int __GetCount() const = 0;
/* pure */ virtual int __SetItemHeight( IN int nIndex, IN UINT cyItemHeight ) = 0;
protected: CODLBox(); ~CODLBox();
protected: //
// Determine required display width of the string
//
static int GetRequiredWidth( IN CDC * pDC, IN const CRect & rc, IN LPCTSTR lpstr, IN int nLength );
//
// Helper function to display text in a limited rectangle
//
static BOOL ColumnText( IN CDC * pDC, IN int left, IN int top, IN int right, IN int bottom, IN LPCTSTR str );
protected: //
// Helper functions for displaying bitmaps and text
//
BOOL DrawBitmap( IN CRMCListBoxDrawStruct & ds, IN int nCol, IN int nID );
BOOL ColumnText( IN CRMCListBoxDrawStruct & ds, IN int nCol, IN BOOL fSkipBitmap, IN LPCTSTR lpstr );
void ComputeMargins( IN CRMCListBoxDrawStruct & ds, IN int nCol, OUT int & nLeft, OUT int & nRight );
protected: void CalculateTextHeight( IN CFont * pFont );
void AttachWindow( IN CWnd * pWnd );
protected: //
// must override this to provide drawing of item
//
/* pure */ virtual void DrawItemEx( IN CRMCListBoxDrawStruct & dw ) = 0;
void __MeasureItem( IN OUT LPMEASUREITEMSTRUCT lpMIS );
void __DrawItem( IN LPDRAWITEMSTRUCT lpDIS );
virtual BOOL Initialize();
protected: int m_lfHeight; const CRMCListBoxResources* m_pResources;
private: //
// Window handle -- to be attached by derived class
//
CWnd * m_pWnd; CUIntArray m_auTabs; };
//
// Forward decleration
//
class CHeaderListBox;
//
// Styles for listbox headers
//
#define HLS_STRETCH (0x00000001)
#define HLS_BUTTONS (0x00000002)
#define HLS_DEFAULT (HLS_STRETCH | HLS_BUTTONS)
class COMDLL CRMCListBoxHeader : public CStatic /*++
Class Description:
Header object to be used in conjunction with listbox
Public Interface:
CRMCListBoxHeader : Constructor ~CRMCListBoxHeader : Destructor
Create : Create control
GetItemCount : Get the number of items in the header control GetColumnWidth : Get column width of a specific column QueryNumColumns : Get the number of columns in the listbox SetColumnWidth : Set the width of specified column GetItem : Get header item information about specific column SetItem : Set header item information about specific column InsertItem : Insert header item DeleteItem : Delete header item RespondToColumnWidthChanges : Set response flagg
--*/ { DECLARE_DYNAMIC(CRMCListBoxHeader)
public: //
// Constructor
//
CRMCListBoxHeader( IN DWORD dwStyle = HLS_DEFAULT );
~CRMCListBoxHeader();
//
// Create control
//
BOOL Create( IN DWORD dwStyle, IN const RECT & rect, IN CWnd * pParentWnd, IN CHeaderListBox * pListBox, IN UINT nID );
//
// Header control stuff
//
public: int GetItemCount() const;
int GetColumnWidth( IN int nPos ) const;
BOOL GetItem( IN int nPos, IN HD_ITEM * pHeaderItem ) const;
BOOL SetItem( IN int nPos, IN HD_ITEM * pHeaderItem );
int InsertItem( IN int nPos, IN HD_ITEM * phdi );
BOOL DeleteItem( IN int nPos );
void SetColumnWidth( IN int nCol, IN int nWidth );
BOOL DoesRespondToColumnWidthChanges() const;
void RespondToColumnWidthChanges( IN BOOL fRespond = TRUE );
int QueryNumColumns() const;
protected: //{{AFX_MSG(CRMCListBoxHeader)
afx_msg void OnDestroy(); //}}AFX_MSG
afx_msg void OnHeaderItemChanged(UINT nId, NMHDR * n, LRESULT * l); afx_msg void OnHeaderEndTrack(UINT nId, NMHDR * n, LRESULT * l); afx_msg void OnHeaderItemClick(UINT nId, NMHDR * n, LRESULT * l);
DECLARE_MESSAGE_MAP()
void CRMCListBoxHeader::SetTabsFromHeader();
BOOL UseStretch() const; BOOL UseButtons() const;
private: CHeaderCtrl * m_pHCtrl; CHeaderListBox * m_pListBox; DWORD m_dwStyle; BOOL m_fRespondToColumnWidthChanges;
};
class COMDLL CRMCListBox : public CListBox, public CODLBox /*++
Class Description:
Super listbox class. Its methods work for both single selection, and multi selection listboxes.
Public Interface:
CRMCListBox : Constructor ~CRMCListBox : Destructor
Initialize : Initialize the control
__GetCount : Get the count of items in the listbox __SetItemHeight : Set the item height in the listbox InvalidateSelection : Invalidate selection
--*/ { DECLARE_DYNAMIC(CRMCListBox)
public: //
// Plain Construction
//
CRMCListBox(); virtual ~CRMCListBox(); virtual BOOL Initialize();
//
// Implementation
//
public: virtual int __GetCount() const;
virtual int __SetItemHeight( IN int nIndex, IN UINT cyItemHeight );
//
// Invalidate item
//
void InvalidateSelection( IN int nSel );
//
// Select single item
//
int SetCurSel(int nSelect);
//
// Get index of selected item. For multi-selects
// with more than 1 selected, it will return LB_ERR
//
int GetCurSel() const;
//
// Check to see if item is selected
//
int GetSel(int nSel) const;
//
// Get count of selected items
//
int GetSelCount() const;
//
// Get next select item (single or multi-select).
// Returns NULL if no further selected items available
//
void * GetNextSelectedItem( IN OUT int * pnStartingIndex );
//
// Select a single item (works for multi and single
// select listboxes)
//
BOOL SelectItem( IN void * pItemData = NULL );
//
// Get the item at the single selection (works for both
// multi and single selection listboxes). Return NULL
// if fewer than or more than one is selected.
//
void * GetSelectedListItem( OUT int * pnSel = NULL );
protected: //
// Do-nothing drawitemex for non-owner draw listboxes.
//
virtual void DrawItemEx( IN CRMCListBoxDrawStruct & dw );
virtual void MeasureItem( IN OUT LPMEASUREITEMSTRUCT lpMIS );
virtual void DrawItem( IN LPDRAWITEMSTRUCT lpDIS );
protected: //{{AFX_MSG(CRMCListBox)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); //}}AFX_MSG
DECLARE_MESSAGE_MAP()
//
// Helpers
//
protected: BOOL IsMultiSelect() const;
private: BOOL m_fInitialized; BOOL m_fMultiSelect; };
//
// Column Definition Structure
//
typedef struct tagODL_COLUMN_DEF { int nWeight; UINT nLabelID; } ODL_COLUMN_DEF;
//
// Enhanced Column Definition Structure (Can't
// be used in global structures in an AFXEXT dll
// because of the CObjectPlus reference)
//
typedef struct tagODL_COLUMN_DEF_EX { ODL_COLUMN_DEF cd; CObjectPlus::PCOBJPLUS_ORDER_FUNC pSortFn; } ODL_COLUMN_DEF_EX;
class COMDLL CHeaderListBox : public CRMCListBox /*++
Class Description:
Header listbox class. When using this class, do not use the tabbing functions of the base class. These will be set by the header control.
Public Interface:
CHeaderListBox : Constructor ~CHeaderListBox : Destructor
Initialize : Initialize the control QueryNumColumns : Get the number of columns in the listbox QueryColumnWidth : Get the width of specified column SetColumnWidth : Set the width of specified column
--*/ { DECLARE_DYNAMIC(CHeaderListBox)
public: //
// Plain Construction
//
CHeaderListBox( IN DWORD dwStyle = HLS_DEFAULT, LPCTSTR lpRegKey = NULL );
virtual ~CHeaderListBox();
virtual BOOL Initialize();
public: BOOL EnableWindow( IN BOOL bEnable = TRUE );
BOOL ShowWindow( IN int nCmdShow );
int QueryNumColumns() const;
int QueryColumnWidth( IN int nCol ) const;
BOOL SetColumnWidth( IN int nCol, IN int nWidth );
//
// Header Control Attachment Access
//
protected: int GetHeaderItemCount() const;
BOOL GetHeaderItem( IN int nPos, IN HD_ITEM * pHeaderItem ) const;
BOOL SetHeaderItem( IN int nPos, IN HD_ITEM * pHeaderItem );
int InsertHeaderItem( IN int nPos, IN HD_ITEM * phdi );
BOOL DeleteHeaderItem( IN int nPos );
CRMCListBoxHeader * GetHeader();
int InsertColumn( IN int nCol, IN int nWeight, IN UINT nStringID, IN HINSTANCE hResInst );
void ConvertColumnWidth( IN int nCol, IN int nTotalWeight, IN int nTotalWidth );
BOOL SetWidthsFromReg();
void DistributeColumns();
protected: //{{AFX_MSG(CHeaderListBox)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); //}}AFX_MSG
DECLARE_MESSAGE_MAP()
private: BOOL m_fInitialized; CString m_strRegKey; CRMCListBoxHeader * m_pHeader; };
class COMDLL CRMCComboBox : public CComboBox, public CODLBox /*++
Class Description:
Super combo box class
Public Interface:
CRMCComboBox : Constructor ~CRMCComboBox : Destructor
Initialize : Initialize the control
__GetCount : Get the count of items in the combobox __SetItemHeight : Set the item height in the combobox InvalidateSelection : Invalidate selection
--*/ { DECLARE_DYNAMIC(CRMCComboBox)
//
// Construction
//
public: CRMCComboBox(); virtual BOOL Initialize();
//
// Implementation
//
public: virtual ~CRMCComboBox();
virtual int __GetCount() const;
virtual int __SetItemHeight( IN int nIndex, IN UINT cyItemHeight );
void InvalidateSelection( IN int nSel );
protected: //
// Do-nothing drawitemex for non-owner draw comboboxes.
//
virtual void DrawItemEx( IN CRMCListBoxDrawStruct & dw );
virtual void MeasureItem( IN OUT LPMEASUREITEMSTRUCT lpMIS );
virtual void DrawItem( IN LPDRAWITEMSTRUCT lpDIS );
protected: //{{AFX_MSG(CRMCComboBox)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); //}}AFX_MSG
DECLARE_MESSAGE_MAP()
private: BOOL m_fInitialized; };
//
// Inline Expansion
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
inline CMappedBitmapButton::CMappedBitmapButton() { };
inline CUpButton::CUpButton() { LoadMappedBitmaps(IDB_UP, IDB_UPINV, IDB_UPFOC, IDB_UPDIS); }
inline CDownButton::CDownButton() { LoadMappedBitmaps(IDB_DOWN, IDB_DOWNINV, IDB_DOWNFOC, IDB_DOWNDIS); }
inline const CDC & CRMCListBoxResources::dcBitMap() const { return m_dcFinal; }
inline int CRMCListBoxResources::BitmapHeight() const { return m_nBitmapHeight; }
inline int CRMCListBoxResources::BitmapWidth() const { return m_nBitmapWidth; }
inline COLORREF CRMCListBoxResources::ColorWindow() const { return m_rgbColorWindow; }
inline COLORREF CRMCListBoxResources::ColorHighlight() const { return m_rgbColorHighlight; }
inline COLORREF CRMCListBoxResources::ColorWindowText() const { return m_rgbColorWindowText; }
inline COLORREF CRMCListBoxResources::ColorHighlightText() const { return m_rgbColorHighlightText; }
inline int CODLBox::NumTabs() const { return (int)m_auTabs.GetSize(); }
inline void CODLBox::SetTab( IN int nIndex, IN UINT uTab ) { ASSERT(nIndex >= 0 && nIndex < NumTabs()); m_auTabs[nIndex] = uTab; }
inline UINT CODLBox::GetTab( IN int nIndex ) const { ASSERT(nIndex >= 0 && nIndex < NumTabs()); return m_auTabs[nIndex]; }
inline int CODLBox::TextHeight() const { return m_lfHeight; }
inline void CODLBox::AttachWindow( IN CWnd * pWnd ) { m_pWnd = pWnd; }
inline BOOL CRMCListBoxHeader::DoesRespondToColumnWidthChanges() const { return m_fRespondToColumnWidthChanges; }
inline void CRMCListBoxHeader::RespondToColumnWidthChanges( IN BOOL fRespond ) { m_fRespondToColumnWidthChanges = fRespond; }
inline int CRMCListBoxHeader::QueryNumColumns() const { return GetItemCount(); }
inline BOOL CRMCListBoxHeader::UseStretch() const { return (m_dwStyle & HLS_STRETCH) != 0L; }
inline BOOL CRMCListBoxHeader::UseButtons() const { return (m_dwStyle & HLS_BUTTONS) != 0L; }
inline int CHeaderListBox::QueryNumColumns() const { return GetHeaderItemCount(); }
inline int CHeaderListBox::GetHeaderItemCount() const { ASSERT_PTR(m_pHeader); return m_pHeader->GetItemCount(); }
inline BOOL CHeaderListBox::GetHeaderItem( IN int nPos, IN HD_ITEM * pHeaderItem ) const { ASSERT_PTR(m_pHeader); return m_pHeader->GetItem(nPos, pHeaderItem); }
inline BOOL CHeaderListBox::SetHeaderItem( IN int nPos, IN HD_ITEM * pHeaderItem ) { ASSERT_PTR(m_pHeader); return m_pHeader->SetItem(nPos, pHeaderItem); }
inline int CHeaderListBox::InsertHeaderItem( IN int nPos, IN HD_ITEM * phdi ) { ASSERT_PTR(m_pHeader); return m_pHeader->InsertItem(nPos, phdi); }
inline BOOL CHeaderListBox::DeleteHeaderItem( IN int nPos ) { ASSERT_PTR(m_pHeader); return m_pHeader->DeleteItem(nPos); }
inline CRMCListBoxHeader * CHeaderListBox::GetHeader() { return m_pHeader; }
inline BOOL CRMCListBox::IsMultiSelect() const { ASSERT(m_fInitialized); return m_fMultiSelect; }
#endif // _ODLBOX_H_
|