793 lines
20 KiB
C++
793 lines
20 KiB
C++
// ExtTreeDemoDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "ExtTreeDemo.h"
|
|
#include "ExtTreeDemoDlg.h"
|
|
|
|
#include "UTSampleAbout.h"
|
|
|
|
#include "UTBStrOp.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExtTreeDemoDlg dialog
|
|
|
|
CExtTreeDemoDlg::CExtTreeDemoDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CExtTreeDemoDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CExtTreeDemoDlg)
|
|
m_bShowColumnHdr = FALSE;
|
|
m_bMultiSel = FALSE;
|
|
m_bEditLabels = FALSE;
|
|
m_bHasButtons = FALSE;
|
|
m_bHasLines = FALSE;
|
|
m_bHasLinesAtRoot = FALSE;
|
|
m_bShowSelAlways = FALSE;
|
|
m_bHasHGrid = FALSE;
|
|
m_bHasVGrid = FALSE;
|
|
m_bRowSel = FALSE;
|
|
m_bFullLength = FALSE;
|
|
m_bPickAnywhere = FALSE;
|
|
m_bItemTips = FALSE;
|
|
m_bNoSortHeader = FALSE;
|
|
m_bNoScroll = FALSE;
|
|
//}}AFX_DATA_INIT
|
|
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
|
m_pDragImage=NULL;
|
|
m_bDragging=FALSE;
|
|
m_hDropItem = NULL;
|
|
}
|
|
|
|
CExtTreeDemoDlg::~CExtTreeDemoDlg()
|
|
{
|
|
if(m_pDragImage)
|
|
{
|
|
delete m_pDragImage;
|
|
}
|
|
}
|
|
|
|
void CExtTreeDemoDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CExtTreeDemoDlg)
|
|
DDX_Control(pDX, IDC_LIST2, m_xlc);
|
|
DDX_Check(pDX, IDC_TVOXS_COLUMNHDR, m_bShowColumnHdr);
|
|
DDX_Check(pDX, IDC_TVOXS_MULTISEL, m_bMultiSel);
|
|
DDX_Check(pDX, IDC_TVS_EDITLABELS, m_bEditLabels);
|
|
DDX_Check(pDX, IDC_TVS_HASBUTTONS, m_bHasButtons);
|
|
DDX_Check(pDX, IDC_TVS_HASLINES, m_bHasLines);
|
|
DDX_Check(pDX, IDC_TVS_HASLINESATROOT, m_bHasLinesAtRoot);
|
|
DDX_Check(pDX, IDC_TVS_SHOWSELALWAYS, m_bShowSelAlways);
|
|
DDX_Check(pDX, IDC_TVOXS_HGRID, m_bHasHGrid);
|
|
DDX_Check(pDX, IDC_TVOXS_VGRID, m_bHasVGrid);
|
|
DDX_Check(pDX, IDC_TVOXS_ROWSEL, m_bRowSel);
|
|
DDX_Check(pDX, IDC_TVOXS_FLGRID, m_bFullLength);
|
|
DDX_Check(pDX, IDC_TVOXS_PICKANYWHERE, m_bPickAnywhere);
|
|
DDX_Check(pDX, IDC_TVOXS_ITEMTIPS, m_bItemTips);
|
|
DDX_Check(pDX, IDC_TVOXS_NOSORTHEADER, m_bNoSortHeader);
|
|
DDX_Check(pDX, IDC_TVOXS_NOSCROLL, m_bNoScroll);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CExtTreeDemoDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CExtTreeDemoDlg)
|
|
ON_WM_SYSCOMMAND()
|
|
ON_WM_PAINT()
|
|
ON_WM_QUERYDRAGICON()
|
|
ON_NOTIFY(TVN_GETDISPINFO, IDC_LIST2, OnGetdispinfoTree1)
|
|
ON_BN_CLICKED(IDC_TVOXS_COLUMNHDR, OnTvoxsColumnhdr)
|
|
ON_BN_CLICKED(IDC_TVOXS_MULTISEL, OnTvoxsMultisel)
|
|
ON_BN_CLICKED(IDC_TVS_EDITLABELS, OnTvsEditlabels)
|
|
ON_BN_CLICKED(IDC_TVS_HASBUTTONS, OnTvsHasbuttons)
|
|
ON_BN_CLICKED(IDC_TVS_HASLINES, OnTvsHaslines)
|
|
ON_BN_CLICKED(IDC_TVS_HASLINESATROOT, OnTvsHaslinesatroot)
|
|
ON_BN_CLICKED(IDC_TVS_SHOWSELALWAYS, OnTvsShowselalways)
|
|
ON_BN_CLICKED(IDC_HIDE, OnHide)
|
|
ON_BN_CLICKED(IDC_UNHIDE_ALL, OnUnhideAll)
|
|
ON_BN_CLICKED(IDC_ADD_TO_FOCUS, OnAddToFocus)
|
|
ON_BN_CLICKED(IDC_SET_FONT, OnSetFontToSel)
|
|
ON_BN_CLICKED(IDC_TOGGLE_DISABLE, OnToggleDisable)
|
|
ON_BN_CLICKED(IDC_TVOXS_VGRID, OnVgrid)
|
|
ON_BN_CLICKED(IDC_TVOXS_HGRID, OnHgrid)
|
|
ON_BN_CLICKED(IDC_TVOXS_ROWSEL, OnRowSel)
|
|
ON_BN_CLICKED(IDC_TVOXS_FLGRID, OnFullLength)
|
|
ON_BN_CLICKED(IDC_TVOXS_PICKANYWHERE, OnPickAnywhere)
|
|
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST2, OnBegindragList2)
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONUP()
|
|
ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST2, OnItemclickList2)
|
|
ON_BN_CLICKED(IDC_TVOXS_ITEMTIPS, OnTvoxsItemtips)
|
|
ON_BN_CLICKED(IDC_TVOXS_NOSCROLL, OnTvoxsNoscroll)
|
|
ON_BN_CLICKED(IDC_TVOXS_NOSORTHEADER, OnTvoxsNosortheader)
|
|
ON_NOTIFY(NM_RCLICK, IDC_LIST2, OnRclickList2)
|
|
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_LIST2, OnItemExpandingTree1)
|
|
ON_BN_CLICKED(IDC_DELETE_SELECTED, OnDeleteSelected)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CExtTreeDemoDlg message handlers
|
|
|
|
BOOL CExtTreeDemoDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// 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
|
|
|
|
// TODO: Add extra initialization here
|
|
|
|
|
|
|
|
m_il.Create(IDB_BITMAP1,16,1,RGB(255,255,255));
|
|
m_il1.Create(IDB_BITMAP1,16,1,RGB(255,255,255));
|
|
m_ils.Create(IDB_BITMAP2,13,1,RGB(255,255,255));
|
|
|
|
CStringArray saComboStr;
|
|
CStringArray saDates;
|
|
saDates.Add(_T("01/01/1998"));
|
|
saDates.Add(_T("31/12/1998"));
|
|
int i=0;
|
|
for(i=0;i < 10;i++)
|
|
{
|
|
CString s;
|
|
s.Format(_T("Option %d"),i+1);
|
|
saComboStr.Add(s);
|
|
}
|
|
|
|
LV_COLUMN lvc;
|
|
memset(&lvc,0,sizeof(lvc));
|
|
lvc.fmt = LVCFMT_LEFT;
|
|
lvc.cx = 100;
|
|
lvc.pszText = _T("Column");
|
|
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
|
|
m_xlc.SetColumn(0,&lvc);
|
|
m_xlc.InsertColumn(1,_T("ComboBox"),LVCFMT_CENTER,100,1);
|
|
m_xlc.InsertColumn(2,_T("Dates"),LVCFMT_RIGHT,100,2);
|
|
m_xlc.SetImageList(&m_il1,TVSIL_NORMAL);
|
|
m_xlc.SetImageList(&m_ils,TVSIL_STATE);
|
|
for(i=0;i<10;i++)
|
|
{
|
|
CString sItem;
|
|
sItem.Format(_T("Item %d"),i);
|
|
HTREEITEM hti = m_xlc.InsertItem(sItem);
|
|
sItem.Format(_T("Column2 Item %d"),i);
|
|
m_xlc.SetSubItem(hti,1,OX_SUBITEM_TEXT|OX_SUBITEM_IMAGE,sItem,1);
|
|
m_xlc.SetItemColor(hti,RGB(255 - 10*i,0,0));
|
|
m_xlc.SetItemColor(hti,RGB(0,255 - 10*i,0),1);
|
|
m_xlc.SetEditMode(hti,OXET_COMBO,saComboStr,1);
|
|
|
|
m_xlc.SetSubItem(hti,2,OX_SUBITEM_TEXT,_T("None"));
|
|
m_xlc.SetEditMode(hti,OXET_CALENDAR,saDates,2);
|
|
TV_ITEM tvi;
|
|
memset(&tvi,0,sizeof(tvi));
|
|
tvi.cChildren=1;
|
|
tvi.mask=TVIF_CHILDREN | TVIF_HANDLE;
|
|
tvi.hItem = hti;
|
|
if(!i)
|
|
{
|
|
tvi.mask |= TVIF_TEXT;
|
|
tvi.pszText = LPSTR_TEXTCALLBACK;
|
|
m_xlc.SetItem(&tvi);
|
|
}
|
|
else if(i == 1)
|
|
{
|
|
tvi.mask |= TVIF_STATE;
|
|
tvi.stateMask = TVIS_STATEIMAGEMASK;
|
|
tvi.state = INDEXTOSTATEIMAGEMASK(2);
|
|
m_xlc.SetItem(&tvi);
|
|
}
|
|
else if(i == 2)
|
|
{
|
|
LOGFONT lf;
|
|
CFont f,*pF = GetFont();
|
|
if(pF->GetLogFont(&lf))
|
|
{
|
|
lf.lfItalic = TRUE;
|
|
f.CreateFontIndirect(&lf);
|
|
m_xlc.SetItemFont(hti,&f);
|
|
}
|
|
m_xlc.SetItem(&tvi);
|
|
}
|
|
else
|
|
m_xlc.SetItem(&tvi);
|
|
|
|
m_xlc.SetItemImage(hti,0,1);
|
|
|
|
}
|
|
|
|
m_xlc.ModifyExStyle(0,TVOXS_COLUMNHDR);
|
|
m_xlc.ModifyExStyle(0,TVOXS_MULTISEL);
|
|
m_xlc.ModifyStyle(0,TVS_EDITLABELS);
|
|
m_xlc.ModifyStyle(0,TVS_HASBUTTONS);
|
|
m_xlc.ModifyStyle(0,TVS_HASLINES);
|
|
m_xlc.ModifyStyle(0,TVS_LINESATROOT);
|
|
m_xlc.ModifyStyle(0,TVS_SHOWSELALWAYS);
|
|
m_xlc.ModifyExStyle(0,TVOXS_VGRID);
|
|
m_xlc.ModifyExStyle(0,TVOXS_HGRID);
|
|
m_xlc.ModifyExStyle(0,TVOXS_FLGRID);
|
|
m_xlc.ModifyExStyle(0,TVOXS_ROWSEL);
|
|
m_xlc.ModifyExStyle(0,TVOXS_PICKANYWHERE);
|
|
m_xlc.ModifyExStyle(0,TVOXS_ITEMTIPS);
|
|
|
|
m_bHasLines = m_xlc.HasLines() > 0 ? TRUE : FALSE;
|
|
m_bHasButtons = m_xlc.HasButtons() > 0 ? TRUE : FALSE;
|
|
m_bHasLinesAtRoot = m_xlc.HasLinesAtRoot() > 0 ? TRUE : FALSE;
|
|
DWORD dwStyle = m_xlc.GetStyle();
|
|
m_bEditLabels = (dwStyle & TVS_EDITLABELS) > 0 ? TRUE : FALSE;
|
|
m_bShowSelAlways = (dwStyle & TVS_SHOWSELALWAYS) > 0 ? TRUE : FALSE;
|
|
DWORD dwStyleEx = m_xlc.GetExStyle();
|
|
m_bShowColumnHdr = (dwStyleEx & TVOXS_COLUMNHDR) > 0 ? TRUE : FALSE;
|
|
m_bMultiSel = (dwStyleEx & TVOXS_MULTISEL) > 0 ? TRUE : FALSE;
|
|
m_bHasHGrid = (dwStyleEx & TVOXS_HGRID) > 0 ? TRUE : FALSE;
|
|
m_bHasVGrid = (dwStyleEx & TVOXS_VGRID) > 0 ? TRUE : FALSE;
|
|
m_bFullLength = (dwStyleEx & TVOXS_FLGRID) > 0 ? TRUE : FALSE;
|
|
m_bRowSel = (dwStyleEx & TVOXS_ROWSEL) > 0 ? TRUE : FALSE;
|
|
m_bPickAnywhere = (dwStyleEx & TVOXS_PICKANYWHERE) > 0 ? TRUE : FALSE;
|
|
m_bItemTips = (dwStyleEx & TVOXS_ITEMTIPS) > 0 ? TRUE : FALSE;
|
|
m_bNoScroll = (dwStyleEx & TVOXS_NOSCROLL) > 0 ? TRUE : FALSE;
|
|
m_bNoSortHeader = (dwStyleEx & TVOXS_NOSORTHEADER) > 0 ? TRUE : FALSE;
|
|
|
|
m_xlc.ShowWindow(SW_SHOW);
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
|
{
|
|
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
|
{
|
|
CUTSampleAboutDlg dlgAbout(IDR_MAINFRAME, ID_DESCRIPTION_FILE);
|
|
dlgAbout.DoModal();
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnSysCommand(nID, lParam);
|
|
}
|
|
}
|
|
|
|
// If you add a minimize button to your dialog, you will need the code below
|
|
// to draw the icon. For MFC applications using the document/view model,
|
|
// this is automatically done for you by the framework.
|
|
|
|
void CExtTreeDemoDlg::OnPaint()
|
|
{
|
|
if (IsIconic())
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
// The system calls this to obtain the cursor to display while the user drags
|
|
// the minimized window.
|
|
HCURSOR CExtTreeDemoDlg::OnQueryDragIcon()
|
|
{
|
|
return (HCURSOR) m_hIcon;
|
|
}
|
|
|
|
|
|
void CExtTreeDemoDlg::OnGetdispinfoTree1(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR;
|
|
TV_ITEM *tvi = &(pTVDI->item);
|
|
static int hit=0;
|
|
if(tvi->mask & TVIF_TEXT)
|
|
{
|
|
TCHAR t[20];
|
|
UTBStr::stprintf(t, 20, _T("Hit %d"),hit++);
|
|
ASSERT(tvi->pszText);
|
|
ASSERT(tvi->pszText != LPSTR_TEXTCALLBACK);
|
|
|
|
UTBStr::tcsncpy(tvi->pszText, tvi->cchTextMax, t,tvi->cchTextMax);
|
|
}
|
|
|
|
*pResult = 1;
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvoxsColumnhdr()
|
|
{
|
|
UpdateData();
|
|
if(m_bShowColumnHdr)
|
|
m_xlc.ModifyExStyle(0,TVOXS_COLUMNHDR,SWP_DRAWFRAME);
|
|
else
|
|
m_xlc.ModifyExStyle(TVOXS_COLUMNHDR,0,SWP_DRAWFRAME);
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvoxsMultisel()
|
|
{
|
|
UpdateData();
|
|
if(m_bMultiSel)
|
|
m_xlc.ModifyExStyle(0,TVOXS_MULTISEL);
|
|
else
|
|
m_xlc.ModifyExStyle(TVOXS_MULTISEL,0);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvsEditlabels()
|
|
{
|
|
UpdateData();
|
|
if(m_bEditLabels)
|
|
m_xlc.ModifyStyle(0,TVS_EDITLABELS);
|
|
else
|
|
m_xlc.ModifyStyle(TVS_EDITLABELS,0);
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvsHasbuttons()
|
|
{
|
|
UpdateData();
|
|
if(m_bHasButtons)
|
|
m_xlc.ModifyStyle(0,TVS_HASBUTTONS);
|
|
else
|
|
m_xlc.ModifyStyle(TVS_HASBUTTONS,0);
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvsHaslines()
|
|
{
|
|
UpdateData();
|
|
if(m_bHasLines)
|
|
m_xlc.ModifyStyle(0,TVS_HASLINES);
|
|
else
|
|
m_xlc.ModifyStyle(TVS_HASLINES,0);
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvsHaslinesatroot()
|
|
{
|
|
UpdateData();
|
|
if(m_bHasLinesAtRoot)
|
|
m_xlc.ModifyStyle(0,TVS_LINESATROOT);
|
|
else
|
|
m_xlc.ModifyStyle(TVS_LINESATROOT,0);
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvsShowselalways()
|
|
{
|
|
UpdateData();
|
|
if(m_bShowSelAlways)
|
|
m_xlc.ModifyStyle(0,TVS_SHOWSELALWAYS);
|
|
else
|
|
m_xlc.ModifyStyle(TVS_SHOWSELALWAYS,0);
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnHide()
|
|
{
|
|
HTREEITEM hItem = m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
while(hItem)
|
|
{
|
|
HTREEITEM hItem1 = hItem;
|
|
hItem = m_xlc.GetNextItem(hItem,TVGN_NEXTSELECTED);
|
|
m_xlc.HideItem(hItem1);
|
|
}
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnUnhideAll()
|
|
{
|
|
HTREEITEM hItem = m_xlc.GetFirstHiddenItem();
|
|
while(hItem)
|
|
{
|
|
HTREEITEM hItem1 = hItem;
|
|
hItem = m_xlc.GetNextHiddenItem(hItem);
|
|
m_xlc.HideItem(hItem1,FALSE);
|
|
}
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnAddToFocus()
|
|
{
|
|
static int hit=0;
|
|
HTREEITEM hItem = m_xlc.GetSelectedItem();
|
|
hItem= hItem==NULL ? m_xlc.GetRootItem() : hItem;
|
|
if(hItem)
|
|
{
|
|
CString s;
|
|
s.Format(_T("New Item %d"),++hit);
|
|
hItem=m_xlc.InsertItem(s,hItem,TVI_SORT);
|
|
ASSERT(hItem!=NULL);
|
|
m_xlc.SelectItem(hItem);
|
|
m_xlc.EnsureVisible(hItem);
|
|
m_xlc.EditLabel(hItem);
|
|
}
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnSetFontToSel()
|
|
{
|
|
CFontDialog fnt_dlg;
|
|
if(fnt_dlg.DoModal() != IDOK)
|
|
return;
|
|
LOGFONT lf;
|
|
fnt_dlg.GetCurrentFont(&lf);
|
|
CFont f;
|
|
f.CreateFontIndirect(&lf);
|
|
HTREEITEM hItem = m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
while(hItem)
|
|
{
|
|
m_xlc.SetItemFont(hItem,&f,0);
|
|
m_xlc.SetItemFont(hItem,&f,1);
|
|
m_xlc.SetItemFont(hItem,&f,2);
|
|
m_xlc.SetItemColor(hItem,fnt_dlg.m_cf.rgbColors);
|
|
m_xlc.SetItemColor(hItem,fnt_dlg.m_cf.rgbColors,1);
|
|
m_xlc.SetItemColor(hItem,fnt_dlg.m_cf.rgbColors,2);
|
|
hItem = m_xlc.GetNextItem(hItem,TVGN_NEXTSELECTED);
|
|
}
|
|
|
|
UINT nHeight=m_xlc.GetItemHeight();
|
|
lf.lfHeight=(lf.lfHeight>0 ? lf.lfHeight : -lf.lfHeight)+6;
|
|
if(lf.lfHeight>(int)nHeight)
|
|
{
|
|
m_xlc.SetItemHeight(lf.lfHeight);
|
|
}
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnToggleDisable()
|
|
{
|
|
HTREEITEM hItem = m_xlc.GetNextItem(TVI_ROOT,TVGN_FIRSTSELECTED);
|
|
while(hItem)
|
|
{
|
|
m_xlc.DisableItem(hItem,!m_xlc.IsItemDisabled(hItem));
|
|
hItem = m_xlc.GetNextItem(hItem,TVGN_NEXTSELECTED);
|
|
}
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnVgrid()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bHasVGrid ? TVOXS_VGRID : 0;
|
|
DWORD dwStyleRemove = m_bHasVGrid ? 0 : TVOXS_VGRID;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnHgrid()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bHasHGrid ? TVOXS_HGRID : 0;
|
|
DWORD dwStyleRemove = m_bHasHGrid ? 0 : TVOXS_HGRID;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnFullLength()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bFullLength ? TVOXS_FLGRID : 0;
|
|
DWORD dwStyleRemove = m_bFullLength ? 0 : TVOXS_FLGRID;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
|
|
void CExtTreeDemoDlg::OnRowSel()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bRowSel ? TVOXS_ROWSEL : 0;
|
|
DWORD dwStyleRemove = m_bRowSel ? 0 : TVOXS_ROWSEL;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
|
|
void CExtTreeDemoDlg::OnPickAnywhere()
|
|
{
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bPickAnywhere ? TVOXS_PICKANYWHERE : 0;
|
|
DWORD dwStyleRemove = m_bPickAnywhere ? 0 : TVOXS_PICKANYWHERE;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnBegindragList2(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
|
|
if(m_pDragImage)
|
|
{
|
|
delete m_pDragImage;
|
|
}
|
|
|
|
HTREEITEM hDragItem = m_xlc.GetSelectedItem();
|
|
ASSERT (hDragItem);
|
|
m_pDragImage = m_xlc.CreateDragImage (hDragItem);
|
|
ASSERT (m_pDragImage);
|
|
|
|
// changes the cursor to the drag image (DragMove() is still required in
|
|
// OnMouseMove())
|
|
VERIFY (m_pDragImage->BeginDrag (0, CPoint (8, 8)));
|
|
VERIFY (m_pDragImage->DragEnter (GetDesktopWindow (), pNMListView->ptAction));
|
|
|
|
// set dragging flag
|
|
m_bDragging = TRUE;
|
|
m_hDropItem = NULL;
|
|
|
|
// capture all mouse messages
|
|
SetCapture ();
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
if (m_bDragging)
|
|
{
|
|
CPoint pt (point);
|
|
ClientToScreen (&pt);
|
|
|
|
// move the drag image
|
|
VERIFY (m_pDragImage->DragMove (pt));
|
|
|
|
BOOL bDraw=FALSE;
|
|
|
|
// get the CWnd pointer of the window that is under the mouse cursor
|
|
CWnd* pDropWnd = WindowFromPoint (pt);
|
|
ASSERT (pDropWnd);
|
|
// if we drag outside current window
|
|
if (pDropWnd != &m_xlc)
|
|
{
|
|
// turn off drag hilite for tree control
|
|
if (m_hDropItem)
|
|
{
|
|
if(!bDraw)
|
|
{
|
|
// unlock window updates
|
|
VERIFY (m_pDragImage->DragShowNolock(FALSE));
|
|
bDraw=TRUE;
|
|
}
|
|
m_xlc.SelectDropTarget (NULL);
|
|
m_hDropItem = NULL;
|
|
}
|
|
}
|
|
|
|
// convert from screen coordinates to drop target client coordinates
|
|
pDropWnd->ScreenToClient (&pt);
|
|
|
|
// if window is CTreeCtrl
|
|
if (pDropWnd == &m_xlc)
|
|
{
|
|
UINT uFlags;
|
|
// get the item that is below cursor
|
|
int nIndex=m_xlc.HitTest(pt, &uFlags);
|
|
if(nIndex>=0)
|
|
{
|
|
m_hDropItem = m_xlc.GetItemFromIndex(nIndex);
|
|
HTREEITEM hOldDropItem=m_xlc.GetNextItem(m_xlc.GetRootItem(),
|
|
TVGN_DROPHILITE);
|
|
if(hOldDropItem!=m_hDropItem)
|
|
{
|
|
if(!bDraw)
|
|
{
|
|
// unlock window updates
|
|
VERIFY (m_pDragImage->DragShowNolock(FALSE));
|
|
bDraw=TRUE;
|
|
}
|
|
// highlight it
|
|
m_xlc.SelectDropTarget(m_hDropItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bDraw)
|
|
{
|
|
// lock window updates
|
|
VERIFY (m_pDragImage->DragShowNolock (TRUE));
|
|
}
|
|
}
|
|
|
|
CDialog::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
if (m_bDragging)
|
|
{
|
|
// end dragging
|
|
VERIFY (m_pDragImage->DragLeave (GetDesktopWindow ()));
|
|
m_pDragImage->EndDrag ();
|
|
// stop intercepting all mouse messages
|
|
VERIFY (::ReleaseCapture ());
|
|
m_bDragging = FALSE;
|
|
|
|
CPoint pt (point);
|
|
ClientToScreen (&pt);
|
|
// m_dropPoint = pt;
|
|
|
|
// get the CWnd pointer of the window that is under the mouse cursor
|
|
CWnd* pDropWnd = WindowFromPoint (pt);
|
|
ASSERT (pDropWnd);
|
|
|
|
// if window is CTreeCtrl
|
|
if (pDropWnd == &m_xlc)
|
|
{
|
|
HTREEITEM htiDropTarget=m_xlc.GetDropHilightItem();
|
|
ASSERT(m_hDropItem==htiDropTarget);
|
|
m_xlc.SelectDropTarget(NULL);
|
|
|
|
// move selected items
|
|
if(htiDropTarget!=NULL && m_xlc.GetSelectedCount() >= 1)
|
|
{
|
|
HTREEITEM htiParent=m_xlc.GetParentItem(htiDropTarget);
|
|
|
|
HTREEITEM hDragItem = m_xlc.GetNextItem(TVI_ROOT, TVGN_FIRSTSELECTED);
|
|
HTREEITEM hNextDragItem = m_xlc.GetNextItem(hDragItem, TVGN_NEXTSELECTED);
|
|
while(hDragItem)
|
|
{
|
|
if (::GetKeyState(VK_CONTROL) & 0x8000)
|
|
{
|
|
m_xlc.CopyItem(hDragItem,htiDropTarget);
|
|
htiDropTarget = hDragItem;
|
|
}
|
|
else
|
|
{
|
|
m_xlc.MoveItem(hDragItem,htiParent,htiDropTarget);
|
|
htiDropTarget = hDragItem;
|
|
}
|
|
|
|
hDragItem = hNextDragItem;
|
|
hNextDragItem = m_xlc.GetNextItem(hNextDragItem, TVGN_NEXTSELECTED);
|
|
}
|
|
|
|
}
|
|
|
|
m_hDropItem = NULL;
|
|
}
|
|
}
|
|
|
|
CDialog::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnItemclickList2(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
int nCol=phdn->iItem;
|
|
m_xlc.SortChildren(NULL,nCol);
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvoxsItemtips()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bItemTips ? TVOXS_ITEMTIPS : 0;
|
|
DWORD dwStyleRemove = m_bItemTips ? 0 : TVOXS_ITEMTIPS;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd);
|
|
}
|
|
|
|
|
|
|
|
void CExtTreeDemoDlg::OnTvoxsNoscroll()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bNoScroll ? TVOXS_NOSCROLL : 0;
|
|
DWORD dwStyleRemove = m_bNoScroll ? 0 : TVOXS_NOSCROLL;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd,SWP_DRAWFRAME);
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnTvoxsNosortheader()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
UpdateData();
|
|
DWORD dwStyleAdd = m_bNoSortHeader ? TVOXS_NOSORTHEADER : 0;
|
|
DWORD dwStyleRemove = m_bNoSortHeader ? 0 : TVOXS_NOSORTHEADER;
|
|
m_xlc.ModifyExStyle(dwStyleRemove,dwStyleAdd,SWP_DRAWFRAME);
|
|
}
|
|
|
|
|
|
void CExtTreeDemoDlg::OnRclickList2(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
UNREFERENCED_PARAMETER(pNMHDR);
|
|
|
|
static int hit=0;
|
|
HTREEITEM hItem = m_xlc.GetSelectedItem();
|
|
if(hItem)
|
|
{
|
|
m_xlc.EditLabel(hItem);
|
|
}
|
|
|
|
*pResult = 0;
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnItemExpandingTree1(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
// TODO: Add your control notification handler code here
|
|
|
|
*pResult = 0;
|
|
|
|
pNMTreeView->itemNew.stateMask=TVIS_EXPANDEDONCE;
|
|
pNMTreeView->itemNew.mask=TVIF_STATE|TVIF_CHILDREN;
|
|
m_xlc.GetItem(&pNMTreeView->itemNew);
|
|
// If folder at least once was expanded then it was already populated
|
|
if((pNMTreeView->itemNew.state & TVIS_EXPANDEDONCE) ||
|
|
pNMTreeView->itemNew.cChildren==0)
|
|
return;
|
|
|
|
CStringArray saComboStr;
|
|
CStringArray saDates;
|
|
saDates.Add(_T("01/01/1998"));
|
|
saDates.Add(_T("31/12/1998"));
|
|
for(int i=0; i<10; i++)
|
|
{
|
|
CString s;
|
|
s.Format(_T("Option %d"),i+1);
|
|
saComboStr.Add(s);
|
|
}
|
|
|
|
CString sParentItem=m_xlc.GetItemText(pNMTreeView->itemNew.hItem);
|
|
for(int j=500;j >= 0;j--)
|
|
{
|
|
CString sItem;
|
|
sItem.Format(_T("%s - Item %d"),sParentItem,j);
|
|
HTREEITEM h =m_xlc.InsertItem(sItem,pNMTreeView->itemNew.hItem);
|
|
if(!j)
|
|
{
|
|
CFont f;
|
|
f.CreatePointFont(-80,_T("Arial"));
|
|
m_xlc.SetItemFont(h,&f);
|
|
}
|
|
|
|
sItem.Format(_T("Option %d"),j);
|
|
m_xlc.SetSubItem(h,1,OX_SUBITEM_TEXT,sItem);
|
|
m_xlc.SetEditMode(h,OXET_COMBO,saComboStr,1);
|
|
m_xlc.SetSubItem(h,2,OX_SUBITEM_TEXT,_T("None"));
|
|
m_xlc.SetEditMode(h,OXET_CALENDAR,saDates,2);
|
|
}
|
|
|
|
}
|
|
|
|
void CExtTreeDemoDlg::OnDeleteSelected()
|
|
{
|
|
HTREEITEM hSelected;
|
|
while ((hSelected = m_xlc.GetSelectedItem()) != NULL)
|
|
m_xlc.DeleteItem(hSelected);
|
|
}
|