LRESULT CBrowseDocker::OnRightClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) { CPoint pt(GetMessagePos()); HTREEITEM hItem(NULL); // Test for keyboard right-click... if(pt.x != -1) { CPoint pt2(pt); m_view->ScreenToClient(&pt2); TVHITTESTINFO tvhti = {0}; tvhti.pt = pt2; m_view->HitTest(&tvhti); hItem = tvhti.hItem; } else { hItem = m_view->GetSelectedItem(); } if (hItem != NULL) { m_rightClickNode = hItem; CPidl pidl; m_view->GetItemPidl(hItem, &pidl); // m_menuHandler->TrackPopupMenu(pidl, pt.x, pt.y, m_hWnd); CSPopupMenu popup(IDR_POPUP_BROWSER); int nCmd; BOOL result = m_menuHandler->TrackPopupMenu(pidl, pt.x, pt.y, m_hWnd, popup.GetHandle(), popup.GetHandle(), 10000, 11000, nCmd); if (result && (nCmd < 10000 || nCmd > 11000)) { ::PostMessage(m_hWnd, WM_COMMAND, nCmd, 0L); } } return 0; }
LRESULT CChildFrame::OnTvnSelChanged(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled) { USES_CONVERSION; HRESULT hr = E_FAIL; idCtrl, pNMHDR, bHandled; CTreeViewCtrl ctrlTree = m_wndCatalog; bHandled = FALSE; NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; ATLASSERT( pNMTreeView ); { m_pData.m_hTreeItem = pNMTreeView->itemNew.hItem; m_pData.m_pTreeView = &m_wndCatalog; } CTreeItem hItem(pNMTreeView->itemNew.hItem, &m_wndCatalog); TREE_ITEM_DATA * pCurrSel = NULL; pCurrSel = (TREE_ITEM_DATA *) ctrlTree.GetItemData(hItem); if (pCurrSel && STGTY_STREAM == pCurrSel->dwStgType) { CComPtr<IStream> spStrm; hr = pCurrSel->spStgOrStrm->QueryInterface(&spStrm); if (FAILED(hr)) return hr; STATSTG st = { 0 }; hr = spStrm->Stat(&st, STATFLAG_NONAME); if (FAILED(hr)) return hr; LARGE_INTEGER liBegin = { 0 }; hr = spStrm->Seek(liBegin, STREAM_SEEK_SET, NULL); BYTE * byBuff = new BYTE[st.cbSize.QuadPart+1]; ZeroMemory(byBuff, (st.cbSize.QuadPart+1)*sizeof(BYTE)); ULONG ulSize = 0; hr = spStrm->Read(byBuff, st.cbSize.QuadPart, &ulSize); ATLASSERT(SUCCEEDED(hr)); if(st.cbSize.QuadPart) { CComSafeArray data; data.CreateOneDim(VT_UI1, st.cbSize.QuadPart, (const void *)byBuff); m_wndHexEdit.SetData(data); } else { CComVariant data; m_wndHexEdit.SetData(data); } { m_wndFileDetails.ShowWindow(SW_HIDE); m_wndHexEdit.ShowWindow(SW_NORMAL); SetSplitterPane(SPLIT_PANE_RIGHT, m_wndHexEdit); } delete [] byBuff; } else if (pCurrSel && STGTY_STORAGE == pCurrSel->dwStgType) { CComVariant data; m_wndHexEdit.SetData(data); m_wndHexEdit.ShowWindow(SW_HIDE); std::vector<STATSTG_EX> vecFileInfo; CTreeItem tiChild = hItem.GetChild(); while (FALSE == tiChild.IsNull()) { TREE_ITEM_DATA * pData = (TREE_ITEM_DATA *)tiChild.GetData(); STATSTG_EX statstgex; do { if (pData->dwStgType == STGTY_STREAM) { CComPtr<IStream> spStrm; hr = pData->spStgOrStrm->QueryInterface(&spStrm); if (FAILED(hr)) break; hr = spStrm->Stat(&statstgex, STATFLAG_NONAME); if (FAILED(hr)) break; } else if (pData->dwStgType == STGTY_STORAGE) { CComPtr<IStorage> spStg; hr = pData->spStgOrStrm->QueryInterface(&spStg); if (FAILED(hr)) break; hr = spStg->Stat(&statstgex, STATFLAG_NONAME); if (FAILED(hr)) break; } } while(0); statstgex.htiHost = tiChild.m_hTreeItem; TCHAR szSwap[MAX_PATH] = { 0 }; tiChild.GetText(szSwap, _countof(szSwap)); TCHAR2WCHAR(szSwap, statstgex.szwName, _countof(statstgex.szwName)); vecFileInfo.push_back(statstgex); tiChild = tiChild.GetNextSibling(); } m_wndFileDetails.SetFileInfo(vecFileInfo); m_wndFileDetails.ShowWindow(SW_NORMAL); SetSplitterPane(SPLIT_PANE_RIGHT, m_wndFileDetails); } return 0; }
void CCompareWithSelectDlg::OnItemSelected(NMHDR *pNotifyStruct, LRESULT *pLResult) { *pLResult = 0L; HTREEITEM hItem(NULL); // TreeView // Seems that under Vista with Windows Common Controls V6, it is ignoring // the single click on the button (+/-) of a node and only processing the // double click, which generates a copy of whatever the user selected // for a double click (except that it invalid for a node!) and then does // the expand/collapse as appropriate. // This codes attempts to fix this. switch (pNotifyStruct->code) { case NM_CLICK: { // Mouseclick - Need to find the item clicked via HitTest TVHITTESTINFO htinfo = {0}; CPoint point = ::GetMessagePos(); m_cwItemTree.ScreenToClient(&point); htinfo.pt = point; m_cwItemTree.HitTest(&htinfo); hItem = htinfo.hItem; // Ignore any clicks not on an item (group or entry) if (hItem == NULL || htinfo.flags & (TVHT_NOWHERE | TVHT_ONITEMRIGHT | TVHT_ABOVE | TVHT_BELOW | TVHT_TORIGHT | TVHT_TOLEFT)) { GetDlgItem(IDOK)->EnableWindow(FALSE); return; } // If a group if (!m_cwItemTree.IsLeaf(hItem)) { // If on indent or button if (htinfo.flags & (TVHT_ONITEMINDENT | TVHT_ONITEMBUTTON)) { m_cwItemTree.Expand(htinfo.hItem, TVE_TOGGLE); *pLResult = 1L; // We have toggled the group GetDlgItem(IDOK)->EnableWindow(FALSE); return; } } break; } case TVN_SELCHANGED: // Keyboard - We are given the new selected entry hItem = ((NMTREEVIEW *)pNotifyStruct)->itemNew.hItem; break; default: // No idea how we got here! GetDlgItem(IDOK)->EnableWindow(FALSE); return; } // Check it was on an item if (hItem != NULL && m_cwItemTree.IsLeaf(hItem)) { m_pSelected = (CItemData *)m_cwItemTree.GetItemData(hItem); } HTREEITEM hti = m_cwItemTree.GetDropHilightItem(); if (hti != NULL) m_cwItemTree.SetItemState(hti, 0, TVIS_DROPHILITED); if (m_pSelected == NULL) return; // Can't select ourselves if (m_pSelected->GetGroup() == m_group && m_pSelected->GetTitle() == m_title && m_pSelected->GetUser() == m_username) { // Unselect it m_cwItemTree.SetItemState(hItem, 0, LVIS_SELECTED); m_pSelected = NULL; GetDlgItem(IDOK)->EnableWindow(FALSE); } else { GetDlgItem(IDOK)->EnableWindow(TRUE); } }