// Copyright (C) 1993-1997 Microsoft Corporation. All rights reserved. #if _MSC_VER > 1000 #pragma once #endif #ifndef __CDLGLISTBOX_H__ #define __CDLGLISTBOX_H__ // Header-only classes for coding convenience class CDlgListBox { public: CDlgListBox() { m_hWnd = NULL; } CDlgListBox(HWND hwndParent, int id) { m_hWnd = GetDlgItem(hwndParent, id); ASSERT_COMMENT(m_hWnd, "Invalid Listbox id"); } void Initialize(int id) { ASSERT(m_hWnd); m_hWnd = GetDlgItem(GetParent(m_hWnd), id); }; void Initialize(HWND hdlg, int id) { m_hWnd = ::GetDlgItem(hdlg, id); }; INT_PTR SendMessage(UINT msg, WPARAM wParam = 0, LPARAM lParam = 0) const { return ::SendMessage(m_hWnd, msg, wParam, lParam); }; void Enable(BOOL fEnable = TRUE) const { EnableWindow(m_hWnd, fEnable); }; INT_PTR GetText(PSTR psz, int cchMax = MAX_PATH, int index = -1) const { return SendMessage(LB_GETTEXT, (index == -1) ? GetCurSel() : index, (LPARAM) psz); }; INT_PTR GetTextLength(int index = -1) const { return SendMessage(LB_GETTEXTLEN, (index == -1) ? GetCurSel() : index); }; INT_PTR GetCount() const { return SendMessage(LB_GETCOUNT); }; void ResetContent() const { SendMessage(LB_RESETCONTENT); }; void Reset() const { SendMessage(LB_RESETCONTENT); }; INT_PTR AddString(PCSTR psz) const { return SendMessage(LB_ADDSTRING, 0, (LPARAM) psz); }; INT_PTR InsertString(int index, PCSTR psz) const { return SendMessage(LB_INSERTSTRING, index, (LPARAM) psz); }; INT_PTR DeleteString(int index) const { return SendMessage(LB_DELETESTRING, index); }; void RemoveListItem(); // removes currently selected item INT_PTR GetItemRect(RECT* prc, int index = -1) const { return SendMessage(LB_GETITEMRECT, ((index == -1) ? GetCurSel() : index), (LPARAM) prc); }; INT_PTR GetItemData(int index) const { return SendMessage(LB_GETITEMDATA, index); }; INT_PTR SetItemData(int index, int data) const { return SendMessage(LB_SETITEMDATA, index, data); }; INT_PTR GetCurSel() const { // works on single selection listbox only ASSERT(!(GetWindowLong(m_hWnd, GWL_STYLE) & LBS_MULTIPLESEL)); return SendMessage(LB_GETCURSEL); }; INT_PTR SetCurSel(int index = 0) const { // works on single selection listbox only ASSERT(!(GetWindowLong(m_hWnd, GWL_STYLE) & LBS_MULTIPLESEL)); return SendMessage(LB_SETCURSEL, index); }; INT_PTR GetTopIndex(void) const { return SendMessage(LB_GETTOPINDEX); }; void SetTopIndex(int index) const { (void) SendMessage(LB_SETTOPINDEX, (WPARAM) index); }; // For multi-select list boxes INT_PTR GetSel(int index) const { // works on multiple selection listbox only ASSERT((GetWindowLong(m_hWnd, GWL_STYLE) & LBS_MULTIPLESEL)); return SendMessage(LB_GETSEL, index); }; void SetSel(int index, BOOL fSelect = TRUE) const { // works on multiple selection listbox only ASSERT((GetWindowLong(m_hWnd, GWL_STYLE) & LBS_MULTIPLESEL)); (void) SendMessage(LB_SETSEL, fSelect, MAKELPARAM(index, 0)); }; INT_PTR FindString(PCSTR pszString, int iStart = -1) const { return SendMessage(LB_FINDSTRING, iStart, (LPARAM) pszString); }; INT_PTR SelectString(PCSTR pszString, int iStart = -1) const { // works on single selection listbox only ASSERT(!(GetWindowLong(m_hWnd, GWL_STYLE) & LBS_MULTIPLESEL)); return SendMessage(LB_SELECTSTRING, iStart, (LPARAM) pszString); }; void Invalidate(BOOL bErase = TRUE) { InvalidateRect(m_hWnd, NULL, bErase); } void DisableRedraw(void) { SendMessage(WM_SETREDRAW, FALSE); } void EnableRedraw(void) { SendMessage(WM_SETREDRAW, TRUE); } HWND m_hWnd; operator HWND() const { return m_hWnd; } }; class CDlgCheckListBox : public CDlgListBox { public: CDlgCheckListBox(); ~CDlgCheckListBox(); BOOL IsItemChecked(int nIndex) const; void CheckItem(int nIndex, BOOL fChecked = TRUE); void ToggleItem(int nIndex); void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); int GetCheckRect(int nIndex, RECT* prc); void InvalidateItem(int nIndex, BOOL fRedraw = FALSE); int ItemHeight(void); void DrawCheck(HDC hdc, RECT* prc, BOOL fChecked); void OnSelChange(void); int m_xMargin; int m_yMargin; int m_cxDlgFrame; int m_cxCheck; int m_cyCheck; int m_iLastSel; HBITMAP m_hbmpCheck; }; #endif // __CDLGLISTBOX_H__