📄 uitreectrl.cpp
字号:
ON_MESSAGE(WM_APP_OLE_DD_ENTER, OnDragEnter)
ON_MESSAGE(WM_APP_OLE_DD_LEAVE, OnDragLeave)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUITreeCtrl message handlers
BOOL CUITreeCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)pNMHDR;
if(lptvcd->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if(lptvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
ItemPrePaint(lptvcd,pResult);
}
else if(lptvcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
{
ItemPostPaint(lptvcd,pResult);
}
return TRUE;
}
BOOL CUITreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
HTREEITEM hItem = GetHitItem(&point);
if (hItem == NULL)
return FALSE;
ClientToScreen(&point);
ShowPopupMenu(hItem,point);
*pResult = 0;
return TRUE;
}
BOOL CUITreeCtrl::OnDeleteItem(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CUIListCtrlData* pData = (CUIListCtrlData*)pNMTreeView->itemOld.lParam;
if (!pData->GetAutoDelete())
OnDeleteItemData(pData->GetExtData());
delete pData;
return TRUE;
}
LRESULT CUITreeCtrl::OnTVMGetItem(WPARAM wParam,LPARAM lParam)
{
LPTVITEM pitem = (LPTVITEM)lParam;
if (m_bMe == false && pitem->mask & TVIF_PARAM)
{
CUIListCtrlData* pData = GetListCtrlData(pitem->hItem);
if (pData)
{
pitem->lParam = pData->GetExtData();
pitem->mask &= ~TVIF_PARAM;
}
}
return Default();
}
LRESULT CUITreeCtrl::OnTVMSetItem(WPARAM wParam,LPARAM lParam)
{
LPTVITEM pitem = (LPTVITEM)lParam;
if (m_bMe == false && pitem->mask & TVIF_PARAM)
{
CUIListCtrlData* pData = GetListCtrlData(pitem->hItem);
if (pData)
{
pData->SetExtData(pitem->lParam);
pitem->mask &= ~TVIF_PARAM;
}
}
return Default();
}
LRESULT CUITreeCtrl::OnTVMInsertItem(WPARAM wParam,LPARAM lParam)
{
LPTVINSERTSTRUCT lpis = (LPTVINSERTSTRUCT)lParam;
if (m_bMe == false && lpis->item.mask & TVIF_PARAM)
{
lpis->item.lParam = (LPARAM)GetNewListCtrlData(lpis->item.lParam,lpis->hParent);
}
return Default();
}
int CUITreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CUIDragDropTree::OnCreate(lpCreateStruct) == -1)
return -1;
Init();
// TODO: Add your specialized creation code here
return 0;
}
UINT CUITreeCtrl::GetIconID()
{
return IDI_FOLDER_CLOSED;
}
UINT CUITreeCtrl::GetOpenIconID()
{
return 0;
}
bool CUITreeCtrl::Expanding(NM_TREEVIEW *nmtvw)
{
return false;
}
bool CUITreeCtrl::Collapsing(NM_TREEVIEW *nmtvw)
{
return true;
}
void CUITreeCtrl::Init()
{
// Create the image list we will need
int nCxSmall = GetSystemMetrics(SM_CXSMICON);
int nCySmall = GetSystemMetrics(SM_CYSMICON);
m_ImageList.Create(nCxSmall,
nCySmall,
TRUE, // list does not include masks
2,
0 ); // list won't grow
UINT nIconID = GetIconID();
if (nIconID)
{
HINSTANCE hInstIcon = AfxFindResourceHandle(MAKEINTRESOURCE(nIconID),RT_GROUP_ICON);
HICON hIcon = (HICON)LoadImage( hInstIcon, MAKEINTRESOURCE(nIconID), IMAGE_ICON,
nCxSmall, nCySmall, 0 );
m_idxClosed = m_ImageList.Add(hIcon);
}
UINT nOpenIconID = GetOpenIconID();
if (nOpenIconID)
{
HINSTANCE hInstIcon = AfxFindResourceHandle(MAKEINTRESOURCE(nOpenIconID),RT_GROUP_ICON);
HICON hOpenIcon = (HICON)LoadImage( hInstIcon, MAKEINTRESOURCE(nOpenIconID), IMAGE_ICON,
nCxSmall, nCySmall, 0 );
m_idxOpen = m_ImageList.Add(hOpenIcon);
}
// Associate the image list with the tree
SetImageList(&m_ImageList,TVSIL_NORMAL);
m_ImageList.SetBkColor(CLR_NONE);
ModifyStyle(0,m_style);
}
BOOL CUITreeCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.style |= m_style;
return CUIDragDropTree::PreCreateWindow(cs);
}
BOOL CUITreeCtrl::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMTVDISPINFO pDispInfo = (LPNMTVDISPINFO)pNMHDR;
if (pDispInfo->item.pszText)
*pResult = EndLabelEdit(pDispInfo->item.hItem,pDispInfo->item.pszText);
return TRUE;
}
BOOL CUITreeCtrl::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
HTREEITEM hItem = GetSelectedItem();
DoubleClick(hItem);
return TRUE;
}
BOOL CUITreeCtrl::OnReturn(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
OnDblclk(pNMHDR,pResult);
return TRUE;
}
BOOL CUITreeCtrl::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CWaitCursor w;
// TODO: Add your control notification handler code here
if (pNMTreeView->action == TVE_EXPAND)
{
Expanding(pNMTreeView);
}
else if (pNMTreeView->action == TVE_COLLAPSE)
{
Collapsing(pNMTreeView);
}
return TRUE;
}
BOOL CUITreeCtrl::OnItemExpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
/* if (pNMTreeView->action == TVE_EXPAND)
{
SetItemImage(pNMTreeView->itemNew.hItem,m_idxClosed,0);
}
else if (pNMTreeView->action == TVE_COLLAPSE)
{
SetItemImage(pNMTreeView->itemNew.hItem,m_idxOpen,0);
}*/
return TRUE;
}
BOOL CUITreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
//VK_PRIOR 21 page up key
//VK_NEXT 22 page down key
//VK_END 23 end key
//VK_HOME 24 home key
//VK_LEFT 25 left arrow key
//VK_UP 26 up arrow key
//VK_RIGHT 27 right arrow key
//VK_DOWN 28 down arrow key
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if ((pNMTreeView->itemNew.state & TVIS_SELECTED))
{
if (pNMTreeView->action == TVC_BYMOUSE || pNMTreeView->action == TVC_UNKNOWN)
{
CUIListCtrlData *pData = (CUIListCtrlData*)pNMTreeView->itemNew.lParam;
if (pData)
{
ASSERT_KINDOF(CUIListCtrlData,pData);
SelectionChanged(pNMTreeView->itemNew.hItem,pData->GetExtData());
}
else
SelectionChanged(pNMTreeView->itemNew.hItem,pNMTreeView->itemNew.lParam);
}
else if (pNMTreeView->action == TVC_BYKEYBOARD)
{
CopyMemory(&m_NMTreeView,pNMTreeView,sizeof(NM_TREEVIEW));
if (m_vkeydown && m_IDTimer == 0)
{
TRACE0("Timer set\n");
m_IDTimer = SetTimer(2,100,NULL);
}
}
}
*pResult = 0;
return TRUE;
}
BOOL CUITreeCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
return CUIDragDropTree::OnMouseWheel(nFlags, zDelta, pt);
}
BOOL CUITreeCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
{
if (pMsg->wParam == VK_F10 && (GetKeyState(VK_SHIFT) < 0))
{
PostMessage(WM_APP_ON_CONTEXT_MENU_KEY);
return TRUE;
}
else if (pMsg->wParam == VK_BACK)
{
PostMessage(WM_APP_ON_BACKSPACE_KEY);
return TRUE;
}
else if (pMsg->wParam == VK_F2)
{
PostMessage(WM_APP_ON_EDIT_KEY);
return TRUE;
}
else if (pMsg->wParam == VK_F5)
{
PostMessage(WM_APP_ON_REFRESH_KEY);
return TRUE;
}
else if (pMsg->wParam == VK_DELETE)
{
PostMessage(WM_APP_ON_DELETE_KEY);
return TRUE;
}
else if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_RETURN)
{
PostMessage(WM_APP_ON_PROPERTIES_KEY);
return TRUE;
}
}
return CUIDragDropTree::PreTranslateMessage(pMsg);
}
void CUITreeCtrl::OnKeydownFolder(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
m_vkeydown = pTVKeyDown->wVKey;
*pResult = 0;
}
LRESULT CUITreeCtrl::OnTimerSelChange(WPARAM wParam,LPARAM lParam)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)&m_NMTreeView;
CUIListCtrlData *pData = (CUIListCtrlData*)pNMTreeView->itemNew.lParam;
if (pData)
{
ASSERT_KINDOF(CUIListCtrlData,pData);
SelectionChanged(pNMTreeView->itemNew.hItem,pData->GetExtData());
}
else
SelectionChanged(pNMTreeView->itemNew.hItem,pNMTreeView->itemNew.lParam);
return 1L;
}
void CUITreeCtrl::OnTimer( UINT nIDEvent )
{
CUIDragDropTree::OnTimer(nIDEvent);
if (nIDEvent == m_IDTimer)
{
if (m_vkeydown)
{
SHORT sRet = GetAsyncKeyState(m_vkeydown);
if (sRet >= 0)
{
KillTimer(m_IDTimer);
m_IDTimer = 0;
m_vkeydown = 0;
PostMessage(WM_APP_TIMER_SEL_CHANGE);
}
}
}
}
LRESULT CUITreeCtrl::OnDragDrop(WPARAM wParam,LPARAM lParam)
{
if (GetDragDrop() == false)
return 1L;
// get the info we need
CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
ASSERT(pInfo);
if (pInfo->GetDataObject() != NULL)
return DragDrop(pInfo) ? 1 : 0;
else
return 1;
}
// user is currently over the tree view window
// return 1 if we are interested in the CB format
LRESULT CUITreeCtrl::OnDragOver(WPARAM wParam,LPARAM lParam)
{
if (GetDragDrop() == false)
return 1L;
CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
ASSERT(pInfo);
if (pInfo->GetDataObject() != NULL)
return DragOver(pInfo) ? 1 : 0;
else
return 1;
}
LRESULT CUITreeCtrl::OnDragEnter(WPARAM wParam,LPARAM lParam)
{
if (GetDragDrop() == false)
return 1L;
CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
ASSERT(pInfo);
if (pInfo->GetDataObject() != NULL)
return DragEnter(pInfo) ? 1 : 0;
else
return 1;
}
LRESULT CUITreeCtrl::OnDragLeave(WPARAM wParam,LPARAM lParam)
{
if (GetDragDrop() == false)
return 1L;
CDD_OleDropTargetInfo *pInfo = (CDD_OleDropTargetInfo*)wParam;
ASSERT(pInfo);
if (pInfo->GetDataObject() != NULL)
return DragLeave(pInfo) ? 1 : 0;
else
return 1;
}
// Drag and drop initiated
// Return 1 if processed
LRESULT CUITreeCtrl::OnDDDoDragDrop(WPARAM wParam,LPARAM lParam)
{
if (GetDragDrop() == false)
return 1L;
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)wParam;
COleDataSource *pOleDataSource = (COleDataSource*)lParam;
ASSERT(pOleDataSource);
return DoDragDrop(pNMTreeView,pOleDataSource);
}
LRESULT CUITreeCtrl::OnAppPropertiesKey(WPARAM wParam, LPARAM lParam)
{
ShowProperties(GetSelectedItem());
return 1L;
}
LRESULT CUITreeCtrl::OnAppDeleteKey(WPARAM wParam, LPARAM lParam)
{
DeleteItem(GetSelectedItem());
return 1L;
}
LRESULT CUITreeCtrl::OnAppRefreshKey(WPARAM wParam, LPARAM lParam)
{
Refresh();
return 1L;
}
LRESULT CUITreeCtrl::OnAppEditKey(WPARAM wParam, LPARAM lParam)
{
EditLabel(GetSelectedItem());
return 1L;
}
LRESULT CUITreeCtrl::OnAppContextMenuKey(WPARAM wParam, LPARAM lParam)
{
CRect rc;
GetItemRect(GetSelectedItem(),&rc,FALSE);
ClientToScreen(&rc);
ShowPopupMenu(GetSelectedItem(),rc.CenterPoint());
return 1L;
}
LRESULT CUITreeCtrl::OnAppBackspaceKey(WPARAM wParam, LPARAM lParam)
{
GoBack(GetSelectedItem());
return 1L;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -