📄 xhtmltree.h
字号:
// XHtmlTree.h Version 1.6 - article available at www.codeproject.com
//
// Author: Hans Dietrich
// hdietrich@gmail.com
//
// License:
// This software is released into the public domain. You are free to use
// it in any way you like, except that you may not sell this source code.
//
// This software is provided "as is" with no expressed or implied warranty.
// I accept no liability for any damage or loss of business that this
// software may cause.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef XHTMLTREE_H
#define XHTMLTREE_H
#include <afxtempl.h>
#include "XHtmlDraw.h"
extern UINT WM_XHTMLTREE_CHECKBOX_CLICKED;
extern UINT WM_XHTMLTREE_ITEM_EXPANDED;
extern UINT WM_XHTMLTREE_DISPLAY_TOOLTIP;
extern UINT WM_XHTMLTREE_INIT_TOOLTIP;
#ifdef XHTMLDRAGDROP
extern UINT WM_XHTMLTREE_BEGIN_DRAG;
extern UINT WM_XHTMLTREE_END_DRAG;
extern UINT WM_XHTMLTREE_DROP_HOVER;
#endif // XHTMLDRAGDROP
#ifdef XHTMLTREE_DEMO
extern UINT WM_XHTMLTREE_SCROLL_SPEED;
#endif // XHTMLTREE_DEMO
const int TV_NOIMAGE = 0xFFFE;
//=============================================================================
// Uncomment the following line if you want to use HTML in tree
//=============================================================================
//#define XHTMLHTML
#ifdef XHTMLHTML
#include "XHtmlDrawLink.h"
#endif // XHTMLHTML
//=============================================================================
// Uncomment the following line if you want HTML tooltips, displayed
// using CPPToolTip: http://www.codeproject.com/miscctrl/pptooltip.asp
//=============================================================================
//#define XHTMLTOOLTIPS
#ifdef XHTMLTOOLTIPS
#include "PPTooltip.h"
#endif // XHTMLTOOLTIPS
//=============================================================================
// Uncomment the following line if you want to include XML functions.
//=============================================================================
//#define XHTMLXML
#ifdef XHTMLXML
#include "XmlDocument.h"
#endif // XHTMLXML
//=============================================================================
// Uncomment the following line if you want to enable drag & drop.
//=============================================================================
//#define XHTMLDRAGDROP
//=============================================================================
// CXHtmlTree data
//=============================================================================
struct XHTMLTREEDATA
{
// ctor
XHTMLTREEDATA()
{
bChecked = FALSE;
bEnabled = TRUE;
bSeparator = FALSE;
// below are reserved for CXHtmlTree use only
hTreeCtrl = 0;
bExpanded = FALSE;
bHasBeenExpanded = FALSE;
bModified = FALSE;
nChildren = 0;
nChecked = 0;
nSeparators = 0;
pszNote = 0;
nTipWidth = 0;
nCount++;
}
// dtor
virtual ~XHTMLTREEDATA()
{
if (pszNote)
delete [] pszNote;
pszNote = 0;
nCount--;
}
BOOL bChecked; // TRUE = item checkbox is checked
BOOL bEnabled; // TRUE = enabled, FALSE = disabled
// (gray text)
BOOL bSeparator; // TRUE = item is separator; cannot have children
// below are reserved for CXHtmlTree use only
HWND hTreeCtrl; // HWND of tree control
BOOL bExpanded; // TRUE = item is expanded to show its children
BOOL bHasBeenExpanded; // TRUE = item has been expanded (at least once)
BOOL bModified; // TRUE = item has been modified
int nChildren; // total count of children of this
// item
int nChecked; // count of children that are
// checked - an item in a "mixed"
// state is counted as being
// unchecked
int nSeparators; // count of children that are separators
TCHAR * pszNote; // note for tooltip
int nTipWidth; // width of tooltip for note
CXHtmlDraw::XHTMLDRAWSTRUCT ds; // HTML draw info
static int nCount; // incremented in ctor, decremented in dtor
};
//=============================================================================
// data returned in notification messages
//=============================================================================
struct XHTMLTREEMSGDATA
{
HWND hCtrl; // hwnd of XHtmlTree
UINT nCtrlId; // id of XHtmlTree
HTREEITEM hItem; // current item
};
//=============================================================================
// data returned in drag notification messages - not all data will be
// returned for every message
//=============================================================================
struct XHTMLTREEDRAGMSGDATA
{
HTREEITEM hItem; // item being dragged
HTREEITEM hNewParent; // proposed new parent
HTREEITEM hAfter; // drop target - item being dragged will
// either sequentially follow this item,
// or hAfter specifies the relationship
// (TVI_FIRST, TVI_LAST, etc.) the
// dragged item will have with hNewParent.
// Note that TVI_xxxx constants are all
// defined as 0xFFFFnnnn, with the 16
// high-order bits set.
BOOL bCopyDrag; // TRUE = dropped item will be copied;
// FALSE = dropped item will be moved
};
//=============================================================================
// drag operations flags for m_dwDragOps
//=============================================================================
#define XHTMLTREE_DO_CTRL_KEY 0x0001 // TRUE = Ctrl key toggles move/copy;
// FALSE = Ctrl key is ignored
#define XHTMLTREE_DO_SHIFT_KEY 0x0002 // TRUE = Shift key toggles "move
// under" mode; FALSE = Shift key is
// ignored
#define XHTMLTREE_DO_SCROLL_NORMAL 0x0004 // TRUE = normal drag scroll
#define XHTMLTREE_DO_SCROLL_FAST 0x0008 // TRUE = fast drag scroll
#define XHTMLTREE_DO_COPY_DRAG 0x0010 // TRUE = change default drag from
// move to copy
#define XHTMLTREE_DO_AUTO_EXPAND 0x0020 // TRUE = auto-expand node when
// cursor hovers
#define XHTMLTREE_DO_DEFAULT (XHTMLTREE_DO_CTRL_KEY | \
XHTMLTREE_DO_SHIFT_KEY | \
XHTMLTREE_DO_SCROLL_NORMAL | \
XHTMLTREE_DO_AUTO_EXPAND)
//=============================================================================
class CXHtmlTree : public CTreeCtrl
//=============================================================================
{
//=============================================================================
// Construction
//=============================================================================
public:
CXHtmlTree();
virtual ~CXHtmlTree();
//=============================================================================
// Attributes
//=============================================================================
public:
enum CheckedState { UNUSED1 = 0,
UNCHECKED, CHECKED, TRISTATE,
UNUSED2,
UNCHECKED_DISABLED, CHECKED_DISABLED, TRISTATE_DISABLED };
#ifdef XHTMLHTML
CXHtmlDrawLink m_Links;
#endif // XHTMLHTML
COLORREF GetBkColor() { return m_crCustomWindow; }
BOOL GetBit(DWORD bits, DWORD bitmask) { return bits & bitmask; }
BOOL GetCheck(HTREEITEM hItem);
int GetCheckedCount();
int GetChildrenCheckedCount(HTREEITEM hItem);
int GetChildrenCount(HTREEITEM hItem);
int GetChildrenDisabledCount(HTREEITEM hItem);
int GetDefaultTipWidth();
COLORREF GetDisabledColor(COLORREF color);
BOOL GetDisplayToolTips() { return m_bToolTip; }
DWORD GetDragOps() { return m_dwDragOps; }
HTREEITEM GetFirstCheckedItem();
BOOL GetHasBeenExpanded(HTREEITEM hItem);
BOOL GetHasCheckBoxes() { return m_bCheckBoxes; }
BOOL GetHtml() { return m_bHtml; }
BOOL GetImages() { return m_bImages; }
int GetIndentLevel(HTREEITEM hItem);
COLORREF GetInsertMarkColor() { return m_crInsertMark; }
BOOL GetItemBold(HTREEITEM hItem);
CString GetItemNote(HTREEITEM hItem, BOOL bStripHtml = FALSE);
int GetItemNoteWidth(HTREEITEM hItem);
BOOL GetItemPath(HTREEITEM hItem, CStringArray& sa, CPtrArray& items);
BOOL GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly);
COLORREF GetItemTextBkColor(HTREEITEM hItem);
COLORREF GetItemTextColor(HTREEITEM hItem);
XHTMLTREEDATA * GetItemDataStruct(HTREEITEM hItem);
CString GetItemText(HTREEITEM hItem, BOOL bStripHtml = FALSE) const;
HTREEITEM GetLastItem(HTREEITEM hItem);
LOGFONT * GetLogfont() { return &m_lf; }
HTREEITEM GetNextCheckedItem(HTREEITEM hItem);
HTREEITEM GetNextItem(HTREEITEM hItem);
// do not hide CTreeCtrl version
HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode)
{ return CTreeCtrl::GetNextItem(hItem, nCode); }
HTREEITEM GetPrevCheckedItem(HTREEITEM hItem);
HTREEITEM GetPrevItem(HTREEITEM hItem);
BOOL GetReadOnly() { return m_bReadOnly; }
BOOL GetSelectFollowsCheck() { return m_bSelectFollowsCheck; }
COLORREF GetSeparatorColor() { return m_crSeparator; } //+++1.6
int GetSeparatorCount(HTREEITEM hItem);
BOOL GetSmartCheckBox() { return m_bSmartCheck; }
int GetStateImage(HTREEITEM hItem);
BOOL GetStripHtml() { return m_bStripHtml; }
COLORREF GetTextColor() { return m_crCustomWindowText; }
#ifdef XHTMLTOOLTIPS
CPPToolTip * GetToolTips() { return m_pToolTip; }
#else
CToolTipCtrl * GetToolTips() { return m_pToolTip; }
#endif // XHTMLTOOLTIPS
BOOL GetUseLogfont() { return m_bLogFont; }
int GetXmlCount() { return m_nXmlCount; }
BOOL IsChecked(HTREEITEM hItem) { return GetCheck(hItem); }
BOOL IsChildNodeOf(HTREEITEM hitem, HTREEITEM hitemSuspectedParent);
BOOL IsEnabled(HTREEITEM hItem);
BOOL IsExpanded(HTREEITEM hItem);
HTREEITEM IsOverItem(LPPOINT lpPoint = NULL);
BOOL IsSelected(HTREEITEM hItem);
BOOL IsSeparator(HTREEITEM hItem);
COLORREF SetBkColor(COLORREF rgb);
void SetBit(DWORD& bits, DWORD bitmask, BOOL value)
{
if (value)
bits |= bitmask;
else
bits &= ~bitmask;
}
CXHtmlTree& SetCheck(HTREEITEM hItem, BOOL fCheck = TRUE);
CXHtmlTree& SetCheckChildren(HTREEITEM hItem, BOOL fCheck);
CXHtmlTree& SetDefaultTipWidth(int nDefaultTipWidth)
{ m_nDefaultTipWidth = nDefaultTipWidth; return *this; }
CXHtmlTree& SetDisplayToolTips(BOOL bFlag)
{ m_bToolTip = bFlag; return *this; }
CXHtmlTree& SetDragOps(DWORD dwOps)
{ m_dwDragOps = dwOps; return *this; }
CXHtmlTree& SetDropCursors(UINT nNoDropCursor, UINT nDropCopyCursor, UINT nDropMoveCursor)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -