XTShellPidl.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:18k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTShellPidl.h : header file
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #ifndef __XTSHELLPIDL_H__
  22. #define __XTSHELLPIDL_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. // ----------------------------------------------------------------------
  28. // Summary:
  29. //     XT_LVITEMDATA structure is used to maintain information for
  30. //     a particular list item in a CXTShellListCtrl or CXTShellListView
  31. //     window.
  32. // See Also:
  33. //     CXTShellListCtrl, CXTShellListView
  34. // ----------------------------------------------------------------------
  35. struct XT_LVITEMDATA
  36. {
  37. ULONG           ulAttribs;  // Shell item attributes.
  38. LPITEMIDLIST    lpi;        // Pointer to an item ID list.
  39. LPSHELLFOLDER   lpsfParent; // Points to the parent shell folder item.
  40. };
  41. // ----------------------------------------------------------------------
  42. // Summary:
  43. //     XT_TVITEMDATA structure is used to maintain information for
  44. //     a particular tree item in a CXTShellTreeCtrl or CXTShellTreeView
  45. //     window.
  46. // See Also:
  47. //     CXTShellTreeCtrl, CXTShellTreeView
  48. // ----------------------------------------------------------------------
  49. struct XT_TVITEMDATA
  50. {
  51. LPITEMIDLIST    lpi;        // Pointer to an item ID list.
  52. LPITEMIDLIST    lpifq;      // Pointer to an item ID list.
  53. LPSHELLFOLDER   lpsfParent; // Pointer to the parent shell folder item.
  54. };
  55. //===========================================================================
  56. // Summary:
  57. //     CXTShellPidl is a stand alone base class. This class is used by the
  58. //     shell tree and list controls to handle PIDL creation and management.
  59. //===========================================================================
  60. class _XTP_EXT_CLASS CXTShellPidl
  61. {
  62. //{{AFX_CODEJOCK_PRIVATE
  63. public:
  64. class _XTP_EXT_CLASS CShellMalloc
  65. {
  66. public:
  67. CShellMalloc()
  68. {
  69. m_lpMalloc = NULL;
  70. if (FAILED(::SHGetMalloc(&m_lpMalloc)))
  71. {
  72. m_lpMalloc = NULL;
  73. }
  74. }
  75. ~CShellMalloc()
  76. {
  77. if (m_lpMalloc)
  78. {
  79. m_lpMalloc->Release();
  80. }
  81. }
  82. void* Alloc (DWORD nBytes)
  83. {
  84. ASSERT(m_lpMalloc != NULL);
  85. return m_lpMalloc ? m_lpMalloc->Alloc(nBytes) : NULL;
  86. }
  87. void Free(void* lpMem)
  88. {
  89. ASSERT(m_lpMalloc != NULL);
  90. if (m_lpMalloc)
  91. {
  92. m_lpMalloc->Free(lpMem);
  93. }
  94. }
  95. operator LPMALLOC()
  96. {
  97. return m_lpMalloc;
  98. }
  99. protected:
  100. LPMALLOC m_lpMalloc;
  101. };
  102. class _XTP_EXT_CLASS CShellSpecialFolder
  103. {
  104. public:
  105. CShellSpecialFolder(int nFolder = CSIDL_DESKTOP);
  106. ~CShellSpecialFolder()
  107. {
  108. if (m_lpFolder)
  109. {
  110. m_lpFolder->Release();
  111. }
  112. }
  113. operator LPSHELLFOLDER()
  114. {
  115. return m_lpFolder;
  116. }
  117. protected:
  118. LPSHELLFOLDER m_lpFolder;
  119. };
  120. //}}AFX_CODEJOCK_PRIVATE
  121. public:
  122. //-----------------------------------------------------------------------
  123. // Summary:
  124. //     Constructs a CXTShellPidl object
  125. //-----------------------------------------------------------------------
  126. CXTShellPidl();
  127. //-----------------------------------------------------------------------
  128. // Summary:
  129. //     Destroys a CXTShellPidl object, handles cleanup and deallocation
  130. //-----------------------------------------------------------------------
  131. virtual ~CXTShellPidl();
  132. public:
  133. //-----------------------------------------------------------------------
  134. // Summary:
  135. //     This member function gets the fully qualified PIDL for the path string.
  136. // Parameters:
  137. //     path - File system path string.
  138. // Returns:
  139. //     A pointer to an item ID list. Returns NULL if it fails.
  140. //-----------------------------------------------------------------------
  141. LPITEMIDLIST IDLFromPath(LPCTSTR path);
  142. //-----------------------------------------------------------------------
  143. // Summary:
  144. //     This member function performs the OneUp or back function.
  145. // Parameters:
  146. //     pidlPath - Fully qualified PIDL.
  147. // Returns:
  148. //     A fully qualified parent PIDL.
  149. //-----------------------------------------------------------------------
  150. LPITEMIDLIST OneUpPIDL(LPITEMIDLIST pidlPath);
  151. //-----------------------------------------------------------------------
  152. // Summary:
  153. //     This member function gets the parent folder using PIDLs.
  154. // Parameters:
  155. //     path - Path string.
  156. // Returns:
  157. //     A path string to the parent.
  158. //-----------------------------------------------------------------------
  159. CString OneUpPATH(const CString& path);
  160. //-----------------------------------------------------------------------
  161. // Summary:
  162. //     This member function walks an ITEMIDLIST and points to the last one.
  163. // Parameters:
  164. //     pidl - PIDL list.
  165. // Returns:
  166. //     A pointer to the last IDL in the list.
  167. //-----------------------------------------------------------------------
  168. LPITEMIDLIST GetLastITEM(LPITEMIDLIST pidl);
  169. //-----------------------------------------------------------------------
  170. // Summary:
  171. //     This member function copies a whole ITEMIDLIST. Remember to Free()
  172. //     the old one if it is no longer needed.
  173. // Parameters:
  174. //     pidl - Pointer to an ITEMIDLIST.
  175. // Returns:
  176. //     A new pointer to a copy of the PIDL.
  177. //-----------------------------------------------------------------------
  178. LPITEMIDLIST CopyIDList(LPITEMIDLIST pidl);
  179. //-----------------------------------------------------------------------
  180. // Summary:
  181. //     This member function concatenates two PIDLs.
  182. // Parameters:
  183. //     lpMalloc - Points to the shell's IMalloc interface.
  184. //     pidl1 - Pointer to an item ID list.
  185. //     pidl2 - Pointer to an item ID list.
  186. // Returns:
  187. //     A pointer to an item ID list.
  188. //-----------------------------------------------------------------------
  189. LPITEMIDLIST ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
  190. LPITEMIDLIST ConcatPidls(LPMALLOC lpMalloc, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); // <combine CXTShellPidl::ConcatPidls@LPCITEMIDLIST@LPCITEMIDLIST>
  191. //-----------------------------------------------------------------------
  192. // Summary:
  193. //     This member function gets the fully qualified PIDLs for the specified
  194. //     folder.
  195. // Parameters:
  196. //     lpsf - Pointer to the parent shell folder.
  197. //     lpi  - Pointer to the item ID that is relative to 'lpsf'.
  198. // Returns:
  199. //     A pointer to an item ID list.
  200. //-----------------------------------------------------------------------
  201. LPITEMIDLIST GetFullyQualPidl(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi);
  202. //-----------------------------------------------------------------------
  203. // Summary:
  204. //     This member function copies the ITEMID.
  205. // Parameters:
  206. //     lpMalloc - Points to the shell's IMalloc interface.
  207. //     lpi      - Pointer to item ID that is to be copied.
  208. // Returns:
  209. //     A pointer to an item ID list.
  210. //-----------------------------------------------------------------------
  211. LPITEMIDLIST DuplicateItem(LPMALLOC lpMalloc, LPITEMIDLIST lpi);
  212. //-----------------------------------------------------------------------
  213. // Summary:
  214. //     This member function gets the friendly name for the folder or file.
  215. // Parameters:
  216. //     lpsf           - Pointer to the parent shell folder.
  217. //     lpi            - Pointer to the item ID that is relative to 'lpsf'.
  218. //     dwFlags        - Flags to determine which value to return. See SHGNO for more details.
  219. //     lpFriendlyName - Buffer to receive the friendly name of the folder.
  220. // Returns:
  221. //     TRUE if successful, otherwise returns FALSE.
  222. //-----------------------------------------------------------------------
  223. BOOL GetName(LPSHELLFOLDER lpsf, LPITEMIDLIST  lpi, DWORD dwFlags, CString& lpFriendlyName);
  224. //-----------------------------------------------------------------------
  225. // Summary:
  226. //     This member function allocates a PIDL.
  227. // Parameters:
  228. //     lpMalloc - Points to the shell's IMalloc interface.
  229. //     cbSize - Initial size of the PIDL.
  230. // Returns:
  231. //     A pointer to an item ID list.
  232. //-----------------------------------------------------------------------
  233. LPITEMIDLIST CreatePidl(LPMALLOC lpMalloc, UINT cbSize);
  234. //-----------------------------------------------------------------------
  235. // Summary:
  236. //     This member function computes the number of item IDs in an item ID
  237. //     list.
  238. // Parameters:
  239. //     pidl - Pointer to an item ID list.
  240. // Returns:
  241. //     The number of item IDs in the list.
  242. //-----------------------------------------------------------------------
  243. UINT GetPidlItemCount(LPCITEMIDLIST pidl);
  244. //-----------------------------------------------------------------------
  245. // Summary:
  246. //     This member function retrieves the next PIDL in the list.
  247. // Parameters:
  248. //     pidl - Pointer to an item ID list.
  249. // Returns:
  250. //     A pointer to the next PIDL item in the list.
  251. //-----------------------------------------------------------------------
  252. LPITEMIDLIST GetNextPidlItem(LPCITEMIDLIST pidl);
  253. //-----------------------------------------------------------------------
  254. // Summary:
  255. //     This member function displays a popup context menu if given a parent
  256. //     shell folder, relative item ID, and screen location.
  257. // Parameters:
  258. //     hwnd       - Context menu owner.
  259. //     lpsfParent - Pointer to the parent shell folder.
  260. //     lpi        - Pointer to the item ID that is relative to 'lpsfParent'.
  261. //     lppi       - Pointer to the item ID that is relative to 'lpsfParent'.
  262. //     nCount     - Number of PIDLs.
  263. //     lppt       - Screen location of where to popup the menu.
  264. // Returns:
  265. //     TRUE on success, or FALSE on failure.
  266. //-----------------------------------------------------------------------
  267. BOOL ShowContextMenu(HWND hwnd, LPSHELLFOLDER lpsfParent, LPITEMIDLIST lpi, LPPOINT lppt);
  268. BOOL ShowContextMenu(HWND hwnd, LPSHELLFOLDER lpsfParent, LPCITEMIDLIST* lppi, int nCount, LPPOINT lppt); // <combine CXTShellPidl::ShowContextMenu@HWND@LPSHELLFOLDER@LPITEMIDLIST@LPPOINT>
  269. //-----------------------------------------------------------------------
  270. // Summary:
  271. //     This member function gets the index for the current icon. Index is
  272. //     the index into the system image list.
  273. // Parameters:
  274. //     lpi    - Fully qualified item ID list for the current item.
  275. //     uFlags - Flags for SHGetFileInfo().
  276. // Returns:
  277. //     An icon index for the current item.
  278. //-----------------------------------------------------------------------
  279. int GetItemIcon(LPITEMIDLIST lpi, UINT uFlags) const;
  280. HIMAGELIST GetSystemImageList(UINT uFlags) const;
  281. //-----------------------------------------------------------------------
  282. // Summary:
  283. //     This member function retrieves the IContextMenu, IContextMenu2 or IContextMenu3
  284. //     interface.
  285. // Parameters:
  286. //     psfFolder - A pointer to a valid IShellFolder data type.
  287. //     localPidl - A pointer to a valid _ITEMIDLIST structure.
  288. //     nCount    - Number of items in the context menu.
  289. //     ppCM      - Long pointer to a CONTEXTMENU struct.
  290. //     pcmType   - A pointer to a valid int data type that represents the version number
  291. //     of the context menu.
  292. // Returns:
  293. //     An HRESULT value.
  294. //-----------------------------------------------------------------------
  295. HRESULT GetSHContextMenu(LPSHELLFOLDER psfFolder, LPCITEMIDLIST* localPidl, int nCount, void** ppCM, int* pcmType);
  296. public:
  297. // ---------------------------------------------------------------------------
  298. // Summary:
  299. //     CXTShellTreeCtrl callback sort function.
  300. // Parameters:
  301. //     lparam1 -     Corresponds to the lParam member of the TV_ITEM structure
  302. //                   for the two items being compared.
  303. //     lparam2 -     Corresponds to the lParam member of the TV_ITEM structure
  304. //                   for the two items being compared.
  305. //     lparamSort -  The 'lParamSort' member corresponds to the lParam member of
  306. //                   TV_SORTCB.
  307. // Remarks:
  308. //     This member function is a callback function used by
  309. //     CXTShellTreeCtrl and CXTShellTreeView, and is called during a sort
  310. //     operation each time the relative order of two list items needs to
  311. //     be compared.
  312. // Returns:
  313. //     A negative value if the first item should precede the second, a
  314. //     positive value if the first item should follow the second, or zero
  315. //     if the two items are equivalent.
  316. // ---------------------------------------------------------------------------
  317. static int CALLBACK TreeViewCompareProc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort);
  318. // ---------------------------------------------------------------------------
  319. // Summary:
  320. //     CXTShellListCtrl callback sort function.
  321. // Parameters:
  322. //     lparam1 -     Corresponds to the lParam member of the LV_ITEM structure
  323. //                   for the two items being compared.
  324. //     lparam2 -     Corresponds to the lParam member of the LV_ITEM structure
  325. //                   for the two items being compared.
  326. //     lparamSort -  The 'lParamSort' member corresponds to the lParam member of
  327. //                   LV_SORTCB.
  328. // Remarks:
  329. //     This member function is a callback function used by
  330. //     CXTShellListCtrl and CXTShellListView, and is called during a sort
  331. //     operation each time the relative order of two list items needs to
  332. //     be compared.
  333. // Returns:
  334. //     A negative value if the first item should precede the second, a
  335. //     positive value if the first item should follow the second, or zero
  336. //     if the two items are equivalent.
  337. // ---------------------------------------------------------------------------
  338. static int CALLBACK ListViewCompareProc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort);
  339. void ShowShellLinkIcons(BOOL bShowLinkIcons = TRUE);
  340. public:
  341. //-----------------------------------------------------------------------
  342. // Summary:
  343. //     Calculates number of item IDs in the list.
  344. // Parameters:
  345. //     pidl - Pointer to an item ID list.
  346. // Returns:
  347. //     The number of item IDs in the list.
  348. //-----------------------------------------------------------------------
  349. UINT GetPidlCount(LPCITEMIDLIST pidl);
  350. //-----------------------------------------------------------------------
  351. // Summary:
  352. //     This member function frees memory for allocated for a PIDL.
  353. // Parameters:
  354. //     pidl - Pointer to an item ID list.
  355. //-----------------------------------------------------------------------
  356. void FreePidl(LPITEMIDLIST pidl);
  357. //-----------------------------------------------------------------------
  358. // Summary:
  359. //     This member function copies a single PIDL out of a list. Remember to Free()
  360. //     the old one if it is no longer needed.
  361. // Parameters:
  362. //     pidl - Pointer to an ITEMIDLIST.
  363. //     nItem - PIDL in the list to copy.
  364. // Returns:
  365. //     A new pointer to a copy of the PIDL with the single item.
  366. //-----------------------------------------------------------------------
  367. LPITEMIDLIST CopyPidlItem(LPITEMIDLIST pidl, UINT nItem);
  368. //-----------------------------------------------------------------------
  369. // Summary:
  370. //     This member function compares two PIDLs to determine if they match.
  371. // Parameters:
  372. //     pidl1        - Pointer to an item ID list.
  373. //     pidl2        - Pointer to an item ID list.
  374. //     pShellFolder - Pointer to the shell folder to use for the comparison (default Desktop)
  375. // Returns:
  376. //     TRUE on success, or FALSE on failure.
  377. //-----------------------------------------------------------------------
  378. BOOL ComparePidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, LPSHELLFOLDER pShellFolder = NULL);
  379. protected:
  380. //-----------------------------------------------------------------------
  381. // Summary:
  382. //     This method is called when item of context menu was executed
  383. // Parameters:
  384. //     idCmd - Item identifier was executed.
  385. //     cmi   - CMINVOKECOMMANDINFO structure reference contained additional information about item was executed.
  386. //-----------------------------------------------------------------------
  387. virtual void OnShowContextMenu(int idCmd, CMINVOKECOMMANDINFO& cmi);
  388. //-----------------------------------------------------------------------
  389. // Summary:
  390. //     This function translates shell attributes into a tree item state
  391. // Parameters:
  392. //     pTreeCtrl    - Tree Control that owns an item
  393. //     pListCtrl    - List Control that owns an item
  394. //     hItem        - Handle to identify the item, passed verbatim to SetItemState()
  395. //     iItem        - Index to identify the item, passed verbatim to SetItemState()
  396. //     dwAttributes - Shell attributes to translate
  397. //-----------------------------------------------------------------------
  398. virtual void MapShellFlagsToItemAttributes(CListCtrl* pListCtrl, int iItem, DWORD dwAttributes);
  399. virtual void MapShellFlagsToItemAttributes(CTreeCtrl* pTreeCtrl, HTREEITEM hItem, DWORD dwAttributes); // <combine CXTShellPidl::MapShellFlagsToItemAttributes@CListCtrl*@int@DWORD>
  400. private:
  401. static LRESULT CALLBACK HookWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
  402. protected:
  403. BOOL                    m_bShowShellLinkIcons;
  404. private:
  405. static WNDPROC          m_pOldWndProc; // regular window proc
  406. static LPCONTEXTMENU2   m_pIContext2;  // active shell context menu
  407. };
  408. AFX_INLINE void CXTShellPidl::ShowShellLinkIcons(BOOL bShowLinkIcons /*= TRUE*/) {
  409. m_bShowShellLinkIcons = bShowLinkIcons;
  410. }
  411. #endif // __XTSHELLPIDL_H__