⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treectrldlg.cpp

📁 vc的一些原码,对于帮助学习和提高很有帮助
💻 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 + -