📄 shellcontextmenu.h
字号:
/***************************************************************************/
/* NOTE: */
/* This document is copyright (c) by Oz Solomonovich. All non-commercial */
/* use is allowed, as long as this document is not altered in any way, and */
/* due credit is given. */
/***************************************************************************/
// ShellContextMenu.h : header file
//
#if !defined(AFX_SHELLCONTEXTMENU_H__24BAC666_2B03_11D3_B9C1_0000861DFCE7__INCLUDED_)
#define AFX_SHELLCONTEXTMENU_H__24BAC666_2B03_11D3_B9C1_0000861DFCE7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//#define USESTL
#if defined USESTL
#include <vector>
#include <algorithm>
using namespace std;
typedef vector<CMenu*> vecODMenu;
#define STL_FOR_ITERATOR(t,v) for(t::iterator it=v.begin();it != v.end();it++)
#define STL_ERASE_ALL(v) v.erase(v.begin(),v.end())
#define STL_GET_CURRENT(v) *it
#define STL_ADD_ITEM(v,i) v.push_back(i);
#define STL_EMPTY(v) v.empty()
#define STL_SORT(v,f,c) TRACE0("Sorting with STL\n"); is_less_than_pidl::psf = f; sort(v.begin(),v.end(),c);
#else
#include <afxtempl.h>
typedef CArray<CMenu*,CMenu*> vecODMenu;
#define STL_FOR_ITERATOR(t,v) for (int i=0;i < v.GetSize();i++)
#define STL_ERASE_ALL(v) v.RemoveAll()
#define STL_GET_CURRENT(v) v.GetAt(i)
#define STL_ADD_ITEM(v,i) v.Add(i);
#define STL_EMPTY(v) v.GetSize() == 0
#define STL_SORT(v,f,c) TRACE0("Sorting with MFC\n"); is_less_than_pidl::psf = f; qsort(v.GetData(),v.GetSize(),sizeof(void*),c);
#endif
#include "PIDL.h"
class CShellContextMenu
{
LPCONTEXTMENU m_lpcm;
LPSHELLFOLDER m_psfParent;
LPITEMIDLIST m_pidl;
LPITEMIDLIST *m_ppidl;
UINT m_cidl;
CString m_sAbsPath;
HWND m_hWnd;
CMenu * m_pSendToMenu;
vecODMenu m_OwnerDrawMenus;
CSize m_szOldButtonSize;
public:
CShellContextMenu(HWND m_hWnd, const CString &sAbsPath, LPITEMIDLIST *ppidl, UINT cidl, LPSHELLFOLDER psfParent);
~CShellContextMenu();
bool IsMenuCommand(int iCmd) const;
void InvokeCommand(int iCmd) const;
void CShellContextMenu::SetMenu(CMenu *pMenu);
protected:
void AddKey(CString &sDestKey,const CString &sSrcKey) const;
CString GetExt(const CString &sPath) const;
void GetAppDetails(const CString &sAppName,CString &sDisplayName,CString &sCommand,HICON &hAppIcon) const;
void CShellContextMenu::FillSendToMenu(CMenu *pMenu,
LPSHELLFOLDER pSF, UINT &idm);
void FillOpenWithMenu(CMenu *pMenu,const CString &sExt);
};
/////////////////////////////////////////////////////////////////////////////
// Addition: Philip Oldaker
// Maybe overkill to sort the SendTo menu but could be useful
/////////////////////////////////////////////////////////////////////////////
class CShCMSort
{
public:
CShCMSort(UINT nID,LPITEMIDLIST pidl,HICON hIcon,const CString &sText,DWORD dwItemData);
CShCMSort();
~CShCMSort();
CShCMSort(const CShCMSort &rOther);
const CShCMSort &operator=(const CShCMSort &rOther);
// Properties
void SetIndent(int nIndent);
int GetIndent() const;
public:
void SetImage(int nImage);
int GetImage() const;
void SetSelImage(int nSelImage);
int GetSelImage() const;
void SetOverlayImage(int nOverlayImage);
int GetOverlayImage() const;
void SetPidl(LPITEMIDLIST pidl);
const LPITEMIDLIST GetPidl() const;
void SetIcon(HICON hIcon);
HICON GetIcon() const;
void SetItemID(UINT nID);
UINT GetItemID() const;
void SetText(const CString &sText);
const CString &GetText() const;
void SetItemData(DWORD dwItemData);
DWORD GetItemData() const;
private:
// relative pidl
LPITEMIDLIST m_pidl;
int m_nIndent;
int m_nImage;
int m_nSelImage;
int m_nOverlayImage;
HICON m_hIcon;
UINT m_ID;
CString m_sText;
DWORD m_dwItemData;
};
inline void CShCMSort::SetIndent(int nIndent)
{
m_nIndent = nIndent;
}
inline int CShCMSort::GetIndent() const
{
return m_nIndent;
}
inline void CShCMSort::SetImage(int nImage)
{
m_nImage = nImage;
}
inline int CShCMSort::GetImage() const
{
return m_nImage;
}
inline void CShCMSort::SetSelImage(int nSelImage)
{
m_nSelImage = nSelImage;
}
inline int CShCMSort::GetSelImage() const
{
return m_nSelImage;
}
inline void CShCMSort::SetOverlayImage(int nOverlayImage)
{
m_nOverlayImage = nOverlayImage;
}
inline int CShCMSort::GetOverlayImage() const
{
return m_nOverlayImage;
}
inline CShCMSort::CShCMSort()
{
m_ID = 0;
m_dwItemData = 0;
m_pidl = NULL;
m_hIcon = NULL;
m_nIndent = 0;
m_nImage = 0;
m_nSelImage = 0;
m_nOverlayImage = 0;
}
inline CShCMSort::CShCMSort(UINT nID,LPITEMIDLIST pidl,HICON hIcon,const CString &sText,DWORD dwItemData)
: m_ID(nID),
m_pidl(pidl),
m_hIcon(hIcon),
m_sText(sText),
m_dwItemData(dwItemData)
{
}
inline CShCMSort::~CShCMSort()
{
}
inline CShCMSort::CShCMSort(const CShCMSort &rOther)
: m_pidl(rOther.m_pidl),
m_hIcon(rOther.m_hIcon),
m_ID(rOther.m_ID),
m_sText(rOther.m_sText),
m_dwItemData(rOther.m_dwItemData),
m_nIndent(rOther.m_nIndent),
m_nImage(rOther.m_nImage),
m_nSelImage(rOther.m_nSelImage),
m_nOverlayImage(rOther.m_nOverlayImage)
{
}
inline const CShCMSort &CShCMSort::operator=(const CShCMSort &rOther)
{
if (this == &rOther)
return *this;
m_pidl = rOther.m_pidl;
m_hIcon = rOther.m_hIcon;
m_ID = rOther.m_ID;
m_sText = rOther.m_sText;
m_dwItemData = rOther.m_dwItemData;
m_nIndent = rOther.m_nIndent;
m_nImage = rOther.m_nImage;
m_nSelImage = rOther.m_nSelImage;
m_nOverlayImage = rOther.m_nOverlayImage;
return *this;
}
inline void CShCMSort::SetPidl(LPITEMIDLIST pidl)
{
m_pidl = pidl;
}
inline const LPITEMIDLIST CShCMSort::GetPidl() const
{
return m_pidl;
}
inline void CShCMSort::SetIcon(HICON hIcon)
{
m_hIcon = hIcon;
}
inline HICON CShCMSort::GetIcon() const
{
return m_hIcon;
}
inline void CShCMSort::SetItemID(UINT nID)
{
m_ID = nID;
}
inline UINT CShCMSort::GetItemID() const
{
return m_ID;
}
inline void CShCMSort::SetText(const CString &sText)
{
m_sText = sText;
}
inline const CString &CShCMSort::GetText() const
{
return m_sText;
}
inline void CShCMSort::SetItemData(DWORD dwItemData)
{
m_dwItemData = dwItemData;
}
inline DWORD CShCMSort::GetItemData() const
{
return m_dwItemData;
}
// STL predicate helpers
// sort by pidl
class is_less_than_pidl
{
public:
is_less_than_pidl() {}
// STL
bool operator()(const CShCMSort *x,const CShCMSort *y)
{
return ComparePidls(x,y) < 0;
}
int ComparePidls(const CShCMSort *x,const CShCMSort *y)
{
ASSERT(is_less_than_pidl::psf);
HRESULT hr = is_less_than_pidl::psf->CompareIDs(0, x->GetPidl(), y->GetPidl());
if (FAILED(hr))
return 0;
return (short)hr;
}
// MFC
static int compare(const void *x, const void *y)
{
const CShCMSort *x1 = *(const CShCMSort**)x;
const CShCMSort *y1 = *(const CShCMSort**)y;
return is_less_than_pidl().ComparePidls(x1,y1);
}
public:
CTRL_EXT_CLASS static LPSHELLFOLDER psf;
};
class is_greater_than_pidl
{
public:
is_greater_than_pidl() { }
// STL
bool operator()(const CShCMSort *x,const CShCMSort *y)
{
return ComparePidls(x,y) > 0;
}
int ComparePidls(const CShCMSort *x,const CShCMSort *y)
{
HRESULT hr = is_greater_than_pidl::psf->CompareIDs(0, x->GetPidl(), y->GetPidl());
if (FAILED (hr))
return 0;
return (short)hr;
}
// MFC
static int compare(const void *x, const void *y)
{
const CShCMSort *x1 = *(const CShCMSort**)x;
const CShCMSort *y1 = *(const CShCMSort**)y;
return is_greater_than_pidl().ComparePidls(x1,y1);
}
public:
CTRL_EXT_CLASS static LPSHELLFOLDER psf;
};
// sort by text
class is_less_than_text
{
public:
// STL
bool operator()(const CShCMSort *x,const CShCMSort *y)
{
return CompareText(x,y) < 0;
}
int CompareText(const CShCMSort *x,const CShCMSort *y)
{
return x->GetText() < y->GetText();
}
// MFC
static int compare(const void *x, const void *y)
{
const CShCMSort *x1 = *(const CShCMSort**)x;
const CShCMSort *y1 = *(const CShCMSort**)y;
return is_less_than_text().CompareText(x1,y1);
}
};
class is_greater_than_text
{
public:
// STL
bool operator()(const CShCMSort *x,const CShCMSort *y)
{
return CompareText(x,y) < 0;
}
int CompareText(const CShCMSort *x,const CShCMSort *y)
{
return x->GetText() > y->GetText();
}
// MFC
static int compare(const void *x, const void *y)
{
const CShCMSort *x1 = *(const CShCMSort**)x;
const CShCMSort *y1 = *(const CShCMSort**)y;
return is_greater_than_text().CompareText(x1,y1);
}
};
#if defined USESTL
typedef vector<CShCMSort*> vecCMSort;
#define STL_SORT_FUNC is_less_than_pidl()
#else
typedef CArray<CShCMSort*,CShCMSort*> vecCMSort;
#define STL_SORT_FUNC is_less_than_pidl::compare
#endif
/////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SHELLCONTEXTMENU_H__24BAC666_2B03_11D3_B9C1_0000861DFCE7__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -