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

📄 xhtmltreetestdlg.cpp

📁 读取XML信息
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// XHtmlTreeTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "XHtmlTreeTest.h"
#include "XHtmlTreeTestDlg.h"
#include "about.h"
#include "ResourceTextFile.h"
#include "XString.h"
#include "XHtmlDraw.h"
#include "XMessageBox.h"
#include "FindDialog.h"
#include "ColorDlg.h"
#include "XNamedColors.h"
#include "PPTooltip.h"
#include "XTrace.h"
#include "XmlDocument.h"	// not compatible with windowsx.h
#include "mmsystem.h"

// from windowsx.h

#define GET_X_LPARAM(lp)                        ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp)                        ((int)(short)HIWORD(lp))

typedef CXBreadCrumbBar::XHTMLDRAW_APP_COMMAND	APP_COMMAND;

#pragma warning(disable : 4996)	// disable bogus deprecation warning

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#pragma message("automatic link to WINMM.LIB")
#pragma comment(lib, "winmm.lib")

//=============================================================================
// define app command message used by <a href=\"app:WM_APP_COMMAND\">
//=============================================================================
#define WM_APP_COMMAND_1	(WM_APP+100)
#define WM_APP_COMMAND_2	(WM_APP+101)
#define WM_APP_COMMAND_SEL	(WM_APP+102)

//=============================================================================
BEGIN_MESSAGE_MAP(CXHtmlTreeTestDlg, CDialog)
//=============================================================================
	//{{AFX_MSG_MAP(CXHtmlTreeTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_CONTEXTMENU()
	ON_WM_TIMER()
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_UPDATE, OnUpdate)
	ON_BN_CLICKED(IDC_COLLAPSE_ALL, OnCollapseAll)
	ON_BN_CLICKED(IDC_EXPAND_ALL, OnExpandAll)
	ON_BN_CLICKED(IDC_CHECKBOXES, OnUpdateTree)
	ON_BN_CLICKED(IDC_SHOW_CHECKED, OnShowChecked)
	ON_BN_CLICKED(IDC_FIND, OnFind)
	ON_BN_CLICKED(IDC_CHECK_ALL, OnCheckAll)
	ON_BN_CLICKED(IDC_COLORS, OnColors)
	ON_BN_CLICKED(IDC_LOG, OnLog)
	ON_BN_CLICKED(IDC_SMART_CHECKBOXES, OnUpdateTree)
	ON_BN_CLICKED(IDC_HTML, OnUpdateTree)
	ON_BN_CLICKED(IDC_STRIP_HTML, OnUpdateTree)
	ON_BN_CLICKED(IDC_IMAGES, OnUpdateTree)
	ON_BN_CLICKED(IDC_READONLY, OnUpdateTree)
	ON_BN_CLICKED(ID_FINDNEXT, FindNext)
	ON_BN_CLICKED(ID_FINDPREV, FindPrev)
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
	ON_COMMAND(ID_DISABLE, OnDisable)
	ON_COMMAND(ID_ENABLE, OnEnable)
	ON_COMMAND(ID_FIND, OnFind)
	ON_COMMAND(ID_TREE_SEPARATOR, OnSeparator)
	ON_COMMAND(ID_TREE_DELETE, OnDelete)
	ON_NOTIFY(NM_RCLICK, IDC_TREE1, OnRclickTree1)
	ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)
	ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, OnBeginlabeleditTree1)
	ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, OnEndlabeleditTree1)
	//}}AFX_MSG_MAP
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_CHECKBOX_CLICKED, OnCheckbox)
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_ITEM_EXPANDED, OnExpanded)
	ON_REGISTERED_MESSAGE(WM_CHECKEDITEMSDIALOG_CLOSING, OnCheckedItemsDialogClosing)
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_DISPLAY_TOOLTIP, OnDisplayTreeToolTip)
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_INIT_TOOLTIP, OnInitTreeToolTip)
#ifdef XHTMLDRAGDROP
#ifdef XHTMLTREE_DEMO
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_SCROLL_SPEED, OnScrollSpeed)
#endif // XHTMLTREE_DEMO
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_BEGIN_DRAG, OnBeginDrag)
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_END_DRAG, OnEndDrag)
	ON_REGISTERED_MESSAGE(WM_XHTMLTREE_DROP_HOVER, OnDropHover)
#endif // XHTMLDRAGDROP
	
	ON_MESSAGE(WM_APP_COMMAND_SEL, OnAppCommandSel)
	ON_MESSAGE(WM_APP_COMMAND_1, OnAppCommand1)
	ON_MESSAGE(WM_APP_COMMAND_2, OnAppCommand2)
END_MESSAGE_MAP()

//=============================================================================
CXHtmlTreeTestDlg::CXHtmlTreeTestDlg(CWnd* pParent /*=NULL*/, int nInput /*= 0*/)
	: CDialog(CXHtmlTreeTestDlg::IDD, pParent)
//=============================================================================
{
	//{{AFX_DATA_INIT(CXHtmlTreeTestDlg)
	m_bCheckBoxes      = TRUE;
	m_bSmartCheckBoxes = TRUE;
	m_bHtml            = TRUE;
	m_bStripHtml       = FALSE;
	m_bImages          = TRUE;
	m_bReadOnly        = FALSE;
	m_bCheckAll        = TRUE;
	m_nInput           = nInput;
	m_nLineNo          = 1;
	m_nCount           = 0;
	m_pCheckedItemsDlg = NULL;
	m_strResourceName  = _T("");
	m_strFind          = _T("");
	m_nFindStart       = 0;
	m_nFindDir         = 1;
	m_bFindCheck       = FALSE;
	m_rectFind         = CRect(0,0,0,0);
	m_rgbText          = GetSysColor(COLOR_WINDOWTEXT);
	m_rgbBackground    = GetSysColor(COLOR_WINDOW);
	m_ptCheckedItems   = CPoint(0,0);
	m_bLog             = TRUE;
	m_hTrackItem       = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

//=============================================================================
void CXHtmlTreeTestDlg::DoDataExchange(CDataExchange* pDX)
//=============================================================================
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CXHtmlTreeTestDlg)
	DDX_Control(pDX, IDC_SCROLL1, m_ScrollSpeed1);
	DDX_Control(pDX, IDC_SCROLL2, m_ScrollSpeed2);
	DDX_Control(pDX, IDC_SCROLL3, m_ScrollSpeed3);
	DDX_Control(pDX, IDC_BREAD_CRUMB, m_BreadCrumb);
	DDX_Control(pDX, IDC_STATIC_ITEM_INFO, m_ItemInfo);
	DDX_Control(pDX, IDC_CHECK_ALL, m_btnCheckAll);
	DDX_Control(pDX, IDC_COLLAPSE_ALL, m_btnCollapseAll);
	DDX_Control(pDX, IDC_EXPAND_ALL, m_btnExpandAll);
	DDX_Control(pDX, IDC_TREE_INFO, m_TreeInfo);
	DDX_Control(pDX, IDC_ITEMIMAGE, m_ItemImage);
	DDX_Control(pDX, IDC_NOSEPARATORS, m_NoSeparators);
	DDX_Control(pDX, IDC_NOCHILDREN, m_NoChildren);
	DDX_Control(pDX, IDC_NOCHECKED, m_NoChecked);
	DDX_Control(pDX, IDC_ISCHECKED, m_IsChecked);
	DDX_Control(pDX, IDC_EXPANDED, m_Expanded);
	DDX_Control(pDX, IDC_EDIT1, m_Edit);
	DDX_Control(pDX, IDC_LIST1, m_List);
	DDX_Control(pDX, IDC_TREE1, m_Tree);
	DDX_Check(pDX, IDC_CHECKBOXES, m_bCheckBoxes);
	DDX_Check(pDX, IDC_SMART_CHECKBOXES, m_bSmartCheckBoxes);
	DDX_Check(pDX, IDC_HTML, m_bHtml);
	DDX_Check(pDX, IDC_STRIP_HTML, m_bStripHtml);
	DDX_Check(pDX, IDC_IMAGES, m_bImages);
	DDX_Check(pDX, IDC_READONLY, m_bReadOnly);
	DDX_Check(pDX, IDC_LOG, m_bLog);
	//}}AFX_DATA_MAP
}

//=============================================================================
BOOL CXHtmlTreeTestDlg::OnInitDialog()
//=============================================================================
{
	CDialog::OnInitDialog();

	m_hAccel = LoadAccelerators(AfxGetInstanceHandle(), 
					MAKEINTRESOURCE(IDR_ACCELERATOR));

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CreateTooltips();	// set up tooltips for app

	m_List.SetContextMenuId(IDR_XLISTBOX);

	m_List.Printf(CXListBox::Blue, CXListBox::White, 0, _T("XHtmlTreeTest v1.6"));
	m_List.Printf(CXListBox::Blue, CXListBox::White, 0, _T(""));

#ifdef XHTMLHTML
	CXHtmlDraw::XHTMLDRAW_APP_COMMAND AppCommands[] = 
	{
		{ m_hWnd, WM_APP_COMMAND_1, 123, _T("WM_APP_COMMAND1") },
		{ m_hWnd, WM_APP_COMMAND_2, 456, _T("WM_APP_COMMAND2") },
	};

	m_Tree.m_Links.SetAppCommands(AppCommands, 
		sizeof(AppCommands)/sizeof(AppCommands[0]));
#endif

	// set + / - buttons
	m_btnCheckAll.SetGlyph(0, 12, FW_NORMAL, _T("Arial"), 0xD7);
	m_btnExpandAll.SetGlyph(0, 10, FW_NORMAL, _T("Arial"), 0x2B);
	m_btnCollapseAll.SetGlyph(0, 16, FW_NORMAL, _T("Arial"), 0x2D);
	
	GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE);
	m_Edit.EnableWindow(FALSE);

	if (m_Tree.GetHasCheckBoxes())
		m_bCheckBoxes = TRUE;
	CButton *pBtn = (CButton*) GetDlgItem(IDC_CHECKBOXES);
	pBtn->SetCheck(m_bCheckBoxes);

	// create image list for level 0 items
	m_Images.Create(IDB_DOGS, 16, 9, RGB(0,255,255));
	m_Tree.SetImageList(&m_Images, TVSIL_NORMAL);

	m_BreadCrumb.SetWindowText(_T(""));

	UpdateTree(FALSE);

	DumpInfo(NULL);

#ifdef XHTMLDRAGDROP
	OnScrollSpeed(0, 0);
#else
	m_ScrollSpeed1.ShowWindow(FALSE);
	m_ScrollSpeed2.ShowWindow(FALSE);
	m_ScrollSpeed3.ShowWindow(FALSE);
#endif // XHTMLDRAGDROP

	//CXNamedColors nc;
	//nc.Dump(_T("namedcolors.html"));

	return TRUE;  // return TRUE  unless you set the focus to a control
}

//=============================================================================
void CXHtmlTreeTestDlg::CreateTooltips()
//=============================================================================
{
	m_ToolTips.Create(this, TTS_ALWAYSTIP);
	::SendMessage(m_ToolTips.m_hWnd, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);

	m_ToolTips.AddTool(GetDlgItem(IDC_CHECK_ALL),
			_T("Toggle checkbox for all items"));
	m_ToolTips.AddTool(GetDlgItem(IDC_EXPAND_ALL),
			_T("Expand all items"));
	m_ToolTips.AddTool(GetDlgItem(IDC_COLLAPSE_ALL),
			_T("Collapse all items"));
	m_ToolTips.AddTool(GetDlgItem(IDC_SCROLL1),
			_T("Low speed indicator for dragging scroll"));
	m_ToolTips.AddTool(GetDlgItem(IDC_SCROLL2),
			_T("Medium speed indicator for dragging scroll"));
	m_ToolTips.AddTool(GetDlgItem(IDC_SCROLL3),
			_T("High speed indicator for dragging scroll"));
}

//=============================================================================
void CXHtmlTreeTestDlg::LoadXmlFileFromResource(LPCTSTR lpszResource)
//=============================================================================
{
	//m_Tree.LoadXmlFromFile(_T("D:\\CP Articles\\XHtmlTreeTest\\1.0\\src\\dogs.xml"), CXHtmlTree::NoConvertAction);
	//m_Tree.LoadXmlFromFile(_T("D:\\CP Articles\\XHtmlTreeTest\\1.0\\vs2005\\utf16le.xml"), CXHtmlTree::NoConvertAction);
	//m_Tree.LoadXmlFromFile(_T("D:\\CP Articles\\XHtmlTreeTest\\1.0\\vs2005\\utf16le.xml"), CXHtmlTree::ConvertToAnsi);
	//return;

	m_strResourceName = lpszResource;

#ifdef XHTMLXML

	CXHtmlTree::ConvertAction eConvertAction = CXHtmlTree::NoConvertAction;

#ifdef UNICODE
	eConvertAction = CXHtmlTree::ConvertToUnicode;
#endif

	m_Tree.LoadXmlFromResource(NULL, lpszResource, _T("TEXT"), eConvertAction);
	m_Tree.SaveXml(m_Tree.GetRootItem(), _T("save.xml"), TRUE);	// test of saving XML
#else
	AfxMessageBox(_T("XML is currently disabled.\r\n\r\n")
				  _T("Define XHTMLXML and re-compile to enable XML.\r\n"));
#endif

	m_nCount = m_Tree.GetXmlCount();
}

//=============================================================================
void CXHtmlTreeTestDlg::LoadTextFileFromResource(LPCTSTR lpszResource, 
												 int nRoot /*=0*/)
//=============================================================================
{
	TRACE(_T("in CXHtmlTreeTestDlg::LoadTextFileFromResource: %s\n"), lpszResource);

	m_strResourceName = lpszResource;

	CResourceTextFile::ConvertAction eConvertAction = 
			CResourceTextFile::NoConvertAction;

#ifdef _UNICODE
	eConvertAction = CResourceTextFile::ConvertToUnicode;
#endif

	CResourceTextFile rtf;
	if (!rtf.Open(NULL, lpszResource, _T("TEXT"), eConvertAction))
	{
		CString msg;
		msg.Format(_T("Can't find resource %s"), lpszResource);
		AfxMessageBox(msg);
		return;
	}

	//HTREEITEM hItems[100];
	HTREEITEM hParent[5] =  { 0 };

	CString strTitle = _T("<font color=\"dodgerblue\">Dogs of the World</font>");
	CString strRoot = _T("");
	if (nRoot)
		strRoot.Format(_T(" %d"), nRoot);
	strTitle += strRoot;

	hParent[0] = m_Tree.InsertItem(strTitle, TV_NOIMAGE, TV_NOIMAGE);
	int nLevel = 0;

	// nLevel = 0:  root
	//			1:  dog category
	//          2:  dog breed
	//          3:  breed sub-list

	BOOL bSubList = FALSE;
	int nImage = 1;
	int nItem = 1;

	TCHAR szLine[1000];

	while (!rtf.IsAtEOF())
	{
		int index = 0;

		rtf.ReadLine(szLine, sizeof(szLine)/sizeof(TCHAR)-2);

		// hack to stop display
		if (_tcscmp(szLine, _T("...")) == 0)
			break;

		_tcsrtrim(szLine, NULL);

		XHTMLTREEDATA xhtd;

		if (szLine[0] == _T('\0'))
		{
			// line is empty - back to level 0

			nLevel = 0;
			bSubList = FALSE;
			continue;
		}
		else if (szLine[0] == _T(';'))
		{
			// comment line - ignore
			continue;
		}
		else if (szLine[0] == _T(' '))
		{
			// line begins with space - this is sublist
			if (!bSubList)
				nLevel++;
			bSubList = TRUE;
			index = 1;		// skip space
		}
		else
		{
			// line does not begin with space - not a sublist
			if (bSubList)
				nLevel--;
			bSubList = FALSE;
		}

		TRACE(_T("szLine=<%s>\n"), szLine);

		int nNoteWidth = 0;
		CString strNote = _T("");

		TCHAR *cp = _tcschr(szLine, _T('~'));
		if (cp)
		{
			*cp++ = _T('\0');
			TCHAR digit = *cp++;
			if (digit != _T('0'))
				xhtd.bChecked = TRUE;

			if (*cp++ == _T('~'))
			{
				digit = *cp++;
				if (digit != _T('1'))
					xhtd.bEnabled = FALSE;
			}

			if (*cp == _T('~'))
			{
				cp++;
				nNoteWidth = _ttoi(cp);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -