📄 bcgpproplist.cpp
字号:
m_pWndList->m_ToolTip.AddTool (m_pWndList, LPSTR_TEXTCALLBACK, rectName, m_pWndList->m_nTooltipsCount + 1);
m_pWndList->m_nTooltipsCount ++;
if (!IsGroup ())
{
CRect rectValue = m_Rect;
rectValue.left = rectName.right + 1;
m_pWndList->m_ToolTip.AddTool (m_pWndList, LPSTR_TEXTCALLBACK, rectValue, m_pWndList->m_nTooltipsCount + 1);
m_pWndList->m_nTooltipsCount ++;
}
}
}
else
{
m_Rect.SetRectEmpty ();
m_rectButton.SetRectEmpty ();
}
for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
{
CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
ASSERT_VALID (pProp);
pProp->Repos (y);
}
OnPosSizeChanged (rectOld);
}
//******************************************************************************************
void CBCGPProp::AddTerminalProp (CList<CBCGPProp*, CBCGPProp*>& lstProps)
{
ASSERT_VALID (this);
if (!m_bGroup)
{
// Insert sorted:
BOOL bInserted = FALSE;
for (POSITION pos = lstProps.GetHeadPosition (); !bInserted && pos != NULL;)
{
POSITION posSave = pos;
CBCGPProp* pProp = lstProps.GetNext (pos);
if (pProp->m_strName > m_strName)
{
lstProps.InsertBefore (posSave, this);
bInserted = TRUE;
}
}
if (!bInserted)
{
lstProps.AddTail (this);
}
return;
}
m_Rect.SetRectEmpty ();
for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
{
CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
ASSERT_VALID (pProp);
pProp->AddTerminalProp (lstProps);
}
}
//****************************************************************************************
BOOL CBCGPProp::IsSubItem (CBCGPProp* pSubProp) const
{
ASSERT_VALID (this);
ASSERT_VALID (pSubProp);
for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
{
CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
ASSERT_VALID (pProp);
if (pSubProp == pProp || pProp->IsSubItem (pSubProp))
{
return TRUE;
}
}
return FALSE;
}
//******************************************************************************************
CBCGPProp* CBCGPProp::FindSubItemByData (DWORD dwData) const
{
ASSERT_VALID (this);
for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
{
CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
ASSERT_VALID (pProp);
if (pProp->m_dwData == dwData)
{
return pProp;
}
pProp = pProp->FindSubItemByData (dwData);
if (pProp != NULL)
{
return pProp;
}
}
return NULL;
}
//*****************************************************************************************
CString CBCGPProp::FormatProperty ()
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndList);
_variant_t& var = m_varValue;
CString strVal;
switch (var.vt)
{
case VT_BSTR:
strVal = (LPCTSTR)(_bstr_t)var;
break;
case VT_I2:
strVal.Format (m_strFormatShort, (short) var);
break;
case VT_I4:
strVal.Format (m_strFormatLong, (long) var);
break;
case VT_UI2:
strVal.Format( m_strFormatUShort, var.uiVal);
break;
case VT_UI4:
strVal.Format (m_strFormatULong, var.ulVal);
break;
case VT_R4:
strVal.Format (m_strFormatFloat, (float) var);
break;
case VT_R8:
strVal.Format (m_strFormatDouble, (double) var);
break;
case VT_BOOL:
{
bool bVal = (bool) var;
strVal = bVal ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;
}
break;
default:
// Unsupported type
strVal = _T("*** error ***");
}
return strVal;
}
//****************************************************************************************
void CBCGPProp::OnDrawName (CDC* pDC, CRect rect)
{
ASSERT_VALID (this);
ASSERT_VALID (pDC);
ASSERT_VALID (m_pWndList);
COLORREF clrTextOld = (COLORREF)-1;
if (IsSelected () && (!m_pWndList->m_bVSDotNetLook || !IsGroup ()))
{
CRect rectFill = rect;
rectFill.top++;
if (!m_pWndList->m_bFocused)
{
clrTextOld = pDC->SetTextColor (globalData.clrBtnText);
pDC->FillRect (rectFill,
m_pWndList->m_bControlBarColors ? &globalData.brBarFace : &globalData.brBtnFace);
}
else
{
clrTextOld = pDC->SetTextColor (globalData.clrTextHilite);
pDC->FillRect (rectFill, &globalData.brHilite);
}
}
if (m_pWndList->m_bVSDotNetLook && IsGroup ())
{
clrTextOld = pDC->SetTextColor (
m_pWndList->m_bControlBarColors ? globalData.clrBarShadow : globalData.clrBtnShadow);
}
rect.DeflateRect (TEXT_MARGIN, 0);
int nTextHeight = pDC->DrawText (m_strName, rect,
DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
m_bNameIsTrancated = pDC->GetTextExtent (m_strName).cx > rect.Width ();
if (IsSelected () && m_pWndList->m_bVSDotNetLook && IsGroup ())
{
CRect rectFocus = rect;
rectFocus.top = rectFocus.CenterPoint ().y - nTextHeight / 2;
rectFocus.bottom = rectFocus.top + nTextHeight;
rectFocus.right =
min (rect.right, rectFocus.left + pDC->GetTextExtent (m_strName).cx);
rectFocus.InflateRect (2, 0);
COLORREF clrShadow = m_pWndList->m_bControlBarColors ?
globalData.clrBarShadow : globalData.clrBtnShadow;
pDC->Draw3dRect (rectFocus, clrShadow, clrShadow);
}
if (clrTextOld != (COLORREF)-1)
{
pDC->SetTextColor (clrTextOld);
}
}
//******************************************************************************************
void CBCGPProp::OnDrawValue (CDC* pDC, CRect rect)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndList);
if (IsGroup () || !HasValueField ())
{
return;
}
CString strVal = FormatProperty ();
rect.DeflateRect (TEXT_MARGIN, 0);
pDC->DrawText (strVal, rect,
DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
m_bValueIsTrancated = pDC->GetTextExtent (strVal).cx > rect.Width ();
}
//******************************************************************************************
void CBCGPProp::OnDrawButton (CDC* pDC, CRect rect)
{
ASSERT_VALID (this);
ASSERT_VALID (pDC);
ASSERT_VALID (m_pWndList);
CBCGPToolbarComboBoxButton button;
CBCGPVisualManager::BCGBUTTON_STATE state =
m_bButtonIsDown ?
CBCGPVisualManager::ButtonsIsPressed :
CBCGPVisualManager::ButtonsIsRegular;
CBCGPVisualManager::GetInstance ()->OnFillButtonInterior (pDC,
&button, rect, state);
pDC->FillRect (rect, m_pWndList->m_bControlBarColors ?
&globalData.brBarFace : &globalData.brBtnFace);
if (m_dwFlags & PROP_HAS_LIST)
{
CBCGPVisualManager::GetInstance ()->OnDrawComboDropButton (pDC,
rect, !m_bEnabled, m_bButtonIsDown, m_bButtonIsDown, &button);
return;
}
CString str = _T("...");
pDC->DrawText (str, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
CBCGPVisualManager::GetInstance ()->OnDrawButtonBorder (pDC, &button, rect, state);
}
//****************************************************************************************
void CBCGPProp::OnDrawExpandBox (CDC* pDC, CRect rect)
{
ASSERT_VALID (this);
ASSERT_VALID (pDC);
ASSERT_VALID (m_pWndList);
ASSERT (IsGroup ());
CPoint ptCenter = rect.CenterPoint ();
int nBoxSize = min (9, rect.Width ());
rect = CRect (ptCenter, CSize (1, 1));
rect.InflateRect (nBoxSize / 2, nBoxSize / 2);
COLORREF clrShadow = m_pWndList->m_bControlBarColors ?
globalData.clrBarShadow : globalData.clrBtnShadow;
COLORREF clrText = m_pWndList->m_bControlBarColors ?
globalData.clrBarText : globalData.clrBtnText;
CBCGPVisualManager::GetInstance ()->OnDrawExpandingBox (pDC, rect,
m_bExpanded && !m_lstSubItems.IsEmpty (),
m_pWndList->m_bVSDotNetLook ? clrText : clrShadow);
}
//******************************************************************************************
BOOL CBCGPProp::OnUpdateValue ()
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndInPlace);
ASSERT_VALID (m_pWndList);
ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
CString strText;
m_pWndInPlace->GetWindowText (strText);
BOOL bRes = FALSE;
BOOL bIsChanged = FormatProperty () != strText;
switch (m_varValue.vt)
{
case VT_BSTR:
m_varValue = (LPCTSTR) strText;
bRes = TRUE;
break;
case VT_I2:
m_varValue = (short) _ttoi (strText);
bRes = TRUE;
break;
case VT_I4:
m_varValue = _ttol (strText);
bRes = TRUE;
break;
case VT_UI2:
m_varValue.uiVal = unsigned short (_ttoi (strText));
bRes = TRUE ;
break;
case VT_UI4:
m_varValue.ulVal = unsigned long (_ttol (strText));
bRes = TRUE ;
break;
case VT_R4:
{
float fVal;
_stscanf (strText, m_strFormatFloat, &fVal);
m_varValue = fVal;
bRes = TRUE;
}
break;
case VT_R8:
{
double dblVal;
_stscanf (strText, m_strFormatDouble, &dblVal);
m_varValue = dblVal;
bRes = TRUE;
}
break;
case VT_DATE:
break;
case VT_BOOL:
{
m_varValue = (bool) (strText == m_pWndList->m_strTrue);
bRes = TRUE;
}
break;
default:
break;
}
if (bRes && bIsChanged)
{
m_pWndList->OnPropertyChanged (this);
}
return bRes;
}
//******************************************************************************************
BOOL CBCGPProp::OnEdit (LPPOINT /*lptClick*/)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndList);
if (!HasValueField ())
{
return FALSE;
}
m_pWndInPlace = NULL;
CRect rectEdit = m_Rect;
rectEdit.DeflateRect (0, 2);
rectEdit.left = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth + TEXT_MARGIN + 1;
if (HasButton ())
{
m_rectButton = m_Rect;
m_rectButton.left = m_rectButton.right - m_rectButton.Height () + 3;
m_rectButton.top ++;
rectEdit.right = m_rectButton.left;
}
CRect rectSpin;
if (m_dwFlags & PROP_HAS_SPIN)
{
rectSpin = m_Rect;
rectSpin.right = rectEdit.right;
rectSpin.left = rectSpin.right - rectSpin.Height ();
rectSpin.top ++;
rectEdit.right = rectSpin.left;
}
BOOL bDefaultFormat = FALSE;
m_pWndInPlace = CreateInPlaceEdit (rectEdit, bDefaultFormat);
if (m_pWndInPlace != NULL)
{
if (bDefaultFormat)
{
m_pWndInPlace->SetWindowText (FormatProperty ());
}
if (m_dwFlags & PROP_HAS_LIST)
{
CRect rectCombo = m_Rect;
rectCombo.left = rectEdit.left - 4;
m_pWndCombo = CreateCombo (m_pWndList, rectCombo);
ASSERT_VALID (m_pWndCombo);
m_pWndCombo->SetFont (m_pWndList->GetFont ());
//-----------------------------------------------------------------------
// Synchronize bottom edge of the combobox with the property bottom edge:
//-----------------------------------------------------------------------
m_pWndCombo->GetWindowRect (rectCombo);
m_pWndList->ScreenToClient (&rectCombo);
int dy = rectCombo.Height () - m_Rect.Height ();
m_pWndCombo->SetWindowPos (NULL, rectCombo.left,
rectCombo.top - dy + 1, -1, -1, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
if (m_varValue.vt == VT_BOOL)
{
m_lstOptions.AddTail (m_pWndList->m_strTrue);
m_lstOptions.AddTail (m_pWndList->m_strFalse);
}
for (POSITION pos = m_lstOptions.GetHeadPosition (); pos != NULL;)
{
m_pWndCombo->AddString (m_lstOptions.GetNext (pos));
}
}
if (m_dwFlags & PROP_HAS_SPIN)
{
m_pWndSpin = CreateSpinControl (rectSpin);
}
m_pWndInPlace->SetFont (m_pWndList->GetFont ());
m_pWndInPlace->SetFocus ();
if (!m_bAllowEdit)
{
m_pWndInPlace->HideCaret ();
}
m_bInPlaceEdit = TRUE;
return TRUE;
}
return FALSE;
}
//******************************************************************************************
CWnd* CBCGPProp::CreateInPlaceEdit (CRect rectEdit, BOOL& bDefaultFormat)
{
switch (m_varValue.vt)
{
case VT_BSTR:
case VT_R4:
case VT_R8:
case VT_I2:
case VT_I4:
case VT_UI2:
case VT_UI4:
case VT_BOOL:
{
CEdit* pWndEdit = NULL;
if (!m_strEditMask.IsEmpty () || !m_strEditTempl.IsEmpty () ||
!m_strValidChars.IsEmpty ())
{
CBCGPMaskEdit* pWndEditMask = new CBCGPMaskEdit;
if (!m_strEditMask.IsEmpty () && !m_strEditTempl.IsEmpty ())
{
pWndEditMask->EnableMask (m_strEditMask, m_strEditTempl, _T(' '));
}
if (!m_strValidChars.IsEmpty ())
{
pWndEditMask->SetValidChars (m_strValidChars);
}
pWndEdit = pWndEditMask;
}
else
{
pWndEdit = new CEdit;
}
DWORD dwStyle = WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL;
if (!m_bEnabled || !m_bAllowEdit)
{
dwStyle |= ES_READONLY;
}
pWndEdit->Create (dwStyle, rectEdit, m_pWndList, BCGPROPLIST_ID_INPLACE);
bDefaultFormat = TRUE;
return pWndEdit;
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -