You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
6.8 KiB
C++
285 lines
6.8 KiB
C++
// XTEListBox.cpp : implementation of the CXTPListBox class.
|
|
//
|
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "Common/XTPColorManager.h"
|
|
#include "Common/XTPDrawHelpers.h"
|
|
#include "Common/XTPResourceImage.h"
|
|
|
|
#include "../Util/XTPControlTheme.h"
|
|
#include "../Util/XTPGlobal.h"
|
|
#include "XTPListBox.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPListBox
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CXTPListBox::CXTPListBox()
|
|
: m_bPreSubclassInit(true)
|
|
{
|
|
m_nStyle = xtpListBoxStandard;
|
|
m_nItemHeight = 0;
|
|
m_nTextPadding = 2;
|
|
m_nHotItem = -1;
|
|
}
|
|
|
|
CXTPListBox::~CXTPListBox()
|
|
{
|
|
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CXTPListBox, CListBox)
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPListBox, CListBox)
|
|
//{{AFX_MSG_MAP(CXTPListBox)
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_PAINT()
|
|
ON_WM_CREATE()
|
|
ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
|
|
|
|
ON_WM_MOUSEMOVE()
|
|
ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_KILLFOCUS()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
void CXTPListBox::Initialize(bool bAutoFont/*= true*/)
|
|
{
|
|
// set the font for the list box.
|
|
if (bAutoFont)
|
|
{
|
|
SetFont(&XTPAuxData().font);
|
|
}
|
|
}
|
|
|
|
void CXTPListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
|
|
{
|
|
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
|
|
CRect rcItem = lpDIS->rcItem;
|
|
|
|
if ((lpDIS->itemID != (UINT)-1) && (lpDIS->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
|
|
{
|
|
COLORREF clrWindow = GetBackColor();
|
|
COLORREF clrWindowText = IsWindowEnabled() ? GetXtremeColor(COLOR_WINDOWTEXT) : GetXtremeColor(COLOR_GRAYTEXT);
|
|
BOOL bSelected = ((lpDIS->itemState & ODS_SELECTED) != 0);
|
|
CRect rcText(rcItem);
|
|
rcText.DeflateRect(m_nTextPadding, 0);
|
|
|
|
if (bSelected)
|
|
{
|
|
clrWindow = IsWindowEnabled() ? GetXtremeColor(COLOR_HIGHLIGHT) : GetXtremeColor(COLOR_GRAYTEXT);
|
|
clrWindowText = GetXtremeColor(COLOR_HIGHLIGHTTEXT);
|
|
}
|
|
|
|
if (m_nStyle == xtpListBoxOfficeXP && bSelected && IsWindowEnabled())
|
|
{
|
|
clrWindowText = GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT);
|
|
clrWindow = GetXtremeColor(XPCOLOR_HIGHLIGHT);
|
|
pDC->Draw3dRect(rcItem, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
|
|
rcItem.DeflateRect(1, 1);
|
|
}
|
|
|
|
if (m_nStyle == xtpListBoxOffice2007)
|
|
{
|
|
CXTPResourceImages* pImages = XTPResourceImages();
|
|
|
|
BOOL bHasFocus = ::GetFocus() == m_hWnd;
|
|
BOOL bHighlighted = (int)lpDIS->itemID == m_nHotItem;
|
|
|
|
if ((bSelected || bHighlighted) && IsWindowEnabled())
|
|
{
|
|
CXTPResourceImage* pImage = pImages->LoadFile(_T("LISTBOX"));
|
|
if (pImage)
|
|
{
|
|
pImage->DrawImage(pDC, rcItem, pImage->GetSource(bSelected && bHighlighted ? 2 :
|
|
bHasFocus && bSelected ? 1 : !bHasFocus && bSelected ? 3 : 0, 4), CRect(4, 4, 4, 4), COLORREF_NULL);
|
|
clrWindow = COLORREF_NULL;
|
|
}
|
|
}
|
|
|
|
pDC->SetBkMode(TRANSPARENT);
|
|
clrWindowText = pImages->GetImageColor(_T("LISTBOX"), _T("NormalText"));
|
|
}
|
|
|
|
// set the text and text background colors, then repaint the item.
|
|
pDC->SetBkColor(clrWindow);
|
|
pDC->SetTextColor(clrWindowText);
|
|
if (clrWindow != COLORREF_NULL) pDC->FillSolidRect(&rcItem, clrWindow);
|
|
|
|
CString strText;
|
|
GetText(lpDIS->itemID, strText);
|
|
|
|
pDC->DrawText(strText, &rcText, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
|
|
}
|
|
if ((lpDIS->itemAction & ODA_FOCUS) && (m_nStyle != xtpListBoxOffice2007))
|
|
pDC->DrawFocusRect(&lpDIS->rcItem);
|
|
}
|
|
|
|
void CXTPListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
|
|
{
|
|
lpMIS->itemHeight = m_nItemHeight > 0 ? m_nItemHeight : ::GetSystemMetrics(SM_CYMENU)-2;
|
|
}
|
|
|
|
BOOL CXTPListBox::OnEraseBkgnd(CDC* /*pDC*/)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
COLORREF CXTPListBox::GetBackColor()
|
|
{
|
|
return GetXtremeColor(COLOR_WINDOW);
|
|
}
|
|
|
|
void CXTPListBox::OnPaint()
|
|
{
|
|
CPaintDC dc(this);
|
|
|
|
// Get the client rect.
|
|
CRect r;
|
|
GetClientRect(&r);
|
|
|
|
// Paint to a memory device context to reduce screen flicker.
|
|
CXTPBufferDC memDC(dc, r);
|
|
memDC.FillSolidRect(r, GetBackColor());
|
|
|
|
CPoint ptOrg = memDC.GetWindowOrg();
|
|
|
|
// Let the window do its default painting ...
|
|
CListBox::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
|
|
memDC.SetWindowOrg(ptOrg);
|
|
}
|
|
|
|
LRESULT CXTPListBox::OnPrintClient(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CListBox::DefWindowProc(WM_ERASEBKGND, wParam, 0);
|
|
return CListBox::DefWindowProc(WM_PRINTCLIENT, wParam, lParam);
|
|
}
|
|
|
|
void CXTPListBox::Init()
|
|
{
|
|
// make sure the style is set to LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS.
|
|
DWORD dwStyle = ::GetWindowLong(GetSafeHwnd(), GWL_STYLE);
|
|
|
|
if ((dwStyle & LBS_OWNERDRAWVARIABLE) == 0)
|
|
dwStyle |= LBS_OWNERDRAWVARIABLE;
|
|
|
|
if ((dwStyle & LBS_HASSTRINGS) == 0)
|
|
dwStyle |= LBS_HASSTRINGS;
|
|
|
|
::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
|
|
}
|
|
|
|
void CXTPListBox::PreSubclassWindow()
|
|
{
|
|
CListBox::PreSubclassWindow();
|
|
|
|
if (m_bPreSubclassInit)
|
|
Init();
|
|
}
|
|
|
|
BOOL CXTPListBox::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
if (!CListBox::PreCreateWindow(cs))
|
|
return FALSE;
|
|
|
|
m_bPreSubclassInit = false;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int CXTPListBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CListBox::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
Init();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void CXTPListBox::OnMouseLeave()
|
|
{
|
|
OnMouseMove(0, CPoint(-1, -1));
|
|
}
|
|
|
|
void CXTPListBox::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
CListBox::OnMouseMove(nFlags, point);
|
|
|
|
if (m_nStyle != xtpListBoxOffice2007)
|
|
return;
|
|
|
|
BOOL bOutside = FALSE;
|
|
int nHotItem = ItemFromPoint(point, bOutside);
|
|
if (bOutside) nHotItem = -1;
|
|
|
|
if (nHotItem != m_nHotItem)
|
|
{
|
|
m_nHotItem = nHotItem;
|
|
Invalidate(FALSE);
|
|
|
|
if (m_nHotItem != -1)
|
|
{
|
|
TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, HOVER_DEFAULT};
|
|
_TrackMouseEvent(&tme);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPListBox::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CListBox::OnSetFocus(pOldWnd);
|
|
|
|
if (m_nStyle == xtpListBoxOffice2007)
|
|
{
|
|
Invalidate(FALSE);
|
|
}
|
|
}
|
|
|
|
void CXTPListBox::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CListBox::OnKillFocus(pNewWnd);
|
|
|
|
if (m_nStyle == xtpListBoxOffice2007)
|
|
{
|
|
Invalidate(FALSE);
|
|
}
|
|
}
|
|
|
|
void CXTPListBox::SetTheme(XTPControlTheme nTheme)
|
|
{
|
|
if (nTheme == xtpControlThemeResource)
|
|
SetListStyle(xtpListBoxOffice2007);
|
|
else if (nTheme == xtpControlThemeOfficeXP)
|
|
SetListStyle(xtpListBoxOfficeXP);
|
|
else
|
|
SetListStyle(xtpListBoxStandard);
|
|
|
|
}
|