📄 treectrldlg.cpp
字号:
// TreeCtrlDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Controls.h"
#include "TreeCtrlDlg.h"
#include "ChooseDirectory.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlDlg property page
struct TREEPLANET
{
// HTREEITEM hItem;
char Planet[12];
char Desc[32];
char Orbit[24];
char Rotation[24];
char Diameter[24];
int nIcon;
};
static TREEPLANET Planets[] =
{
"Mercury", "The Messenger", "58 million km", "58d 0h 0m", "4847 km", 0,
"Venus", "The Nearest Planet", "108 million km", "243d 0h 0m", "12,118 km", 1,
"Earth", "Our Home Planet", "130 million km", "23h 56m", "12,756 km", 2,
"Mars", "The Red Planet", "228 million km", "1d 0h 37m", "6,761 km", 3,
"Jupiter", "The Giant Planet", "779 million km", "9h 55m", "142,994 km", 4,
"Saturn", "The Ringed Planet", "1,432 million km", "10h 40m", "116,589 km", 5,
"Uranus", "The Green Giant", "2,800 million km", "17h 14m", "51,024 km", 6,
"Neptune", "The Blue Planet", "4,500 million km", "16h 7m", "49,748 km", 7,
"Pluto", "The Farthest Planet", "5,900 million km", "6d 9h 17m", "2,296 km", 8
};
#define PLANETS (sizeof(Planets)/sizeof(TREEPLANET))
#define MAX_STRING 256
#define _USEITEMSTRUCTURE
IMPLEMENT_DYNCREATE(CTreeCtrlDlg, CPropertyPage)
CTreeCtrlDlg::CTreeCtrlDlg() : CPropertyPage(CTreeCtrlDlg::IDD)
{
//{{AFX_DATA_INIT(CTreeCtrlDlg)
m_bCheckBoxes = FALSE;
m_bFullRowSel = FALSE;
m_bHasButtons = TRUE;
m_bHasLines = TRUE;
m_bInfoTip = FALSE;
m_bLinesAtRoot = TRUE;
m_bShowSelAlways = FALSE;
m_bSingleExpand = FALSE;
m_bToolTips = TRUE;
m_bTrackSelect = FALSE;
m_bCheckBoxesAreVisible = FALSE;
//}}AFX_DATA_INIT
m_psp.dwFlags &= ~PSP_HASHELP;
}
CTreeCtrlDlg::~CTreeCtrlDlg()
{
}
void CTreeCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTreeCtrlDlg)
DDX_Control(pDX, IDC_TREE_TREECTRL, m_ctlTree);
DDX_Check(pDX, IDC_TREE_CHECKBOXES, m_bCheckBoxes);
DDX_Check(pDX, IDC_TREE_FULLROWSEL, m_bFullRowSel);
DDX_Check(pDX, IDC_TREE_HASBUTTONS, m_bHasButtons);
DDX_Check(pDX, IDC_TREE_HASLINES, m_bHasLines);
DDX_Check(pDX, IDC_TREE_INFOTIP, m_bInfoTip);
DDX_Check(pDX, IDC_TREE_LINESATROOT, m_bLinesAtRoot);
DDX_Check(pDX, IDC_TREE_SHOWSELALWAYS, m_bShowSelAlways);
DDX_Check(pDX, IDC_TREE_SINGLEEXPAND, m_bSingleExpand);
DDX_Check(pDX, IDC_TREE_TOOLTIPS, m_bToolTips);
DDX_Check(pDX, IDC_TREE_TRACKSELECT, m_bTrackSelect);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTreeCtrlDlg, CPropertyPage)
//{{AFX_MSG_MAP(CTreeCtrlDlg)
ON_BN_CLICKED(IDC_TREE_RECREATETREE, OnTreeRecreatetree)
ON_BN_CLICKED(IDC_TREE_SELECTPATH, OnTreeSelectpath)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_TREE_HASBUTTONS, IDC_TREE_HASLINES, OnTreeCheckboxes)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlDlg message handlers
BOOL CTreeCtrlDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_Images.Create (IDB_TREECTRL_PLANETS, 16, 2, RGB (0x00, 0x80, 0x80));
m_ctlTree.SetImageList (&m_Images, TVSIL_NORMAL);
LoadTree();
return (TRUE);
}
void CTreeCtrlDlg::OnTreeCheckboxes(UINT nID)
{
UpdateData (TRUE);
UINT indent = m_ctlTree.GetIndent();
DWORD dwStyle = GetWindowLong (m_ctlTree, GWL_STYLE);
switch (nID)
{
case IDC_TREE_HASBUTTONS:
if (m_bHasButtons)
{
dwStyle |= TVS_HASBUTTONS | TVS_LINESATROOT;
m_bLinesAtRoot = TRUE;
}
else
dwStyle &= ~TVS_HASBUTTONS;
break;
case IDC_TREE_TOOLTIPS:
if (m_bToolTips)
dwStyle &= TVS_NOTOOLTIPS;
else
{
dwStyle |= TVS_NOTOOLTIPS;
dwStyle &= ~TVS_INFOTIP;
m_bInfoTip = FALSE;
}
break;
case IDC_TREE_TRACKSELECT:
if (m_bTrackSelect)
dwStyle |= TVS_TRACKSELECT;
else
dwStyle &= ~TVS_TRACKSELECT;
break;
case IDC_TREE_SINGLEEXPAND:
if (m_bSingleExpand)
dwStyle |= TVS_SINGLEEXPAND;
else
dwStyle &= ~TVS_SINGLEEXPAND;
break;
case IDC_TREE_SHOWSELALWAYS:
if (m_bShowSelAlways)
dwStyle |= TVS_SHOWSELALWAYS;
else
dwStyle &= ~TVS_SHOWSELALWAYS;
break;
case IDC_TREE_INFOTIP:
if (m_bInfoTip)
dwStyle |= TVS_INFOTIP;
else
dwStyle &= ~TVS_INFOTIP;
break;
case IDC_TREE_LINESATROOT:
if (m_bLinesAtRoot)
{
dwStyle |= TVS_LINESATROOT | TVS_HASLINES;
m_bHasLines = TRUE;
}
else
{
dwStyle &= ~TVS_LINESATROOT | TVS_HASBUTTONS;
m_bHasButtons = FALSE;
}
break;
case IDC_TREE_FULLROWSEL:
if (m_bFullRowSel)
dwStyle |= TVS_FULLROWSELECT;
else
dwStyle &= ~TVS_FULLROWSELECT;
break;
case IDC_TREE_CHECKBOXES:
if (m_bCheckBoxes)
{
dwStyle |= TVS_CHECKBOXES;
m_bCheckBoxesAreVisible = TRUE;
}
else
{
HIMAGELIST hImages = (HIMAGELIST) m_ctlTree.GetImageList (TVSIL_STATE);
if (hImages != NULL)
DeleteObject (hImages);
dwStyle &= ~TVS_CHECKBOXES;
SetWindowLong (m_ctlTree, GWL_STYLE, dwStyle);
return;
}
break;
case IDC_TREE_HASLINES:
if (m_bHasLines)
dwStyle |= TVS_HASLINES;
else
{
dwStyle &= ~(TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
m_bLinesAtRoot = FALSE;
m_bHasButtons = FALSE;
}
default:
break;
}
UpdateData (FALSE);
SetWindowLong (m_ctlTree, GWL_STYLE, dwStyle);
indent = m_ctlTree.GetIndent();
m_ctlTree.Invalidate (TRUE);
}
void CTreeCtrlDlg::LoadTree()
{
HTREEITEM hItem;
TVITEM tvi;
memset (&tvi, '\0', sizeof (TVITEM));
HTREEITEM hRoot = m_ctlTree.InsertItem ("Astronomy", 18, 18);
m_ctlTree.SetItemData (hRoot, NULL);
HTREEITEM hPlanets = m_ctlTree.InsertItem ("The Planets", 0, 0, hRoot);
m_ctlTree.SetItemData (hPlanets, NULL);
#ifdef _USEITEMSTRUCTURE
TVINSERTSTRUCT tvis;
memset (&tvis, '\0', sizeof (TVINSERTSTRUCT));
for (int i = 0; i < PLANETS; ++i)
{
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
tvis.hParent = hPlanets;
tvis.item.pszText = Planets[i].Planet;
tvis.item.iImage = Planets[i].nIcon + 1;
tvis.item.iSelectedImage = Planets[i].nIcon + 1;
tvis.item.lParam = (LPARAM) Planets[i].Desc;
hItem = m_ctlTree.InsertItem (&tvis);
tvis.item.pszText = "Orbit";
tvis.item.iImage = 10;
tvis.item.iSelectedImage = 10;
tvis.hParent = hItem;
tvis.item.lParam = (LPARAM) Planets[i].Orbit;
m_ctlTree.InsertItem (&tvis);
tvis.item.pszText = "Rotation";
tvis.item.iImage = 11;
tvis.item.iSelectedImage = 11;
tvis.hParent = hItem;
tvis.item.lParam = (LPARAM) Planets[i].Rotation;
m_ctlTree.InsertItem (&tvis);
tvis.item.pszText = "Diameter";
tvis.item.iImage = 11;
tvis.item.iSelectedImage = 11;
tvis.hParent = hItem;
tvis.item.lParam = (LPARAM) Planets[i].Diameter;
m_ctlTree.InsertItem (&tvis);
}
#else
for (int i = 0; i < PLANETS; ++i)
{
HTREEITEM hPlanet = m_ctlTree.InsertItem (Planets[i].Planet, Planets[i].nIcon + 1, Planets[i].nIcon + 1, hPlanets);
m_ctlTree.SetItemData (hPlanet, (LPARAM) Planets[i].Desc);
hItem = m_ctlTree.InsertItem ("Orbit", 10, 10, hPlanet);
m_ctlTree.SetItemData (hItem, (LPARAM) Planets[i].Orbit);
hItem = m_ctlTree.InsertItem ("Rotation", 11, 11, hPlanet);
m_ctlTree.SetItemData (hItem, (LPARAM) Planets[i].Rotation);
hItem = m_ctlTree.InsertItem ("Diameter", 12, 12, hPlanet);
m_ctlTree.SetItemData (hItem, (LPARAM) Planets[i].Diameter);
}
#endif
HTREEITEM hStars = m_ctlTree.InsertItem ("The Stars", 13, 13, hRoot);
m_ctlTree.SetItemData (hStars, NULL);
hItem = m_ctlTree.InsertItem ("Vega", 15, 15, hStars);
m_ctlTree.SetItemData (hItem, NULL);
hItem = m_ctlTree.InsertItem ("Betelgeuse", 16, 16, hStars);
m_ctlTree.SetItemData (hItem, NULL);
hItem = m_ctlTree.InsertItem ("Cor Coroli", 17, 17, hStars);
m_ctlTree.SetItemData (hItem, NULL);
hItem = m_ctlTree.InsertItem ("Albireo", 14, 14, hStars);
m_ctlTree.SetItemData (hItem, NULL);
}
BOOL CTreeCtrlDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR *pNMHDR = (NMHDR *) lParam;
if (wParam == IDC_TREE_TREECTRL)
{
switch (pNMHDR->code)
{
case TVN_GETINFOTIP:
{
NMTVGETINFOTIP *TTInfo = (NMTVGETINFOTIP *) lParam;
char *pszText = (char *) TTInfo->lParam;
TTInfo->pszText = pszText;
*pResult = 0;
return (TRUE);
}
default:
break;
}
}
return CPropertyPage::OnNotify(wParam, lParam, pResult);
}
void CTreeCtrlDlg::OnTreeRecreatetree()
{
CRect rc;
DWORD dwStyle = m_ctlTree.GetStyle();
dwStyle |= TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | WS_BORDER;
dwStyle &= ~(TVS_CHECKBOXES | TVS_INFOTIP | TVS_NOTOOLTIPS);
m_ctlTree.GetWindowRect (rc);
ScreenToClient (rc);
if (m_bCheckBoxesAreVisible)
{
HIMAGELIST hImages = m_ctlTree.GetImageList(TVSIL_STATE)->m_hImageList;
if (hImages != NULL)
DeleteObject (hImages);
}
m_ctlTree.DestroyWindow ();
m_ctlTree.Create (dwStyle, rc, this, IDC_TREE_TREECTRL);
m_ctlTree.SetImageList (&m_Images, TVSIL_NORMAL);
m_ctlTree.ShowWindow (SW_NORMAL);
LoadTree();
m_bHasLines = TRUE;
m_bLinesAtRoot = TRUE;
m_bHasButtons = TRUE;
m_bToolTips = TRUE;
m_bCheckBoxes = FALSE;
m_bInfoTip = FALSE;
UpdateData (FALSE);
}
void CTreeCtrlDlg::OnTreeSelectpath()
{
CChooseDirectory::CData data;
TCHAR *szDir;
DWORD dwLen = GetCurrentDirectory (0, NULL);
if (!dwLen)
return;
try
{
szDir = new TCHAR [dwLen + 1];
}
catch (CMemoryException *e)
{
e->Delete ();
return;
}
GetCurrentDirectory (dwLen + 1, szDir);
data.m_OldPath = szDir;
CChooseDirectory ccd(data);
if (ccd.DoModal () == IDCANCEL)
return;
::SetWindowText (GetDlgItem (IDC_TREE_CHOSENPATH)->m_hWnd, (LPCSTR) data.m_DirPath);
::ShowWindow (GetDlgItem (IDC_TREE_SHOWPATH)->m_hWnd, SW_SHOWNORMAL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -