📄 gxmenu.cpp
字号:
// gxMenu.cpp : Implementation of CgxMenu
#include "stdafx.h"
#include "MenuDemo.h"
#include "gxMenu.h"
HINSTANCE g_hInst;
UINT g_DllRefCount;
int g_nColumn1;
int g_nColumn2;
BOOL g_bViewKeys;
BOOL g_bShowIDW;
HIMAGELIST g_himlLarge;
HIMAGELIST g_himlSmall;
/////////////////////////////////////////////////////////////////////////////
// CgxMenu
HRESULT CgxMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu,
UINT idCmdFirst, UINT idCmdLast,
UINT uFlags)
{
if (!(CMF_DEFAULTONLY & uFlags))
{
int nCmdRegister = idCmdFirst;
int nCmdUnregister = idCmdFirst+1;
InsertMenu(hmenu, indexMenu++, MF_SEPARATOR,
nCmdRegister, _T("-"));
InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION,
nCmdRegister+1, _T("文档上传"));
InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION,
nCmdRegister+2, _T("文档下载"));
InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION,
nCmdRegister+3, _T("文档打印"));
InsertMenu(hmenu, indexMenu++, MF_STRING|MF_BYPOSITION|MF_POPUP,
nCmdRegister+4, _T("安全文档管理"));
HMENU subMenu = CreateMenu() ;
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+5, _T("发送到个人"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+6, _T("发送到群组"));
InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
nCmdRegister+7, _T("-"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+8, _T("查看消息中心"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+9, _T("服务器浏览"));
InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
nCmdRegister+10, _T("-"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+11, _T("打印审核"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+12, _T("文档秘级审核"));
InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
nCmdRegister+13, _T("-"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+14, _T("文件收发统计"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+15, _T("邮件收发"));
InsertMenu(subMenu, (UINT)hmenu, MF_SEPARATOR,
nCmdRegister+16, _T("-"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+17, _T("帮助"));
InsertMenu(subMenu, (UINT)hmenu, MF_STRING|MF_BYPOSITION,
nCmdRegister+18, _T("关于"));
MENUITEMINFO ItemInfo;
memset( &ItemInfo, 0 ,sizeof(ItemInfo)) ;
ItemInfo.cbSize = sizeof(ItemInfo) ;
ItemInfo.hSubMenu = subMenu ;
ItemInfo.fMask = MIIM_SUBMENU ;
SetMenuItemInfo(hmenu,nCmdRegister+4,FALSE,&ItemInfo) ;
DestroyMenu(subMenu) ;
// A successful return code should be the offset of
// the largest command identifier assigned, plus one
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 19);
}
return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, USHORT(0));
}
HRESULT CgxMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici)
{
TCHAR szParms[MAX_PATH+6];
// The offset will determine which option was requested:
// 0 for Register, 1 for Unregister
UINT idOffset = LOWORD(pici->lpVerb);
// Embed a '/u' for the Unregister command into the
// parameters, and always put quotes around the path
// so spaces in the path won't be a problem
char Tmp[1024] ;
memset(Tmp,0,sizeof(Tmp)) ;
// strcpy(Tmp, "c:\\filelist.txt") ;
sprintf( Tmp , " %d " , idOffset ) ;
switch(idOffset)
{
case 1:
// AfxMessageBox("文件上传") ;
// Sleep(5000) ;
ShellExecute( pici->hwnd, "open", _T("c:\\vbtest.exe"), Tmp,NULL,SW_SHOW);
break ;
case 2:
// AfxMessageBox("文件下载") ;
ShellExecute( pici->hwnd, "open", _T("c:\\vbtest.exe"), Tmp,NULL,SW_SHOW);
break ;
case 3:
// AfxMessageBox("打印") ;
ShellExecute( pici->hwnd, "open", _T("c:\\vbtest.exe"), Tmp,NULL,SW_SHOW);
break ;
case 5:
AfxMessageBox("发送到个人") ;
break ;
case 6:
AfxMessageBox("发送到群组") ;
break ;
case 7:
AfxMessageBox("") ;
break ;
case 8:
AfxMessageBox("查看消息中心") ;
break ;
case 9:
AfxMessageBox("服务器浏览") ;
break ;
case 10:
AfxMessageBox("") ;
break ;
case 11:
AfxMessageBox("打印审核") ;
break ;
case 12:
AfxMessageBox("文档秘级审核") ;
break ;
case 13:
AfxMessageBox("-") ;
break ;
case 14:
AfxMessageBox("文件收发统计") ;
break ;
case 15:
AfxMessageBox("邮件收发") ;
break ;
case 16:
AfxMessageBox("-") ;
break ;
case 17:
AfxMessageBox("帮助") ;
break ;
case 18:
AfxMessageBox("关于") ;
break ;
}
return S_OK;
}
HRESULT CgxMenu::GetCommandString(UINT idCmd, UINT uFlags, UINT* pwReserved,
LPSTR pszName, UINT cchMax)
{
if (uFlags & GCS_HELPTEXT)
{
// Windows NT will ask for Unicode strings
switch(idCmd)
{
case 0:
if (uFlags & GCS_VERBA)
lstrcpyn(pszName, "Perform COM registration for this module", cchMax);
else
lstrcpynW((LPWSTR)pszName, L"Perform COM registration for this module", cchMax);
break;
case 1:
if (uFlags & GCS_VERBA)
lstrcpyn(pszName, "Perform COM unregistration for this module", cchMax);
else
lstrcpynW((LPWSTR)pszName, L"Perform COM unregistration for this module", cchMax);
break;
default:
break;
}
return S_OK;
}
return E_FAIL;
}
HRESULT CgxMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
if (lpdobj == NULL)
return E_INVALIDARG;
// The file can be referenced through the STGMEDIUM structure
// that is retrievable through the IDataObject pointer, and
// DragQueryFile can then be used to retrieve the file name.
//数据存储格式
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
//数据存储内存句柄(常用于IDataObject和IAdviseSink接口的数据传输操作)
STGMEDIUM stg = { TYMED_HGLOBAL };
if(FAILED(lpdobj->GetData(&fmt, &stg)))
{
//如果获取数据内存句柄失败则返回E_INVALIDARG,
//返回E_INVALIDARG则Explorer不会再调用我们的Shell扩展接口
return E_INVALIDARG;
}
//获取实际数据内存句柄
HDROP hDrop = (HDROP)GlobalLock(stg.hGlobal);
if(NULL==hDrop)
{
//在COM程序中养成良好的检错习惯是很重要的!!!
return E_INVALIDARG;
}
//获取用户Drag/Drop的文件数目
int nDropCount = ::DragQueryFile((HDROP)stg.hGlobal,
0xFFFFFFFF, NULL, 0);
//本示例程序仅获取第一个Drag/Drop文件完整路径
//以下注释代码为获取所有文件完整路径的实现代码:
char m_pzDropFile[MAX_PATH];
m_FileCount = nDropCount ;
if( m_FileList!=NULL)
delete []m_FileList ;
m_FileList = new TCHAR[m_FileCount * MAX_PATH] ;
memset(m_FileList,0,m_FileCount * MAX_PATH) ;
TCHAR * p = m_FileList ;
FILE * fp = fopen("c:\\Filelist.txt","wb") ;
for(int i = 0; i < nDropCount; ++i)
{
//循环获取每个Drag/Drop文件的完整文件名
memset(m_pzDropFile,0,sizeof(m_pzDropFile)) ;
::DragQueryFile((HDROP)stg.hGlobal, i, m_pzDropFile, MAX_PATH);
strcpy(p,m_pzDropFile) ;
p+=MAX_PATH ;
char Tmp[1024] ;
memset(Tmp , 0,sizeof(Tmp)) ;
strcpy(Tmp , m_pzDropFile) ;
strcat(Tmp , "\r\n") ;
fputs( Tmp,fp) ;
}
fclose(fp) ;
//如果用户Drag/Drop的文件数目不为一个则不予处理
if(1==nDropCount)
{
//pzDropFile为组件类内部的private变量
//它用来保存用户Drag/Drop的文件完整文件名
memset(m_pzDropFile, 0x0, MAX_PATH*sizeof(TCHAR));
::DragQueryFile((HDROP)stg.hGlobal, 0, m_pzDropFile, MAX_PATH);
}
//释放内存句柄
::ReleaseStgMedium(&stg);
return S_OK;
}
CgxMenu::CgxMenu()
{
m_FileList = NULL ;
}
CgxMenu::~CgxMenu()
{
if(NULL == m_FileList)
{
delete []m_FileList ;
m_FileList = NULL ;
}
}
typedef int (*CHICK_IN)(char * ) ;
int CgxMenu::FileCheckIn()
{
HMODULE hModule = ::LoadLibrary( "E:\\vcpro\\vbdll\\TestDLL.dll") ;
if( NULL == hModule )
return 0 ;
CHICK_IN ChickFn = (CHICK_IN) ::GetProcAddress(hModule, "check_in") ;
if( ChickFn== NULL )
return 0 ;
ChickFn(m_FileList) ;
::FreeLibrary(hModule) ;
return 0 ;
}
HRESULT CgxMenu::DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
{
AfxMessageBox("Enter") ;
return S_OK ;
}
HRESULT CgxMenu::DragOver(DWORD grfKeyState,POINTL pt,DWORD* pdwEffect)
{
AfxMessageBox("DragOver") ;
return S_OK;
}
HRESULT CgxMenu::DragLeave()
{
AfxMessageBox("DragLeave") ;
return S_OK ;
}
HRESULT CgxMenu::Drop(IDataObject* pDataObj,DWORD grfKeyState,POINTL pt,DWORD* pdwEffect)
{
AfxMessageBox("Drop") ;
return S_OK ;
}
STDMETHODIMP CgxMenu::BindToObject( LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
{
*ppvOut = NULL;
return S_OK;
}
STDMETHODIMP CgxMenu::BindToStorage( LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
{
*ppvOut = NULL;
return E_NOTIMPL;
}
STDMETHODIMP CgxMenu::EnumObjects( HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{
HRESULT hr;
return S_OK;
}
STDMETHODIMP CgxMenu::GetAttributesOf( UINT uCount, LPCITEMIDLIST aPidls[], LPDWORD pdwAttribs)
{
return S_OK;
}
STDMETHODIMP CgxMenu::GetUIObjectOf( HWND hwndOwner, UINT uCount, LPCITEMIDLIST *pPidl, REFIID riid, LPUINT puReserved, LPVOID *ppvReturn)
{
*ppvReturn = NULL;
return E_NOINTERFACE;
}
STDMETHODIMP CgxMenu::GetDisplayNameOf( LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET lpName)
{
return S_OK;
}
STDMETHODIMP CgxMenu::ParseDisplayName( HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpDisplayName, LPDWORD pdwEaten, LPITEMIDLIST *pPidlNew, LPDWORD pdwAttributes)
{
return S_OK;
}
STDMETHODIMP CgxMenu::SetNameOf( HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dw, LPITEMIDLIST *pPidlOut)
{
return S_OK;
}
STDMETHODIMP CgxMenu::CreateViewObject( HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
{
return S_OK;
}
STDMETHODIMP CgxMenu::CompareIDs( LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
return S_OK ;
}
STDMETHODIMP CgxMenu::Initialize(LPCITEMIDLIST pidl)
{
if(m_pidlNSRoot)
{
m_pPidlMgr->Delete(m_pidlNSRoot);
m_pidlNSRoot = NULL;
}
m_pidlNSRoot = m_pPidlMgr->Copy(pidl);
return S_OK;
}
STDMETHODIMP CgxMenu::GetClassID(LPCLSID )
{
return S_OK ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -