ShellContextMenu.h
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:10k
源码类别:

图形图象

开发平台:

Visual C++

  1. /***************************************************************************/
  2. /* NOTE:                                                                   */
  3. /* This document is copyright (c) by Oz Solomonovich.  All non-commercial  */
  4. /* use is allowed, as long as this document is not altered in any way, and */
  5. /* due credit is given.                                                    */
  6. /***************************************************************************/
  7. // ShellContextMenu.h : header file
  8. //
  9. #if !defined(AFX_SHELLCONTEXTMENU_H__24BAC666_2B03_11D3_B9C1_0000861DFCE7__INCLUDED_)
  10. #define AFX_SHELLCONTEXTMENU_H__24BAC666_2B03_11D3_B9C1_0000861DFCE7__INCLUDED_
  11. #if _MSC_VER > 1000
  12. #pragma once
  13. #endif // _MSC_VER > 1000
  14. //#define USESTL
  15. #if defined USESTL
  16. #include <vector>
  17. #include <algorithm>
  18. using namespace std;
  19. typedef vector<CMenu*> vecODMenu;
  20. #define STL_FOR_ITERATOR(t,v) for(t::iterator it=v.begin();it != v.end();it++)
  21. #define STL_ERASE_ALL(v) v.erase(v.begin(),v.end())
  22. #define STL_GET_CURRENT(v) *it
  23. #define STL_ADD_ITEM(v,i) v.push_back(i);
  24. #define STL_EMPTY(v) v.empty()
  25. #define STL_SORT(v,f,c) TRACE0("Sorting with STLn"); is_less_than_pidl::psf = f; sort(v.begin(),v.end(),c);
  26. #else
  27. #include <afxtempl.h>
  28. typedef CArray<CMenu*,CMenu*> vecODMenu;
  29. #define STL_FOR_ITERATOR(t,v) for (int i=0;i < v.GetSize();i++)
  30. #define STL_ERASE_ALL(v) v.RemoveAll()
  31. #define STL_GET_CURRENT(v) v.GetAt(i) 
  32. #define STL_ADD_ITEM(v,i) v.Add(i);
  33. #define STL_EMPTY(v) v.GetSize() == 0
  34. #define STL_SORT(v,f,c) TRACE0("Sorting with MFCn"); is_less_than_pidl::psf = f; qsort(v.GetData(),v.GetSize(),sizeof(void*),c);
  35. #endif
  36. #include "PIDL.h"
  37. class CShellContextMenu
  38. {
  39.     LPCONTEXTMENU           m_lpcm;
  40. LPSHELLFOLDER m_psfParent;
  41. LPITEMIDLIST m_pidl;
  42. LPITEMIDLIST *m_ppidl;
  43. UINT m_cidl;
  44. CString m_sAbsPath;
  45.     HWND                    m_hWnd;
  46.     CMenu *                 m_pSendToMenu;
  47. vecODMenu               m_OwnerDrawMenus;
  48. CSize m_szOldButtonSize;
  49. public:    
  50.     CShellContextMenu(HWND m_hWnd, const CString &sAbsPath, LPITEMIDLIST *ppidl, UINT cidl, LPSHELLFOLDER psfParent);
  51.     ~CShellContextMenu();
  52.     bool IsMenuCommand(int iCmd) const;
  53.     void InvokeCommand(int iCmd) const;
  54.     void CShellContextMenu::SetMenu(CMenu *pMenu);
  55. protected:    
  56. void AddKey(CString &sDestKey,const CString &sSrcKey) const;
  57. CString GetExt(const CString &sPath) const;
  58. void GetAppDetails(const CString &sAppName,CString &sDisplayName,CString &sCommand,HICON &hAppIcon) const;
  59.     void CShellContextMenu::FillSendToMenu(CMenu *pMenu, 
  60.         LPSHELLFOLDER pSF, UINT &idm);
  61.     void FillOpenWithMenu(CMenu *pMenu,const CString &sExt); 
  62. };
  63. /////////////////////////////////////////////////////////////////////////////
  64. // Addition: Philip Oldaker
  65. // Maybe overkill to sort the SendTo menu but could be useful
  66. /////////////////////////////////////////////////////////////////////////////
  67. class CShCMSort
  68. {
  69. public:
  70.     CShCMSort(UINT nID,LPITEMIDLIST pidl,HICON hIcon,const CString &sText,DWORD dwItemData);
  71.     CShCMSort();
  72.     ~CShCMSort();
  73.     CShCMSort(const CShCMSort &rOther);
  74.     const CShCMSort &operator=(const CShCMSort &rOther);
  75. // Properties
  76. void SetIndent(int nIndent);
  77. int GetIndent() const;
  78. public:
  79.     void SetImage(int nImage);
  80.     int GetImage() const;
  81.     void SetSelImage(int nSelImage);
  82.     int GetSelImage() const;
  83.     void SetOverlayImage(int nOverlayImage);
  84.     int GetOverlayImage() const;
  85.     void SetPidl(LPITEMIDLIST pidl);
  86.     const LPITEMIDLIST GetPidl() const;
  87.     void SetIcon(HICON hIcon);
  88.     HICON GetIcon() const;
  89.     void SetItemID(UINT nID);
  90.     UINT GetItemID() const;
  91.     void SetText(const CString &sText);
  92.     const CString &GetText() const;
  93.     void SetItemData(DWORD dwItemData);
  94.     DWORD GetItemData() const;
  95. private:
  96.     // relative pidl
  97.     LPITEMIDLIST    m_pidl;   
  98.     int             m_nIndent;
  99.     int             m_nImage;
  100.     int             m_nSelImage;
  101.     int             m_nOverlayImage;
  102.     HICON           m_hIcon;
  103.     UINT            m_ID;
  104.     CString         m_sText;
  105.     DWORD           m_dwItemData;       
  106. };
  107. inline void CShCMSort::SetIndent(int nIndent)
  108. {
  109. m_nIndent = nIndent;
  110. }
  111. inline int CShCMSort::GetIndent() const
  112. {
  113. return m_nIndent;
  114. }
  115. inline void CShCMSort::SetImage(int nImage)
  116. {
  117. m_nImage = nImage;
  118. }
  119. inline int CShCMSort::GetImage() const
  120. {
  121. return m_nImage;
  122. }
  123. inline void CShCMSort::SetSelImage(int nSelImage)
  124. {
  125. m_nSelImage = nSelImage;
  126. }
  127. inline int CShCMSort::GetSelImage() const
  128. {
  129. return m_nSelImage;
  130. }
  131. inline void CShCMSort::SetOverlayImage(int nOverlayImage)
  132. {
  133. m_nOverlayImage = nOverlayImage;
  134. }
  135. inline int CShCMSort::GetOverlayImage() const
  136. {
  137. return m_nOverlayImage;
  138. }
  139. inline CShCMSort::CShCMSort()   
  140. {
  141.     m_ID = 0;
  142.     m_dwItemData = 0;
  143.     m_pidl = NULL;
  144.     m_hIcon = NULL;
  145. m_nIndent = 0;
  146. m_nImage = 0;
  147. m_nSelImage = 0;
  148. m_nOverlayImage = 0;
  149. }
  150. inline CShCMSort::CShCMSort(UINT nID,LPITEMIDLIST pidl,HICON hIcon,const CString &sText,DWORD dwItemData)
  151. :  m_ID(nID),
  152. m_pidl(pidl),
  153. m_hIcon(hIcon),
  154. m_sText(sText),
  155. m_dwItemData(dwItemData)
  156. {
  157. }
  158. inline CShCMSort::~CShCMSort()
  159. {
  160. }
  161. inline CShCMSort::CShCMSort(const CShCMSort &rOther)
  162.  :  m_pidl(rOther.m_pidl),
  163.     m_hIcon(rOther.m_hIcon),
  164.     m_ID(rOther.m_ID),
  165.     m_sText(rOther.m_sText),
  166.     m_dwItemData(rOther.m_dwItemData),
  167. m_nIndent(rOther.m_nIndent),
  168. m_nImage(rOther.m_nImage),
  169. m_nSelImage(rOther.m_nSelImage),
  170. m_nOverlayImage(rOther.m_nOverlayImage)
  171. {
  172. }
  173. inline const CShCMSort &CShCMSort::operator=(const CShCMSort &rOther)
  174. {
  175.     if (this == &rOther)
  176.         return *this;
  177.     m_pidl = rOther.m_pidl;
  178.     m_hIcon = rOther.m_hIcon;
  179.     m_ID = rOther.m_ID;
  180.     m_sText = rOther.m_sText;
  181.     m_dwItemData = rOther.m_dwItemData;
  182. m_nIndent = rOther.m_nIndent;
  183. m_nImage = rOther.m_nImage;
  184. m_nSelImage = rOther.m_nSelImage;
  185. m_nOverlayImage = rOther.m_nOverlayImage;
  186.     return *this;
  187. }
  188. inline void CShCMSort::SetPidl(LPITEMIDLIST pidl)
  189. {
  190. m_pidl = pidl;
  191. }
  192. inline const LPITEMIDLIST CShCMSort::GetPidl() const
  193. {
  194. return m_pidl;
  195. }
  196. inline void CShCMSort::SetIcon(HICON hIcon)
  197. {
  198. m_hIcon = hIcon;
  199. }
  200. inline HICON CShCMSort::GetIcon() const
  201. {
  202. return m_hIcon;
  203. }
  204. inline void CShCMSort::SetItemID(UINT nID)
  205. {
  206. m_ID = nID;
  207. }
  208. inline UINT CShCMSort::GetItemID() const
  209. {
  210. return m_ID;
  211. }
  212. inline void CShCMSort::SetText(const CString &sText)
  213. {
  214. m_sText = sText;
  215. }
  216. inline const CString &CShCMSort::GetText() const
  217. {
  218. return m_sText;
  219. }
  220. inline void CShCMSort::SetItemData(DWORD dwItemData)
  221. {
  222. m_dwItemData = dwItemData;
  223. }
  224. inline DWORD CShCMSort::GetItemData() const
  225. {
  226. return m_dwItemData;
  227. }
  228. // STL predicate helpers
  229. // sort by pidl
  230. class is_less_than_pidl
  231. {                           
  232. public:
  233. is_less_than_pidl() {}
  234. // STL
  235. bool operator()(const CShCMSort *x,const CShCMSort *y)
  236. {
  237. return ComparePidls(x,y) < 0;
  238. }
  239. int ComparePidls(const CShCMSort *x,const CShCMSort *y)
  240. {
  241. ASSERT(is_less_than_pidl::psf);
  242. HRESULT hr = is_less_than_pidl::psf->CompareIDs(0, x->GetPidl(), y->GetPidl());
  243. if (FAILED(hr))
  244. return 0;
  245. return (short)hr;
  246. }
  247. // MFC
  248. static int compare(const void *x, const void *y)
  249. {
  250. const CShCMSort *x1 = *(const CShCMSort**)x;
  251. const CShCMSort *y1 = *(const CShCMSort**)y;
  252. return is_less_than_pidl().ComparePidls(x1,y1);
  253. }
  254. public:
  255. CTRL_EXT_CLASS static LPSHELLFOLDER psf;
  256. };
  257. class is_greater_than_pidl
  258. {                           
  259. public:
  260. is_greater_than_pidl() { }
  261. // STL
  262. bool operator()(const CShCMSort *x,const CShCMSort *y)
  263. {
  264. return ComparePidls(x,y) > 0;
  265. }
  266. int ComparePidls(const CShCMSort *x,const CShCMSort *y)
  267. {
  268. HRESULT hr = is_greater_than_pidl::psf->CompareIDs(0, x->GetPidl(), y->GetPidl());
  269. if (FAILED (hr))
  270. return 0;
  271. return (short)hr;
  272. }
  273. // MFC
  274. static int compare(const void *x, const void *y)
  275. {
  276. const CShCMSort *x1 = *(const CShCMSort**)x;
  277. const CShCMSort *y1 = *(const CShCMSort**)y;
  278. return is_greater_than_pidl().ComparePidls(x1,y1);
  279. }
  280. public:
  281. CTRL_EXT_CLASS static LPSHELLFOLDER psf;
  282. };
  283. // sort by text
  284. class is_less_than_text
  285. {                           
  286. public:
  287. // STL
  288. bool operator()(const CShCMSort *x,const CShCMSort *y)
  289. {
  290. return CompareText(x,y) < 0;
  291. }
  292. int CompareText(const CShCMSort *x,const CShCMSort *y)
  293. {
  294. return x->GetText() < y->GetText();
  295. }
  296. // MFC
  297. static int compare(const void *x, const void *y)
  298. {
  299. const CShCMSort *x1 = *(const CShCMSort**)x;
  300. const CShCMSort *y1 = *(const CShCMSort**)y;
  301. return is_less_than_text().CompareText(x1,y1);
  302. }
  303. };
  304. class is_greater_than_text
  305. {                           
  306. public:
  307. // STL
  308. bool operator()(const CShCMSort *x,const CShCMSort *y)
  309. {
  310. return CompareText(x,y) < 0;
  311. }
  312. int CompareText(const CShCMSort *x,const CShCMSort *y)
  313. {
  314. return x->GetText() > y->GetText();
  315. }
  316. // MFC
  317. static int compare(const void *x, const void *y)
  318. {
  319. const CShCMSort *x1 = *(const CShCMSort**)x;
  320. const CShCMSort *y1 = *(const CShCMSort**)y;
  321. return is_greater_than_text().CompareText(x1,y1);
  322. }
  323. };
  324. #if defined USESTL
  325. typedef vector<CShCMSort*> vecCMSort;
  326. #define STL_SORT_FUNC is_less_than_pidl()
  327. #else
  328. typedef CArray<CShCMSort*,CShCMSort*> vecCMSort;
  329. #define STL_SORT_FUNC is_less_than_pidl::compare
  330. #endif
  331. /////////////////////////////////////////////////////////////////
  332. //{{AFX_INSERT_LOCATION}}
  333. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  334. #endif // !defined(AFX_SHELLCONTEXTMENU_H__24BAC666_2B03_11D3_B9C1_0000861DFCE7__INCLUDED_)