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.
887 lines
23 KiB
C++
887 lines
23 KiB
C++
// XTPEdit.cpp : implementation of the CXTPEdit 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/XTPDrawHelpers.h"
|
|
#include "Common/XTPColorManager.h"
|
|
#include "Common/XTPResourceImage.h"
|
|
#include "Common/XTPWinThemeWrapper.h"
|
|
|
|
#include "../Util/XTPControlTheme.h"
|
|
#include "XTPComboBox.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
CXTPComboBox::CXTPComboBox()
|
|
{
|
|
m_bHighlighted = FALSE;
|
|
m_bFocused = FALSE;
|
|
|
|
m_bFlatStyle = FALSE;
|
|
m_nTheme = xtpControlThemeDefault;
|
|
m_bUseVisualStyle = TRUE;
|
|
|
|
m_bPreSubclassInit = TRUE;
|
|
|
|
m_bAutoComp = FALSE;
|
|
m_bDisableAC = FALSE;
|
|
|
|
m_crBack = COLORREF_NULL;
|
|
m_crText = COLORREF_NULL;
|
|
|
|
m_themeComboBox = new CXTPWinThemeWrapper();
|
|
}
|
|
|
|
CXTPComboBox::~CXTPComboBox()
|
|
{
|
|
SAFE_DELETE(m_themeComboBox);
|
|
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CXTPComboBox, CComboBox)
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPComboBox, CComboBox)
|
|
ON_WM_CREATE()
|
|
ON_WM_PAINT()
|
|
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_SETFOCUS()
|
|
ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
|
|
|
|
ON_WM_SYSCOLORCHANGE()
|
|
|
|
ON_CONTROL_REFLECT_EX(CBN_EDITUPDATE, OnEditUpdate)
|
|
ON_CONTROL_REFLECT_EX(CBN_CLOSEUP, OnEndSel)
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
|
|
void CXTPComboBox::RefreshMetrics()
|
|
{
|
|
RefreshXtremeColors();
|
|
m_clrBorderDisabled = m_clrBorderNormal = m_clrBorderHot = GetSysColor(COLOR_3DSHADOW);
|
|
|
|
m_clrButtonNormal = m_clrButtonHot = m_clrButtonPressed = GetSysColor(COLOR_BTNFACE);
|
|
m_clrButtonArrowNormal = m_clrButtonArrowHot = m_clrButtonArrowPressed = GetXtremeColor(COLOR_BTNTEXT);
|
|
|
|
if (m_nTheme == xtpControlThemeFlat)
|
|
{
|
|
m_clrBorderNormal = m_clrBorderHot = GetSysColor(COLOR_WINDOWFRAME);
|
|
}
|
|
if (m_nTheme == xtpControlThemeVisualStudio2010)
|
|
{
|
|
m_clrBorderNormal = RGB(133, 145, 162);
|
|
m_clrBorderHot = RGB(229, 195, 101);
|
|
m_clrBorderDisabled = RGB(164, 173, 186);
|
|
m_clrButtonNormal = RGB(241, 243, 248);
|
|
m_grcButton = RGB(255,255,255);
|
|
m_grcButtonHilite.SetStandardValue(RGB(255, 252, 242), RGB(255, 236, 181));
|
|
m_grcButtonPushed = RGB(255, 232, 166);
|
|
m_clrButtonArrowNormal = RGB(27, 41, 62);
|
|
m_clrButtonArrowPressed = RGB(27, 41, 62);
|
|
}
|
|
if (m_nTheme == xtpControlThemeOfficeXP ||
|
|
m_nTheme == xtpControlThemeOffice2003 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2005 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2008)
|
|
{
|
|
m_clrBorderHot = GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER);
|
|
|
|
m_clrButtonHot = GetXtremeColor(XPCOLOR_HIGHLIGHT);
|
|
m_clrButtonPressed = GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED);
|
|
|
|
m_clrButtonArrowHot = GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT);
|
|
m_clrButtonArrowPressed = GetXtremeColor(XPCOLOR_PUSHED_TEXT);
|
|
|
|
if (m_nTheme == xtpControlThemeVisualStudio2005 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2008)
|
|
{
|
|
m_grcButton.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 40), GetXtremeColor(COLOR_3DFACE));
|
|
|
|
switch (XTPColorManager()->GetCurrentSystemTheme())
|
|
{
|
|
case xtpSystemThemeBlue:
|
|
case xtpSystemThemeRoyale:
|
|
{
|
|
m_grcButtonHilite.SetStandardValue(RGB(193, 210, 238));
|
|
m_grcButtonPushed.SetStandardValue(RGB(152, 181, 226));
|
|
}
|
|
break;
|
|
|
|
case xtpSystemThemeAero:
|
|
{
|
|
m_grcButtonHilite.SetStandardValue(RGB(228, 245, 252), RGB(124, 177, 205));
|
|
m_grcButtonPushed.SetStandardValue(RGB(237, 248, 253), RGB(129, 192, 224));
|
|
}
|
|
break;
|
|
|
|
case xtpSystemThemeOlive:
|
|
{
|
|
m_grcButtonHilite.SetStandardValue(RGB(182, 198, 141));
|
|
m_grcButtonPushed.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
|
|
}
|
|
break;
|
|
|
|
case xtpSystemThemeSilver:
|
|
{
|
|
m_grcButtonHilite.SetStandardValue(RGB(255, 242, 200), RGB(255, 210, 148));
|
|
m_grcButtonPushed.SetStandardValue(RGB(254, 149, 82), RGB(255, 207, 139));
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
m_grcButtonHilite.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_WINDOW), 30));
|
|
m_grcButtonPushed.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_WINDOW), 50));
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (m_nTheme == xtpControlThemeUltraFlat)
|
|
{
|
|
COLORREF clrFace = GetXtremeColor(COLOR_3DFACE);
|
|
COLORREF clrWindow = GetXtremeColor(COLOR_WINDOW);
|
|
|
|
m_clrButtonPressed = GetXtremeColor(COLOR_3DSHADOW);
|
|
m_clrButtonPressed = XTPColorManager()->LightColor(m_clrButtonPressed, clrFace, 0x32);
|
|
|
|
m_clrButtonHot = clrFace;
|
|
m_clrButtonHot = XTPColorManager()->LightColor(m_clrButtonHot, clrWindow, 0x1E);
|
|
}
|
|
|
|
if (m_nTheme == xtpControlThemeOffice2003)
|
|
{
|
|
XTPColorManager()->RefreshColors();
|
|
XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
|
|
switch (systemTheme)
|
|
{
|
|
case xtpSystemThemeBlue:
|
|
case xtpSystemThemeRoyale:
|
|
case xtpSystemThemeAero:
|
|
m_clrBorderNormal = RGB(147, 181, 231);
|
|
m_clrBorderHot = RGB(0, 0, 128);
|
|
m_grcButton.SetStandardValue(RGB(227, 239, 255), RGB(147, 181, 231));
|
|
break;
|
|
|
|
case xtpSystemThemeOlive:
|
|
m_clrBorderNormal = RGB(194, 206, 159);
|
|
m_clrBorderHot = RGB(63, 93, 56);
|
|
m_grcButton.SetStandardValue(RGB(236, 240, 213), RGB(194, 206, 159));
|
|
break;
|
|
|
|
case xtpSystemThemeSilver:
|
|
m_clrBorderNormal = RGB(186, 185, 205);
|
|
m_clrBorderHot = RGB(75, 75, 11);
|
|
m_grcButton.SetStandardValue(RGB(233, 231, 241), RGB(186, 185, 205));
|
|
break;
|
|
|
|
default:
|
|
m_clrBorderNormal = GetXtremeColor(COLOR_3DSHADOW);
|
|
m_clrBorderHot = GetXtremeColor(COLOR_3DSHADOW);
|
|
m_grcButton.SetStandardValue(
|
|
XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 0x14a),
|
|
XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 0x320));
|
|
break;
|
|
}
|
|
|
|
m_grcButtonHilite.SetStandardValue(RGB(255, 242, 200), RGB(255, 212, 151));
|
|
m_grcButtonPushed.SetStandardValue(RGB(254, 142, 75), RGB(255, 207, 139));
|
|
|
|
if (systemTheme != xtpSystemThemeUnknown)
|
|
{
|
|
m_clrButtonHot = RGB(255, 238, 194);
|
|
m_clrButtonPressed = RGB(254, 128, 62);
|
|
m_clrButtonArrowPressed = m_clrButtonArrowHot = 0;
|
|
}
|
|
}
|
|
if (m_nTheme == xtpControlThemeResource)
|
|
{
|
|
m_clrBorderHot = XTPResourceImages()->GetImageColor(_T("RibbonComboBox"), _T("BorderHilite"));
|
|
m_clrBorderNormal = XTPResourceImages()->GetImageColor(_T("RibbonComboBox"), _T("Border"));
|
|
m_clrBorderDisabled = XTPResourceImages()->GetImageColor(_T("RibbonComboBox"), _T("BorderDisabled"));
|
|
}
|
|
|
|
m_themeComboBox->OpenTheme(0, L"COMBOBOX");
|
|
|
|
if (!m_hWnd)
|
|
return;
|
|
|
|
CClientDC dc(this);
|
|
CXTPFontDC font(&dc, CWnd::GetFont());
|
|
|
|
TEXTMETRIC tm;
|
|
dc.GetTextMetrics(&tm);
|
|
m_nThumbWidth = max(15, tm.tmAveCharWidth * 2 + 4);
|
|
|
|
m_nThumbWidth = min(m_nThumbWidth, GetSystemMetrics(SM_CXVSCROLL) + 1);
|
|
}
|
|
|
|
|
|
|
|
void CXTPComboBox::Init()
|
|
{
|
|
RefreshMetrics();
|
|
|
|
Invalidate(FALSE);
|
|
|
|
HWND hWndEdit = 0;
|
|
GetDlgItem(1001, &hWndEdit);
|
|
|
|
if (hWndEdit)
|
|
{
|
|
m_wndEdit.SubclassWindow(hWndEdit);
|
|
}
|
|
}
|
|
|
|
void CXTPComboBox::PreSubclassWindow()
|
|
{
|
|
CComboBox::PreSubclassWindow();
|
|
|
|
if (m_bPreSubclassInit)
|
|
{
|
|
// Initialize the control.
|
|
Init();
|
|
}
|
|
}
|
|
|
|
int CXTPComboBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CComboBox::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
// Initialize the control.
|
|
Init();
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CXTPComboBox::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
if (!CComboBox::PreCreateWindow(cs))
|
|
return FALSE;
|
|
|
|
// When creating controls dynamically Init() must
|
|
// be called from OnCreate() and not from
|
|
// PreSubclassWindow().
|
|
|
|
m_bPreSubclassInit = FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CXTPComboBox::SetTheme(XTPControlTheme nTheme)
|
|
{
|
|
m_nTheme = nTheme;
|
|
|
|
m_bUseVisualStyle = (m_nTheme == xtpControlThemeDefault);
|
|
|
|
RefreshMetrics();
|
|
|
|
if (m_hWnd) Invalidate(FALSE);
|
|
}
|
|
|
|
void CXTPComboBox::SetUseVisualStyle(BOOL bUseVisualStyle/* = TRUE*/)
|
|
{
|
|
m_bUseVisualStyle = bUseVisualStyle;
|
|
|
|
RefreshMetrics();
|
|
if (m_hWnd) Invalidate(FALSE);
|
|
}
|
|
|
|
void CXTPComboBox::OnPaint()
|
|
{
|
|
CPaintDC paintDC(this);
|
|
CXTPClientRect rc(this);
|
|
|
|
CXTPBufferDC dcMem(paintDC);
|
|
|
|
HBRUSH hBrush = GetClientBrush(&dcMem);
|
|
|
|
FillRect(dcMem, rc, hBrush);
|
|
|
|
if ((GetStyle() & 3) == CBS_SIMPLE)
|
|
{
|
|
CComboBox::DefWindowProc(WM_PAINT, (WPARAM)dcMem.m_hDC, 0);
|
|
}
|
|
else if (m_bUseVisualStyle && m_themeComboBox->IsAppThemed())
|
|
{
|
|
CComboBox::DefWindowProc(WM_PAINT, (WPARAM)dcMem.m_hDC, 0);
|
|
|
|
if (!m_themeComboBox->IsAppThemeReady())
|
|
{
|
|
dcMem.SelectClipRgn(NULL);
|
|
|
|
BOOL bPressed = (GetKeyState(VK_LBUTTON) < 0) && ::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L) != 0;
|
|
BOOL bSelected = m_bHighlighted || m_bFocused || (::GetCapture() == m_hWnd);
|
|
BOOL bEnabled = IsWindowEnabled();
|
|
BOOL bRightAlign = GetExStyle() & WS_EX_RIGHT;
|
|
|
|
int nState = !bEnabled? CBXS_DISABLED: bPressed? CBXS_PRESSED: bSelected? CBXS_HOT: CBXS_NORMAL;
|
|
|
|
int nThumbWidth = GetSystemMetrics(SM_CXVSCROLL);
|
|
|
|
if (bRightAlign)
|
|
FillRect(dcMem, CRect(rc.left, rc.top, rc.left + 3 + nThumbWidth, rc.bottom), hBrush);
|
|
else
|
|
FillRect(dcMem, CRect(rc.right - nThumbWidth - 3, rc.top, rc.right, rc.bottom), hBrush);
|
|
|
|
CRect rectClient(rc.left + 2, rc.top + 2, rc.right - nThumbWidth - 2, rc.bottom - 2);
|
|
if (bRightAlign)
|
|
rectClient.OffsetRect(nThumbWidth, 0);
|
|
|
|
dcMem.ExcludeClipRect(rectClient);
|
|
|
|
m_themeComboBox->DrawThemeBackground(dcMem, 0, nState, rc, NULL);
|
|
|
|
CRect rcDropDownButton(rc);
|
|
rcDropDownButton.DeflateRect(1, 1);
|
|
if (bRightAlign) rcDropDownButton.right = rcDropDownButton.left + nThumbWidth;
|
|
else rcDropDownButton.left = rcDropDownButton.right - nThumbWidth;
|
|
|
|
m_themeComboBox->DrawThemeBackground(dcMem, CP_DROPDOWNBUTTON, nState, rcDropDownButton, NULL);
|
|
|
|
}
|
|
}
|
|
else if (m_nTheme == xtpControlThemeResource)
|
|
{
|
|
CXTPResourceImage* pImage = XTPResourceImages()->LoadFile(_T("TOOLBARBUTTONSCOMBODROPDOWN"));
|
|
if (!pImage)
|
|
{
|
|
CComboBox::DefWindowProc(WM_PAINT, (WPARAM)dcMem.m_hDC, 0);
|
|
}
|
|
else
|
|
{
|
|
BOOL bPressed = ::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L) != 0;
|
|
BOOL bSelected = m_bFocused || m_bHighlighted;
|
|
BOOL bEnabled = IsWindowEnabled();
|
|
BOOL bRightAlign = GetExStyle() & WS_EX_RIGHT;
|
|
|
|
DefWindowProc(WM_PAINT, (WPARAM)dcMem.GetSafeHdc(), 0);
|
|
dcMem.SelectClipRgn(NULL);
|
|
|
|
DrawFrame(dcMem, rc, 3, hBrush);
|
|
|
|
if (bRightAlign)
|
|
FillRect(dcMem, CRect(rc.left, rc.top, rc.left + GetSystemMetrics(SM_CXVSCROLL) + 3, rc.bottom), hBrush);
|
|
else
|
|
FillRect(dcMem, CRect(rc.right - GetSystemMetrics(SM_CXVSCROLL) - 2, rc.top, rc.right, rc.bottom), hBrush);
|
|
|
|
CRect rcBtn(rc.right - m_nThumbWidth, rc.top, rc.right, rc.bottom);
|
|
if (bRightAlign)
|
|
rcBtn = CRect(rc.left, rc.top, rc.left + m_nThumbWidth, rc.bottom);
|
|
|
|
if (!bEnabled)
|
|
{
|
|
dcMem.Draw3dRect(rc, m_clrBorderDisabled, m_clrBorderDisabled);
|
|
pImage->DrawImage(&dcMem, rcBtn, pImage->GetSource(4, 5), CRect(2, 2, 2, 2));
|
|
}
|
|
else if (bPressed)
|
|
{
|
|
dcMem.Draw3dRect(rc, m_clrBorderNormal, m_clrBorderNormal);
|
|
pImage->DrawImage(&dcMem, rcBtn, pImage->GetSource(3, 5), CRect(2, 2, 2, 2));
|
|
}
|
|
else if (bSelected)
|
|
{
|
|
dcMem.Draw3dRect(rc, m_clrBorderNormal, m_clrBorderNormal);
|
|
pImage->DrawImage(&dcMem, rcBtn, pImage->GetSource(2, 5), CRect(2, 2, 2, 2));
|
|
}
|
|
else
|
|
{
|
|
pImage->DrawImage(&dcMem, rcBtn, pImage->GetSource(0, 5), CRect(2, 2, 2, 2));
|
|
if (m_bFlatStyle)
|
|
{
|
|
dcMem.Draw3dRect(rc, ::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_3DFACE));
|
|
rc.DeflateRect(1,1);
|
|
dcMem.Draw3dRect(rc, ::GetSysColor(COLOR_WINDOW), ::GetSysColor(COLOR_WINDOW));
|
|
}
|
|
else
|
|
{
|
|
dcMem.Draw3dRect(rc, m_clrBorderNormal, m_clrBorderNormal);
|
|
}
|
|
}
|
|
|
|
CPoint pt = rcBtn.CenterPoint();
|
|
|
|
pImage = XTPResourceImages()->LoadFile(_T("TOOLBARBUTTONDROPDOWNGLYPH"));
|
|
|
|
int x = rcBtn.left + ((rcBtn.Width()-5)/2);
|
|
int y = rcBtn.top + ((rcBtn.Height()-4)/2)+1;
|
|
|
|
CRect rcArrow(x, y, x + 5, y + 4);
|
|
|
|
pImage->DrawImage(&dcMem, rcArrow, pImage->GetSource(!bEnabled ? 3 : bSelected ? 1 : 0, 4),
|
|
CRect(0, 0, 0, 0), 0xff00ff);
|
|
|
|
if (!bSelected && !bPressed)
|
|
{
|
|
if (m_bFlatStyle)
|
|
{
|
|
CXTPPenDC pen(dcMem, bEnabled ? ::GetSysColor(COLOR_WINDOW) : ::GetSysColor(COLOR_3DFACE));
|
|
dcMem.MoveTo(rcBtn.left,rcBtn.top+1);
|
|
dcMem.LineTo(rcBtn.left,rcBtn.bottom-1);
|
|
}
|
|
else
|
|
{
|
|
CXTPPenDC pen(dcMem, bEnabled ? m_clrBorderNormal : m_clrBorderDisabled);
|
|
dcMem.MoveTo(rcBtn.left,rcBtn.top+1);
|
|
dcMem.LineTo(rcBtn.left,rcBtn.bottom-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (
|
|
m_nTheme == xtpControlThemeOffice2000 ||
|
|
m_nTheme == xtpControlThemeOfficeXP ||
|
|
m_nTheme == xtpControlThemeOffice2003 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2005 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2008 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2010 ||
|
|
m_nTheme == xtpControlThemeFlat ||
|
|
m_nTheme == xtpControlThemeUltraFlat)
|
|
{
|
|
BOOL bPressed = ::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L) != 0;
|
|
BOOL bSelected = m_bFocused || m_bHighlighted;
|
|
BOOL bEnabled = IsWindowEnabled();
|
|
BOOL bRightAlign = GetExStyle() & WS_EX_RIGHT;
|
|
|
|
COLORREF clrBorders = bSelected? m_clrBorderHot : m_clrBorderNormal;
|
|
|
|
DefWindowProc(WM_PAINT, (WPARAM)dcMem.GetSafeHdc(), 0);
|
|
dcMem.SelectClipRgn(NULL);
|
|
|
|
DrawFrame(dcMem, rc, 3, hBrush);
|
|
|
|
if (bRightAlign)
|
|
FillRect(dcMem, CRect(rc.left, rc.top, rc.left + GetSystemMetrics(SM_CXVSCROLL) + 3, rc.bottom), hBrush);
|
|
else
|
|
FillRect(dcMem, CRect(rc.right - GetSystemMetrics(SM_CXVSCROLL) - 3, rc.top, rc.right, rc.bottom), hBrush);
|
|
|
|
CRect rcBtn(rc.right - m_nThumbWidth, rc.top, rc.right, rc.bottom);
|
|
if (bRightAlign)
|
|
rcBtn = CRect(rc.left, rc.top, rc.left + m_nThumbWidth, rc.bottom);
|
|
|
|
if (!bSelected && !bPressed && bEnabled && m_bFlatStyle)
|
|
{
|
|
dcMem.Draw3dRect(rc, GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DFACE));
|
|
|
|
if (m_nTheme == xtpControlThemeOffice2003 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2005 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2008 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2010)
|
|
{
|
|
rcBtn.DeflateRect(1, 1);
|
|
XTPDrawHelpers()->GradientFill(&dcMem, &rcBtn, m_grcButton, FALSE);
|
|
}
|
|
else
|
|
{
|
|
COLORREF clrButton = m_clrButtonNormal;
|
|
rcBtn.DeflateRect(1, 1);
|
|
dcMem.FillSolidRect(rcBtn, clrButton);
|
|
}
|
|
|
|
DrawFrame(dcMem, rcBtn, 1, hBrush);
|
|
}
|
|
else if (m_nTheme == xtpControlThemeOffice2000)
|
|
{
|
|
if (m_bFlatStyle && !bEnabled)
|
|
{
|
|
dcMem.Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DSHADOW));
|
|
rcBtn.DeflateRect(1, 1);
|
|
}
|
|
else
|
|
{
|
|
dcMem.Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHILIGHT));
|
|
dcMem.Draw3dRect(rc.left + 1, rc.top + 1, rc.Width() - 2, rc.Height() - 2,
|
|
GetXtremeColor(COLOR_BTNFACE), GetXtremeColor(COLOR_BTNFACE));
|
|
|
|
COLORREF clrButton = bPressed ? m_clrButtonPressed : bSelected ? m_clrButtonHot : m_clrButtonNormal;
|
|
rcBtn.DeflateRect(1, 1);
|
|
dcMem.FillSolidRect(rcBtn, clrButton);
|
|
|
|
dcMem.Draw3dRect(rcBtn.left + 1, rcBtn.top + 1, rcBtn.Width() - 2, rcBtn.Height() - 2,
|
|
GetXtremeColor(bPressed ? COLOR_3DSHADOW : COLOR_3DHILIGHT), GetXtremeColor(bPressed ? COLOR_3DHILIGHT : COLOR_3DSHADOW));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dcMem.Draw3dRect(rc, bEnabled ? clrBorders : GetXtremeColor(COLOR_3DSHADOW), bEnabled ? clrBorders : GetXtremeColor(COLOR_3DSHADOW));
|
|
|
|
if ((
|
|
m_nTheme == xtpControlThemeOffice2003 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2005 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2008 ||
|
|
m_nTheme == xtpControlThemeVisualStudio2010) && bEnabled)
|
|
{
|
|
CXTPPaintManagerColorGradient& clrButton = bPressed ? m_grcButtonPushed : bSelected ? m_grcButtonHilite : m_grcButton;
|
|
|
|
if (m_nTheme == xtpControlThemeVisualStudio2010 && !bPressed && bSelected)
|
|
{
|
|
CRect rc[2];
|
|
|
|
rc[0] = rcBtn;
|
|
rc[0].bottom = rc[0].top + rcBtn.Height()/2;
|
|
dcMem.FillSolidRect(&rc[0], m_grcButtonHilite.clrLight);
|
|
|
|
rc[1] = rcBtn;
|
|
rc[1].top += rcBtn.Height()/2;
|
|
dcMem.FillSolidRect(&rc[1], m_grcButtonHilite.clrDark);
|
|
}
|
|
else
|
|
{
|
|
XTPDrawHelpers()->GradientFill(&dcMem, &rcBtn, clrButton, FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
COLORREF clrButton = bPressed ? m_clrButtonPressed : bSelected ? m_clrButtonHot : m_clrButtonNormal;
|
|
dcMem.FillSolidRect(rcBtn, clrButton);
|
|
}
|
|
|
|
dcMem.Draw3dRect(rcBtn, bEnabled ? clrBorders : GetXtremeColor(COLOR_3DSHADOW), bEnabled ? clrBorders : GetXtremeColor(COLOR_3DSHADOW));
|
|
|
|
rcBtn.DeflateRect(1, 1);
|
|
|
|
if (m_nTheme == xtpControlThemeFlat && !bPressed)
|
|
dcMem.Draw3dRect(rcBtn, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(COLOR_3DHILIGHT));
|
|
}
|
|
|
|
CPoint pt(rcBtn.CenterPoint());
|
|
int nWidth = max(2, rcBtn.Width() / 2 - 4);
|
|
|
|
XTPDrawHelpers()->Triangle(&dcMem, CPoint(pt.x - nWidth, pt.y - nWidth/2), CPoint(pt.x + nWidth, pt.y - nWidth/2),
|
|
CPoint (pt.x , pt.y - nWidth/2 + nWidth),
|
|
!bEnabled ? GetXtremeColor(XPCOLOR_DISABLED) : bPressed ? m_clrButtonArrowPressed:
|
|
bSelected ? m_clrButtonArrowHot : m_clrButtonArrowNormal);
|
|
|
|
if (!bEnabled && m_bFlatStyle)
|
|
{
|
|
CXTPPenDC pen(dcMem, m_clrButtonNormal);
|
|
dcMem.MoveTo(rcBtn.left-1,rcBtn.top);
|
|
dcMem.LineTo(rcBtn.left-1,rcBtn.bottom);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DefWindowProc(WM_PAINT, (WPARAM)dcMem.GetSafeHdc(), 0);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void CXTPComboBox::FillSolidRect(HDC hdc, int x, int y, int cx, int cy, HBRUSH hBrush)
|
|
{
|
|
::FillRect(hdc, CRect(x, y, x + cx, y + cy), hBrush);
|
|
}
|
|
|
|
void CXTPComboBox::DrawFrame(HDC hdc, LPRECT lprc, int nSize, HBRUSH hBrush)
|
|
{
|
|
FillSolidRect(hdc, lprc->left, lprc->top, lprc->right - lprc->left - nSize, nSize, hBrush);
|
|
FillSolidRect(hdc, lprc->left, lprc->top, nSize, lprc->bottom - lprc->top - nSize, hBrush);
|
|
FillSolidRect(hdc, lprc->right - nSize, lprc->top, nSize, lprc->bottom - lprc->top, hBrush);
|
|
FillSolidRect(hdc, lprc->left, lprc->bottom - nSize, lprc->right - lprc->left, nSize, hBrush);
|
|
}
|
|
|
|
HBRUSH CXTPComboBox::GetClientBrush(CDC* pDC)
|
|
{
|
|
CWnd* pwndEdit = GetWindow(GW_CHILD);
|
|
|
|
BOOL bDisabled = !IsWindowEnabled() || (pwndEdit && pwndEdit->GetStyle() & ES_READONLY);
|
|
|
|
HBRUSH hBrush = (HBRUSH)::SendMessage(::GetParent(m_hWnd), bDisabled ? WM_CTLCOLORSTATIC : WM_CTLCOLOREDIT, (WPARAM)pDC->GetSafeHdc(), (LPARAM)m_hWnd);
|
|
|
|
if (hBrush)
|
|
return hBrush;
|
|
|
|
return GetSysColorBrush(bDisabled ? COLOR_3DFACE : COLOR_WINDOW);
|
|
}
|
|
|
|
void CXTPComboBox::OnMouseLeave()
|
|
{
|
|
Default();
|
|
|
|
if (m_wndEdit)
|
|
{
|
|
CPoint pt;
|
|
GetCursorPos(&pt);
|
|
|
|
CXTPWindowRect rcEdit(m_wndEdit);
|
|
|
|
if (rcEdit.PtInRect(pt))
|
|
{
|
|
TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_wndEdit, HOVER_DEFAULT};
|
|
_TrackMouseEvent(&tme);
|
|
|
|
SetHighlighted(TRUE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
SetHighlighted(FALSE);
|
|
}
|
|
|
|
void CXTPComboBox::SetHighlighted(BOOL bHot)
|
|
{
|
|
if (bHot != m_bHighlighted)
|
|
{
|
|
m_bHighlighted = bHot;
|
|
RedrawFocusedFrame();
|
|
|
|
if (bHot)
|
|
{
|
|
TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, HOVER_DEFAULT};
|
|
_TrackMouseEvent(&tme);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPComboBox::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
CRect rc;
|
|
GetClientRect(&rc);
|
|
|
|
BOOL bHot = rc.PtInRect(point) && !m_bFocused;
|
|
SetHighlighted(bHot);
|
|
|
|
CComboBox::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPComboBoxEditCtrl, CEdit)
|
|
//{{AFX_MSG_MAP(CComboBoxCtrl)
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_SETFOCUS()
|
|
ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
|
|
ON_WM_MOUSEMOVE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
void CXTPComboBoxEditCtrl::OnMouseLeave()
|
|
{
|
|
CXTPComboBox* pControl = (CXTPComboBox*)GetParent();
|
|
|
|
if (pControl->m_bHighlighted)
|
|
{
|
|
TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, pControl->m_hWnd, HOVER_DEFAULT};
|
|
_TrackMouseEvent(&tme);
|
|
}
|
|
}
|
|
|
|
void CXTPComboBoxEditCtrl::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
CRect rc;
|
|
GetClientRect(&rc);
|
|
|
|
CXTPComboBox* pControl = (CXTPComboBox*)GetParent();
|
|
|
|
BOOL bHot = rc.PtInRect(point) && !pControl->m_bFocused;
|
|
if (bHot != pControl->m_bHighlighted)
|
|
{
|
|
pControl->m_bHighlighted = bHot;
|
|
pControl->RedrawFocusedFrame();
|
|
|
|
if (bHot)
|
|
{
|
|
TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, HOVER_DEFAULT};
|
|
_TrackMouseEvent(&tme);
|
|
}
|
|
}
|
|
|
|
|
|
CEdit::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void CXTPComboBoxEditCtrl::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CEdit::OnKillFocus(pNewWnd);
|
|
|
|
CXTPComboBox* pControl = (CXTPComboBox*)GetParent();
|
|
if (pNewWnd != GetParent())
|
|
{
|
|
pControl->m_bFocused = FALSE;
|
|
pControl->RedrawFocusedFrame();
|
|
}
|
|
}
|
|
|
|
void CXTPComboBoxEditCtrl::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CEdit::OnSetFocus(pOldWnd);
|
|
|
|
CXTPComboBox* pControl = (CXTPComboBox*)GetParent();
|
|
|
|
pControl->m_bFocused = TRUE;
|
|
pControl->m_bHighlighted = FALSE;
|
|
pControl->RedrawFocusedFrame();
|
|
}
|
|
|
|
void CXTPComboBox::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CComboBox::OnKillFocus(pNewWnd);
|
|
|
|
if (pNewWnd != &m_wndEdit)
|
|
{
|
|
m_bFocused = FALSE;
|
|
RedrawFocusedFrame();
|
|
}
|
|
}
|
|
|
|
void CXTPComboBox::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CComboBox::OnSetFocus(pOldWnd);
|
|
|
|
m_bFocused = TRUE;
|
|
m_bHighlighted = FALSE;
|
|
RedrawFocusedFrame();
|
|
}
|
|
|
|
|
|
BOOL CXTPComboBox::NeedRedraw()
|
|
{
|
|
return (m_nTheme != 0) || (m_bUseVisualStyle && m_themeComboBox->IsAppThemed());
|
|
}
|
|
|
|
|
|
void CXTPComboBox::RedrawFocusedFrame()
|
|
{
|
|
if (((GetStyle() & 3) != CBS_SIMPLE) && NeedRedraw())
|
|
{
|
|
Invalidate(FALSE);
|
|
}
|
|
}
|
|
|
|
void CXTPComboBox::OnSysColorChange()
|
|
{
|
|
CComboBox::OnSysColorChange();
|
|
|
|
RefreshMetrics();
|
|
Invalidate(FALSE);
|
|
}
|
|
|
|
BOOL CXTPComboBox::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
// Make sure that the keystrokes continue to the edit control.
|
|
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP)
|
|
{
|
|
// if tab, return or escape key, just use default.
|
|
switch (pMsg->wParam)
|
|
{
|
|
case VK_DELETE:
|
|
case VK_BACK:
|
|
{
|
|
if (m_bAutoComp)
|
|
{
|
|
m_bDisableAC = (pMsg->message == WM_KEYDOWN);
|
|
}
|
|
break;
|
|
}
|
|
case VK_TAB:
|
|
case VK_RETURN:
|
|
case VK_ESCAPE:
|
|
{
|
|
return CComboBox::PreTranslateMessage(pMsg);
|
|
}
|
|
}
|
|
|
|
// If the combo box has an edit control, don't allow
|
|
// the framework to process accelerators, let the edit
|
|
// control handle it instead. GetEditSel() will return
|
|
// CB_ERR if there is no edit control present...
|
|
|
|
if (GetEditSel() != (DWORD)CB_ERR)
|
|
{
|
|
::TranslateMessage(pMsg);
|
|
::DispatchMessage(pMsg);
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return CComboBox::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
BOOL CXTPComboBox::OnEditUpdate()
|
|
{
|
|
// if we are not to auto update the text, get outta here
|
|
if (m_bAutoComp)
|
|
{
|
|
if (m_bDisableAC)
|
|
{
|
|
Default();
|
|
}
|
|
else
|
|
{
|
|
// Get the text in the edit box
|
|
CString strItemTyped;
|
|
GetWindowText(strItemTyped);
|
|
int nLength = strItemTyped.GetLength();
|
|
|
|
if (nLength >= 1)
|
|
{
|
|
// Currently selected range
|
|
DWORD dwCurSel = GetEditSel();
|
|
int nStart = LOWORD(dwCurSel);
|
|
int nEnd = HIWORD(dwCurSel);
|
|
|
|
// Search for, and select in, and string in the combo box that is prefixed
|
|
// by the text in the edit box
|
|
if (SelectString(-1, strItemTyped) == CB_ERR)
|
|
{
|
|
SetWindowText(strItemTyped); // No text selected, so restore what was there before
|
|
if (dwCurSel != (DWORD)CB_ERR)
|
|
{
|
|
SetEditSel(nStart, nEnd); //restore cursor postion
|
|
}
|
|
}
|
|
|
|
// Set the text selection as the additional text that we have added
|
|
if (nEnd < nLength && dwCurSel != (DWORD)CB_ERR)
|
|
{
|
|
SetEditSel(nStart, nEnd);
|
|
}
|
|
else
|
|
{
|
|
SetEditSel(nLength, -1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CXTPComboBox::OnEndSel()
|
|
{
|
|
if (NeedRedraw())
|
|
{
|
|
Invalidate();
|
|
}
|
|
|
|
return FALSE;
|
|
}
|