// 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); }