📄 bcgpproplist.cpp
字号:
}
//*****************************************************************************************
CBCGPFileProp::~CBCGPFileProp()
{
}
//****************************************************************************************
void CBCGPFileProp::OnClickButton (CPoint /*point*/)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndList);
ASSERT_VALID (m_pWndInPlace);
ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
m_bButtonIsDown = TRUE;
Redraw ();
CString strPath = (LPCTSTR)(_bstr_t)m_varValue;
BOOL bUpdate = FALSE;
if (m_bIsFolder)
{
if (g_pShellManager == NULL)
{
if (g_pWorkspace != NULL)
{
g_pWorkspace->InitShellManager ();
}
}
if (g_pShellManager == NULL)
{
ASSERT (FALSE);
}
else
{
bUpdate = g_pShellManager->BrowseForFolder (strPath, m_pWndList, strPath);
}
}
else
{
CFileDialog dlg (m_bOpenFileDialog, m_strDefExt, strPath, m_dwFileOpenFlags, m_strFilter,
m_pWndList);
if (dlg.DoModal () == IDOK)
{
bUpdate = TRUE;
strPath = dlg.GetPathName ();
}
}
if (bUpdate)
{
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetWindowText (strPath);
}
m_varValue = (LPCTSTR) strPath;
}
m_bButtonIsDown = FALSE;
Redraw ();
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetFocus ();
}
else
{
m_pWndList->SetFocus ();
}
}
/////////////////////////////////////////////////////////////////////////////
// CBCGPDateTimeProp object
IMPLEMENT_DYNAMIC(CBCGPDateTimeProp, CBCGPProp)
CBCGPDateTimeProp::CBCGPDateTimeProp(const CString& strName, const COleDateTime& date,
LPCTSTR lpszDescr/* = NULL*/, DWORD dwData/* = 0*/,
UINT nFlags/* = CBCGPDateTimeCtrl::DTM_DATE | CBCGPDateTimeCtrl::DTM_TIME | CBCGPDateTimeCtrl::DTM_DROPCALENDAR*/) :
CBCGPProp (strName, _variant_t(date, VT_DATE), lpszDescr, dwData)
{
m_nFlags = nFlags;
}
//*****************************************************************************************
CBCGPDateTimeProp::~CBCGPDateTimeProp()
{
}
//****************************************************************************************
void CBCGPDateTimeProp::OnDrawValue (CDC* pDC, CRect rect)
{
rect.DeflateRect (0, 2);
rect.left = m_pWndList->GetListRect ().left +
m_pWndList->GetPropertyColumnWidth () + TEXT_MARGIN + 1;
DRAWITEMSTRUCT dis;
memset (&dis, 0, sizeof (DRAWITEMSTRUCT));
dis.CtlType = ODT_BUTTON;
dis.hDC = pDC->GetSafeHdc ();
dis.rcItem = rect;
m_wndDateTime.m_bDrawDateTimeOnly = !IsSelected () || !m_bEnabled;
m_wndDateTime.SetTextColor (m_bEnabled ? (COLORREF)-1 : globalData.clrGrayedText, FALSE);
m_wndDateTime.DrawItem (&dis);
}
//*****************************************************************************
CWnd* CBCGPDateTimeProp::CreateInPlaceEdit (CRect rectEdit, BOOL& bDefaultFormat)
{
CBCGPDateTimeCtrl* pDateTime = new CBCGPDateTimeCtrl;
ASSERT_VALID (pDateTime);
pDateTime->SetAutoResize (FALSE);
rectEdit.bottom++;
pDateTime->Create (_T(""), WS_CHILD | WS_VISIBLE, rectEdit,
m_pWndList, BCGPROPLIST_ID_INPLACE);
SetState (*pDateTime);
pDateTime->SetDate (GetDate ());
bDefaultFormat = FALSE;
return pDateTime;
}
//*******************************************************************************
void CBCGPDateTimeProp::OnPosSizeChanged (CRect /*rectOld*/)
{
CRect rectEdit = m_Rect;
rectEdit.DeflateRect (0, 2);
rectEdit.left = m_pWndList->GetListRect ().left +
m_pWndList->GetPropertyColumnWidth () + TEXT_MARGIN + 1;
rectEdit.bottom++;
if (m_wndDateTime.GetSafeHwnd () == NULL)
{
m_wndDateTime.SetAutoResize (FALSE);
m_wndDateTime.Create (_T(""), WS_CHILD, rectEdit,
m_pWndList, (UINT)-1);
SetState (m_wndDateTime);
m_wndDateTime.SetDate (GetDate ());
}
else
{
m_wndDateTime.SetWindowPos (NULL, rectEdit.left, rectEdit.top,
rectEdit.Width (), rectEdit.Height (),
SWP_NOZORDER | SWP_NOACTIVATE);
}
m_wndDateTime.AdjustControl (rectEdit);
}
//******************************************************************************************
BOOL CBCGPDateTimeProp::OnUpdateValue ()
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndInPlace);
ASSERT_VALID (m_pWndList);
ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
CBCGPDateTimeCtrl* pDateTime = DYNAMIC_DOWNCAST (CBCGPDateTimeCtrl, m_pWndInPlace);
ASSERT_VALID (pDateTime);
COleDateTime dateOld = GetDate ();
COleDateTime dateNew = pDateTime->GetDate ();
m_varValue = _variant_t (dateNew, VT_DATE);
m_wndDateTime.SetDate (dateNew);
if (dateOld != dateNew)
{
m_pWndList->OnPropertyChanged (this);
}
return TRUE;
}
//********************************************************************************
void CBCGPDateTimeProp::SetDate (COleDateTime date)
{
ASSERT_VALID (this);
SetValue (_variant_t (date, VT_DATE));
}
//*********************************************************************************
void CBCGPDateTimeProp::SetState (CBCGPDateTimeCtrl& wnd)
{
ASSERT (wnd.GetSafeHwnd () != NULL);
UINT stateFlags = 0;
if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
{
stateFlags |= (CBCGPDateTimeCtrl::DTM_DATE | CBCGPDateTimeCtrl::DTM_DROPCALENDAR);
}
if (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME))
{
stateFlags |= (CBCGPDateTimeCtrl::DTM_TIME);
}
const UINT stateMask =
CBCGPDateTimeCtrl::DTM_SPIN |
CBCGPDateTimeCtrl::DTM_DROPCALENDAR |
CBCGPDateTimeCtrl::DTM_DATE |
CBCGPDateTimeCtrl::DTM_TIME24H |
CBCGPDateTimeCtrl::DTM_CHECKBOX |
CBCGPDateTimeCtrl::DTM_TIME |
CBCGPDateTimeCtrl::DTM_TIME24HBYLOCALE;
wnd.SetState (stateFlags, stateMask);
}
//********************************************************************************
void CBCGPDateTimeProp::OnSetSelection (CBCGPProp* /*pOldSel*/)
{
Redraw ();
}
//********************************************************************************
void CBCGPDateTimeProp::OnKillSelection (CBCGPProp* /*pNewSel*/)
{
Redraw ();
}
//********************************************************************************
BOOL CBCGPDateTimeProp::PushChar (UINT nChar)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndList);
ASSERT (m_pWndList->GetCurSel () == this);
ASSERT_VALID (m_pWndInPlace);
if (m_bEnabled && m_bAllowEdit)
{
CString str = (TCHAR) nChar;
str.MakeUpper ();
m_pWndInPlace->SendMessage (WM_KEYDOWN, (WPARAM) str [0]);
return TRUE;
}
OnEndEdit ();
ReleaseCapture ();
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CBCGPFontProp object
IMPLEMENT_DYNAMIC(CBCGPFontProp, CBCGPProp)
CBCGPFontProp::CBCGPFontProp(const CString& strName, LOGFONT& lf, DWORD dwFontDialogFlags, LPCTSTR lpszDescr, DWORD dwData) :
CBCGPProp (strName, _variant_t((LPCTSTR)lf.lfFaceName), lpszDescr, dwData),
m_dwFontDialogFlags (dwFontDialogFlags)
{
m_dwFlags = PROP_HAS_BUTTON;
m_lf = lf;
m_bAllowEdit = FALSE;
}
//*****************************************************************************************
CBCGPFontProp::~CBCGPFontProp()
{
}
//****************************************************************************************
void CBCGPFontProp::OnClickButton (CPoint /*point*/)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pWndList);
ASSERT_VALID (m_pWndInPlace);
ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
LOGFONT lfPrev = m_lf;
m_bButtonIsDown = TRUE;
Redraw ();
CFontDialog dlg (&m_lf, m_dwFontDialogFlags, NULL, m_pWndList);
if (dlg.DoModal () == IDOK)
{
dlg.GetCurrentFont (&m_lf);
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetWindowText (FormatProperty ());
if (memcmp (&lfPrev, &m_lf, sizeof (lfPrev) - sizeof (lfPrev.lfFaceName)) ||
_tcscmp( lfPrev.lfFaceName, m_lf.lfFaceName))
{
m_pWndList->OnPropertyChanged (this);
}
}
else
{
m_varValue = (LPCTSTR) FormatProperty ();
}
}
if (m_pWndInPlace != NULL)
{
m_pWndInPlace->SetFocus ();
}
else
{
m_pWndList->SetFocus ();
}
m_bButtonIsDown = FALSE;
Redraw ();
}
//*****************************************************************************
CString CBCGPFontProp::FormatProperty ()
{
CString str;
CWindowDC dc (m_pWndList);
int nLogY = dc.GetDeviceCaps (LOGPIXELSY);
if (nLogY != 0)
{
str.Format( _T("%s(%i)"), m_lf.lfFaceName,
MulDiv (72, -m_lf.lfHeight, nLogY));
}
else
{
str = m_lf.lfFaceName;
}
return str;
}
/////////////////////////////////////////////////////////////////////////////
// CBCGPPropList
IMPLEMENT_DYNAMIC(CBCGPPropList, CWnd)
/////////////////////////////////////////////////////////////////////////////
// CBCGPPropList notification messages:
UINT BCGM_PROPERTY_CHANGED = ::RegisterWindowMessage (_T("BCGM_PROPERTYCHANGED"));
CBCGPPropList::CBCGPPropList()
{
m_hFont = NULL;
m_bHeaderCtrl = TRUE;
m_bDescriptionArea = FALSE;
m_nDescrHeight = -1;
m_bAlphabeticMode = FALSE;
m_bVSDotNetLook = FALSE;
m_rectList.SetRectEmpty ();
m_nLeftColumnWidth = 0;
m_rectTrackHeader.SetRectEmpty ();
m_rectTrackDescr.SetRectEmpty ();
m_nRowHeight = 0;
m_nHeaderHeight = 0;
m_nVertScrollOffset = 0;
m_nVertScrollTotal = 0;
m_nVertScrollPage = 0;
m_pSel = NULL;
m_bFocused = FALSE;
m_nTooltipsCount = 0;
m_bTracking = FALSE;
m_bTrackingDescr = FALSE;
m_strTrue = _T("True");
m_strFalse = _T("False");
m_bControlBarColors = FALSE;
m_bGroupNameFullWidth = TRUE;
m_bShowDragContext = TRUE;
}
CBCGPPropList::~CBCGPPropList()
{
}
BEGIN_MESSAGE_MAP(CBCGPPropList, CWnd)
//{{AFX_MSG_MAP(CBCGPPropList)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_SETTINGCHANGE()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_CANCELMODE()
ON_WM_KILLFOCUS()
ON_WM_GETDLGCODE()
ON_WM_VSCROLL()
ON_WM_MOUSEWHEEL()
ON_WM_LBUTTONDBLCLK()
ON_WM_SETCURSOR()
ON_WM_KEYDOWN()
ON_WM_CHAR()
ON_WM_SETFOCUS()
ON_WM_CTLCOLOR()
ON_WM_DESTROY()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_NCCALCSIZE()
ON_WM_NCPAINT()
ON_WM_RBUTTONDOWN()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SETFONT, OnSetFont)
ON_MESSAGE(WM_GETFONT, OnGetFont)
ON_NOTIFY(HDN_ITEMCHANGED, ID_HEADER, OnHeaderItemChanged)
ON_NOTIFY(HDN_TRACK, ID_HEADER, OnHeaderTrack)
ON_NOTIFY(HDN_ENDTRACK, ID_HEADER, OnHeaderEndTrack)
ON_WM_STYLECHANGED()
ON_CBN_SELENDOK(BCGPROPLIST_ID_INPLACE, OnSelectCombo)
ON_CBN_CLOSEUP(BCGPROPLIST_ID_INPLACE, OnCloseCombo)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, OnNeedTipText)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBCGPPropList message handlers
void CBCGPPropList::PreSubclassWindow()
{
CWnd::PreSubclassWindow();
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState ();
if (pThreadState->m_pWndInit == NULL)
{
Init ();
}
}
//******************************************************************************************
int CBCGPPropList::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
Init ();
return 0;
}
//******************************************************************************************
void CBCGPPropList::Init ()
{
CRect rectDummy;
rectDummy.SetRectEmpty ();
if (globalData.m_hcurStretch == NULL)
{
globalData.m_hcurStretch = AfxGetApp ()->LoadCursor (AFX_IDC_HSPLITBAR);
}
if (globalData.m_hcurStretchVert == NULL)
{
globalData.m_hcurStretchVert = AfxGetApp ()->LoadCursor (AFX_IDC_VSPLITBAR);
}
InitHeader ();
HDITEM hdItem;
hdItem.mask = HDI_TEXT | HDI_FORMAT;
hdItem.fmt = HDF_LEFT;
hdItem.pszText = _T("Property");
hdItem.cchTextMax = 100;
GetHeaderCtrl ().InsertItem (0, &hdItem);
hdItem.pszText = _T("Value");
hdItem.cchTextMax = 100;
GetHeaderCtrl ().InsertItem (1, &hdItem);
m_wndScrollVert.Create (WS_CHILD | WS_VISIBLE | SBS_VERT, rectDummy, this, ID_SCROLL_VERT);
m_ToolTip.Create (this, TTS_ALWAYSTIP);
m_ToolTip.Activate (TRUE);
if(globalData.m_nMaxToolTipWidth != -1)
{
m_ToolTip.SetMaxTipWidth(globalData.m_nMaxToolTipWidth);
}
m_ToolTip.BringWindowToTop ();
CWnd* pWndParent = GetParent ();
m_bControlBarColors = pWndParent == NULL ||
!pWndParent->IsKindOf (RUNTIME_CLASS (CDialog));
AdjustLayout ();
CreateBoldFont ();
}
//******************************************************************************************
void CBCGPPropList::InitHeader ()
{
CRect rectDummy;
rectDummy.SetRectEmpty ();
m_wndHeader.Create (WS_CHILD | WS_VISIBLE | HDS_HORZ, rectDummy, this, ID_HEADER);
}
//*****************************************************************************************
void CBCGPPropList::AdjustLayout ()
{
if (GetSafeHwnd () == NULL)
{
return;
}
CClientDC dc (this);
HFONT hfontOld = SetFont (&dc);
TEXTMETRIC tm;
dc.GetTextMetrics (&tm);
m_nRowHeight = tm.tmHeight + 4;
m_nHeaderHeight = 0;
CRect rectClient;
GetClientRect (rectClient);
if (m_bHeaderCtrl)
{
m_nHeaderHeight = m_nRowHeight + 4;
GetHeaderCtrl ().SendMessage (WM_SETFONT,
(WPARAM) (m_hFont != NULL ? m_hFont : ::GetStockObject (DEFAULT_GUI_FONT)));
GetHeaderCtrl ().SetWindowPos (NULL, rectClient.left, rectClient.top,
rectClient.Width (), m_nHeaderHeight,
SWP_NOZORDER | SWP_NOACTIVATE);
HDITEM hdItem;
hdItem.mask = HDI_WIDTH ;
hdItem.cxy = m_nLeftColumnWidth + 2;
GetHeaderCtrl ().SetItem (0, &hdItem);
hdItem.cxy = rectClient.Width () + 10;
GetHeaderCtrl ().SetItem (1, &hdItem);
GetHeaderCtrl ().ShowWindow (SW_SHOWNOACTIVATE);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -