Срез: dcacce10be543341b9e4df3f169c6326df6ee3fe - Копирование файла Можно задать только путь, нельзя указать имя целевога файла, как это сделано в Тотале - Контекстное меню каталога Нет контекстного меню проводника ОС, а нужно! (там куча всяких операций) - F4 (Edit) Не работает (т.е. вообще ничего не происходит); При этом F3 работает.
<snip> - Контекстное меню каталога Нет контекстного меню проводника ОС, а нужно! (там куча всяких операций)<snip>
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // TODO : Add Code for message handler. Call DefWindowProc if necessary. USES_CONVERSION; //bHandled = FALSE; HWND hwnd = (HWND) wParam; int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); if (hwnd == m_Tree.m_hWnd){ POINT pt; RECT rect; HTREEITEM hItem = m_Tree.GetSelectedItem(); if ((xPos == yPos) && (yPos == 65535)){ // (((( ну вот приходится так делать... if (hItem != NULL){ if (m_Tree.GetItemRect(hItem, &rect, true)){ xPos = 0; yPos = rect.bottom; pt.x = xPos; pt.y = yPos; ::ClientToScreen(hwnd, &pt); xPos = pt.x; yPos = pt.y; //int iii = 0; } } else { return 0; } //rect = } else { pt.x = xPos; pt.y = yPos; ::ScreenToClient(hwnd, &pt); UINT uFlag = 0; hItem = m_Tree.HitTest(pt,&uFlag); } if (hItem != NULL){ //m_Tree.Select(hItem,TVGN_CARET); m_Tree.SelectItem(hItem); } else { hItem = m_Tree.GetSelectedItem(); } bHandled = true; HRESULT hr; CString pszPath = m_Tree.GetFullPath(hItem); // Строим полное имя файла/каталога TCHAR tchFullPath[MAX_PATH]; hr = GetFullPathName(pszPath, sizeof(tchFullPath)/sizeof(TCHAR), tchFullPath, NULL); // Получаем интерфейс IShellFolder рабочего стола IShellFolder *pDesktopFolder; hr = SHGetDesktopFolder(&pDesktopFolder); if (NOERROR == hr ){ // Преобразуем заданный путь в LPITEMIDLIST LPITEMIDLIST pidl; hr = pDesktopFolder->ParseDisplayName(hwnd, NULL, T2OLE(tchFullPath), NULL, &pidl, NULL); if (S_OK == hr){ // Ищем последний идентификатор в полученном списке pidl LPITEMIDLIST pLastId = pidl; USHORT temp; while(1) { int offset = pLastId->mkid.cb; temp = *(USHORT*)((BYTE*)pLastId + offset); if(temp == 0) break; pLastId = (LPITEMIDLIST)((BYTE*)pLastId + offset); } // Получаем интерфейс IShellFolder родительского объекта для заданного файла/каталога // Примечание: родительский каталог идентифицируется списком pidl за вычетом последнего // элемента, поэтому мы временно зануляем pLastId->mkid.cb, отрезая его от списка temp = pLastId->mkid.cb; pLastId->mkid.cb = 0; IShellFolder *pFolder; hr = pDesktopFolder->BindToObject(pidl, NULL, IID_IShellFolder, (void**)&pFolder); if (S_OK == hr){ // Получаем интерфейс IContextMenu для заданного файла/каталога // Примечание: относительно родительского объекта заданный файл/каталог идентифицируется // единственным элементом pLastId pLastId->mkid.cb = temp; IContextMenu *pContextMenu; hr = pFolder->GetUIObjectOf( hwnd, 1, (LPCITEMIDLIST *)&pLastId, IID_IContextMenu, NULL, (void**)&pContextMenu); if (S_OK == hr){ // Создаём меню HMENU hPopupMenu = CreatePopupMenu(); // Заполняем меню pContextMenu->QueryContextMenu(hPopupMenu, 0, 1, 0x7FFF, 0); // Отображаем меню UINT nCmd = TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_RETURNCMD, xPos, yPos, 0, hwnd, 0); // Выполняем команду (если она была выбрана) if(nCmd) { CMINVOKECOMMANDINFO ici; ZeroMemory(&ici, sizeof(CMINVOKECOMMANDINFO)); ici.cbSize = sizeof(CMINVOKECOMMANDINFO); ici.hwnd = hwnd; ici.lpVerb = MAKEINTRESOURCE(nCmd-1); ici.nShow = SW_SHOWNORMAL; pContextMenu->InvokeCommand(&ici); } } pContextMenu->Release(); } // Освобождаем все полученные интерфейсы pFolder->Release(); } // Получаем интерфейс IMalloc IMalloc *pMalloc; SHGetMalloc(&pMalloc); // Освобождаем память, выделенную для pidl pMalloc->Free(pidl); pMalloc->Release(); } pDesktopFolder->Release(); } return 0; }};