📄 xhtmltreetestdlg.cpp
字号:
while (*cp && isdigit(*cp))
cp++;
}
if (*cp == _T('~'))
{
cp++;
strNote = cp;
TRACE(_T("strNote=<%s>\n"), strNote);
}
}
// line not empty - add item
TVINSERTSTRUCT tvis = { 0 };
tvis.item.mask = TVIF_TEXT;
tvis.item.pszText = &szLine[index];
tvis.item.cchTextMax = (int)_tcslen(&szLine[index]);
tvis.hParent = hParent[nLevel];
tvis.item.iImage = TV_NOIMAGE;
tvis.item.iSelectedImage = TV_NOIMAGE;
tvis.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvis.item.mask |= TVIF_PARAM;
tvis.item.lParam = nItem++;
if (nLevel == 0)
{
// set image for level 0 items
ASSERT(nImage < 9);
tvis.item.iImage = tvis.item.iSelectedImage = nImage;
nImage++;
}
HTREEITEM hItem = m_Tree.InsertItem(&tvis, &xhtd);
ASSERT(hItem);
//hItems[m_nCount] = hItem;
if (!strNote.IsEmpty())
m_Tree.SetItemNote(hItem, strNote, nNoteWidth);
m_nCount++;
//if (m_nCount > 2)
// break;
if (nLevel < 4)
{
hParent[nLevel+1] = hItem;
}
if (nLevel == 0)
nLevel++;
}
//m_Tree.SetCheck(hItems[m_nCount-2], TRUE);
//m_Tree.SetCheck(hItems[m_nCount-1], TRUE);
//m_Tree.SetCheck(hItems[m_nCount-1], FALSE);
//m_Tree.SetReadOnly(TRUE);
rtf.Close();
}
//=============================================================================
void CXHtmlTreeTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
//=============================================================================
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
//=============================================================================
void CXHtmlTreeTestDlg::OnPaint()
//=============================================================================
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
// paint CXBreadCrumbBar objects
m_BreadCrumbBar.Draw(m_hWnd, FALSE);
}
}
//=============================================================================
HCURSOR CXHtmlTreeTestDlg::OnQueryDragIcon()
//=============================================================================
{
return (HCURSOR) m_hIcon;
}
//=============================================================================
void CXHtmlTreeTestDlg::SetBreadCrumbBar(HTREEITEM hItem)
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::SetBreadCrumbBar\n"));
// display item breadcrumb trail
const TCHAR sepchar = _T('~');
CStringArray sa;
CPtrArray pa;
if (hItem == NULL)
hItem = m_Tree.GetSelectedItem();
m_Tree.GetItemPath(hItem, sa, pa);
CString strPath = _T("");
int i = 0;
int n = sa.GetSize();
CString s = _T("");
// accumulate breadcrumbs, separate with '~'
for (i = 0; i < n; i++)
{
if (!strPath.IsEmpty())
strPath += sepchar;
s.Format(_T("<a href=\"app:WM_APP_COMMAND_SEL%d\">"), i);
// last breadcrumb is inactive
if (i < (n-1))
strPath += s;
s = sa[i];
if (s.IsEmpty())
s = _T(' '); // ensure breadcrumb element is not empty
int index = s.Find(_T('('));
// remove parenthetical remarks to shorten string
if (index >= 0)
s = s.Left(index);
if (s.IsEmpty())
s = _T(' '); // ensure breadcrumb element is not empty
strPath += s;
if (i < (n-1))
strPath += _T("</a>");
}
TRACE(_T("strPath=<%s>\n"), strPath);
APP_COMMAND *AppCommands = new APP_COMMAND [pa.GetSize()];
int ncmd = 0;
for (ncmd = 0; ncmd < pa.GetSize(); ncmd++)
{
AppCommands[ncmd].hWnd = m_hWnd;
AppCommands[ncmd].uMessage = WM_APP_COMMAND_SEL;
AppCommands[ncmd].wParam = (WPARAM)pa[ncmd];
s.Format(_T("WM_APP_COMMAND_SEL%d"), ncmd);
AppCommands[ncmd].pszCommand = _tcszdup(s);
}
CRect rect;
m_BreadCrumb.GetWindowRect(&rect);
ScreenToClient(&rect);
CXBreadCrumbBar::XHTMLDRAWSTRUCT ds;
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
CFont *pFont = GetFont(); // get font for the dialog
if (pFont)
pFont->GetLogFont(&lf);
ds.bBold = TRUE;
ds.bLogFont = TRUE;
memcpy(&ds.lf, &lf, sizeof(LOGFONT));
ds.crBackground = GetSysColor(COLOR_BTNFACE);
ds.rect = rect;
m_BreadCrumbBar.SetCrumbs(strPath, sepchar)
.SetSeparator(_T(" > "))
.SetAppCommands(AppCommands, ncmd)
.InitDrawStruct(&ds, FALSE);
m_BreadCrumbBar.Draw(m_hWnd, FALSE);
for (ncmd = 0; ncmd < pa.GetSize(); ncmd++)
{
if (AppCommands[ncmd].pszCommand)
delete [] AppCommands[ncmd].pszCommand;
}
delete [] AppCommands;
}
//=============================================================================
// OnSelchangedTree1
//
// This function shows how to handle TVN_SELCHANGED messages from XHtmlTree.
//
void CXHtmlTreeTestDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
//=============================================================================
{
NMTREEVIEW* pNMTreeView = (NMTREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
CString strItem = m_Tree.GetItemText(hItem);
TRACE(_T("in CXHtmlTreeTestDlg::OnSelchangedTree1: <%s>\n"), strItem);
GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE);
m_Edit.EnableWindow(TRUE);
m_Edit.SetWindowText(strItem);
if (hItem)
{
if (m_bLog)
m_List.Printf(CXListBox::Blue, CXListBox::White, 0,
_T("%04d selection changed to '%s'"), m_nLineNo++, strItem);
DumpInfo(hItem);
SetBreadCrumbBar(hItem);
}
*pResult = 0;
}
//=============================================================================
// OnRclickTree1
//
// This function shows how to handle NM_RCLICK messages
//
void CXHtmlTreeTestDlg::OnRclickTree1(NMHDR* /*pNMHDR*/, LRESULT* pResult)
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::OnRclickTree1\n"));
// get the mouse position from this message
const MSG* pMessage = GetCurrentMessage();
ASSERT(pMessage);
if (pMessage)
{
CPoint point = pMessage->pt; // get the point from the message
LogRightClick(_T("NM_RCLICK"), point);
}
*pResult = 0;
}
//=============================================================================
// OnContextMenu
//
// This function shows how to handle WM_CONTEXTMENU messages
//
void CXHtmlTreeTestDlg::OnContextMenu(CWnd* pWnd, CPoint point)
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::OnContextMenu\n"));
if (pWnd->m_hWnd == m_Tree.m_hWnd)
LogRightClick(_T("WM_CONTEXTMENU"), point);
}
//=============================================================================
void CXHtmlTreeTestDlg::LogRightClick(LPCTSTR lpszMsg, CPoint point)
//=============================================================================
{
CPoint pt = point;
m_Tree.ScreenToClient(&pt);
UINT flags = 0;
HTREEITEM hItem = m_Tree.HitTest(pt, &flags);
// check if mouse clicked anywhere on item
if (hItem && (flags & (TVHT_ONITEM | TVHT_ONITEMBUTTON | TVHT_ONITEMRIGHT | TVHT_ONITEMINDENT)))
{
if (m_bLog)
m_List.Printf(CXListBox::Blue, CXListBox::White, 0,
_T("%04d right click (%s) on item 0x%X - '%s'"),
m_nLineNo++, lpszMsg, hItem, m_Tree.GetItemText(hItem, TRUE));
if (_tcsicmp(lpszMsg, _T("WM_CONTEXTMENU")) == 0)
{
CMenu menu;
VERIFY(menu.CreatePopupMenu());
if (m_Tree.IsEnabled(hItem))
{
VERIFY(menu.AppendMenu(MF_STRING, ID_DISABLE, _T("Disable")));
VERIFY(menu.AppendMenu(MF_STRING|MF_GRAYED, ID_ENABLE, _T("Enable")));
}
else
{
VERIFY(menu.AppendMenu(MF_STRING|MF_GRAYED, ID_DISABLE, _T("Disable")));
VERIFY(menu.AppendMenu(MF_STRING, ID_ENABLE, _T("Enable")));
}
VERIFY(menu.AppendMenu(MF_SEPARATOR, 0, _T("")));
VERIFY(menu.AppendMenu(MF_STRING, ID_TREE_DELETE, _T("Delete")));
VERIFY(menu.AppendMenu(MF_SEPARATOR, 0, _T("")));
VERIFY(menu.AppendMenu(MF_STRING, ID_TREE_SEPARATOR, _T("Insert Separator")));
m_hTrackItem = hItem;
VERIFY(menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this, NULL));
}
}
else
{
if (m_bLog)
m_List.Printf(CXListBox::Blue, CXListBox::White, 0,
_T("%04d right click (%s), not on item"),
m_nLineNo++, lpszMsg);
}
}
//=============================================================================
void CXHtmlTreeTestDlg::OnDisable()
//=============================================================================
{
if (m_hTrackItem)
m_Tree.EnableBranch(m_hTrackItem, FALSE);
m_hTrackItem = 0;
DumpInfo(m_Tree.GetSelectedItem());
}
//=============================================================================
void CXHtmlTreeTestDlg::OnEnable()
//=============================================================================
{
if (m_hTrackItem)
m_Tree.EnableBranch(m_hTrackItem, TRUE);
m_hTrackItem = 0;
DumpInfo(m_Tree.GetSelectedItem());
}
//=============================================================================
void CXHtmlTreeTestDlg::OnSeparator()
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::OnSeparator\n"));
if (m_hTrackItem)
m_Tree.InsertSeparator(m_hTrackItem);
m_hTrackItem = 0;
DumpInfo(m_Tree.GetSelectedItem());
}
//=============================================================================
void CXHtmlTreeTestDlg::OnDelete()
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::OnDelete\n"));
if (m_hTrackItem)
m_Tree.DeleteItem(m_hTrackItem);
m_hTrackItem = 0;
DumpInfo(m_Tree.GetSelectedItem());
}
//=============================================================================
// OnUpdate() is called when the user clicks the Update button to update
// the item text with the text from the edit box.
//
void CXHtmlTreeTestDlg::OnUpdate()
//=============================================================================
{
CString strItem = _T("");
m_Edit.GetWindowText(strItem);
strItem.Replace(_T("\r\n"), _T(" "));
HTREEITEM hItem = m_Tree.GetSelectedItem();
ASSERT(hItem);
if (hItem)
{
if (strItem.IsEmpty())
{
strItem = m_Tree.GetItemText(hItem);
m_Edit.SetWindowText(strItem);
}
else
{
if (m_bLog)
m_List.Printf(CXListBox::Green, CXListBox::White, 0,
_T("%04d Updating item text"), m_nLineNo++);
m_Tree.SetItemText(hItem, strItem);
m_Tree.SetItemTextColor(hItem, RGB(255,0,0));
SetBreadCrumbBar(hItem);
}
}
GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE);
}
//=============================================================================
// OnExpanded
//
// This function shows how to handle WM_XHTMLTREE_ITEM_EXPANDED messages
// from XHtmlTree.
//
LRESULT CXHtmlTreeTestDlg::OnExpanded(WPARAM wParam, LPARAM /*lParam*/)
//=============================================================================
{
TRACE(_T("in CXHtmlTreeTestDlg::OnExpanded\n"));
XHTMLTREEMSGDATA *pData = (XHTMLTREEMSGDATA *)wParam;
ASSERT(pData);
if (pData)
{
HTREEITEM hItem = pData->hItem;
if (hItem)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -