Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1076 lines
20 KiB

/*++
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_