📄 atlsnap.h
字号:
};
#define BEGIN_SNAPINTOOLBARID_MAP(theClass) \
public: \
static CSnapInToolbarInfo* GetToolbarInfo() \
{ \
static CSnapInToolbarInfo m_toolbarInfo[] = \
{
#define SNAPINTOOLBARID_ENTRY(id) \
{ NULL, NULL, NULL, id, 0},
#define END_SNAPINTOOLBARID_MAP() \
{ NULL, NULL, NULL, 0, 0} \
}; \
return m_toolbarInfo; \
}
template <class T, BOOL bIsExtension = FALSE>
class ATL_NO_VTABLE CSnapInItemImpl : public CSnapInItem
{
public:
CSnapInItemImpl()
{
}
virtual ~CSnapInItemImpl()
{
}
public:
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
long arg,
long param,
IComponentData* pComponentData,
IComponent* pComponent,
DATA_OBJECT_TYPES type)
{
ATLASSERT("Override Function in Derived Class");
ATLTRACENOTIMPL(_T("CSnapInItemImpl::Notify"));
}
STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem)
{
ATLTRACENOTIMPL(_T("CSnapInItemImpl::GetScopePaneInfo"));
}
STDMETHOD(GetResultViewType)(LPOLESTR *ppViewType,
long *pViewOptions)
{
ATLTRACE2(atlTraceSnapin, 0, _T("CSnapInItemImpl::GetResultViewType\n"));
*ppViewType = NULL;
*pViewOptions = MMC_VIEW_OPTIONS_NONE;
return S_FALSE;
}
STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem)
{
ATLTRACENOTIMPL(_T("CSnapInItemImpl::GetResultPaneInfo"));
}
STDMETHOD(AddMenuItems)(LPCONTEXTMENUCALLBACK piCallback,
long *pInsertionAllowed,
DATA_OBJECT_TYPES type)
{
ATLTRACE2(atlTraceSnapin, 0, _T("CSnapInItemImpl::AddMenuItems\n"));
T* pT = static_cast<T*>(this);
if (!bIsExtension)
pT->SetMenuInsertionFlags(true, pInsertionAllowed);
UINT menuID = pT->GetMenuID();
if (menuID == 0)
return S_OK;
HMENU hMenu = LoadMenu(_Module.GetResourceInstance(), MAKEINTRESOURCE(menuID));
long insertionID;
if (hMenu)
{
for (int i = 0; 1; i++)
{
HMENU hSubMenu = GetSubMenu(hMenu, i);
if (hSubMenu == NULL)
break;
MENUITEMINFO menuItemInfo;
memset(&menuItemInfo, 0, sizeof(menuItemInfo));
menuItemInfo.cbSize = sizeof(menuItemInfo);
switch (i)
{
case 0:
if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP) )
continue;
insertionID = CCM_INSERTIONPOINTID_PRIMARY_TOP;
break;
case 1:
if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_NEW) )
continue;
if (bIsExtension)
insertionID = CCM_INSERTIONPOINTID_3RDPARTY_NEW;
else
insertionID = CCM_INSERTIONPOINTID_PRIMARY_NEW;
break;
case 2:;
if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_TASK) )
continue;
if (bIsExtension)
insertionID = CCM_INSERTIONPOINTID_3RDPARTY_TASK;
else
insertionID = CCM_INSERTIONPOINTID_PRIMARY_TASK;
break;
case 3:;
if (! (*pInsertionAllowed & CCM_INSERTIONALLOWED_VIEW) )
continue;
insertionID = CCM_INSERTIONPOINTID_PRIMARY_VIEW;
break;
default:
{
insertionID = 0;
continue;
}
break;
}
menuItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
menuItemInfo.fType = MFT_STRING;
TCHAR szMenuText[128];
for (int j = 0; 1; j++)
{
menuItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
menuItemInfo.fType = MFT_STRING;
menuItemInfo.cch = 128;
menuItemInfo.dwTypeData = szMenuText;
TCHAR szStatusBar[256];
if (!GetMenuItemInfo(hSubMenu, j, TRUE, &menuItemInfo))
break;
if (menuItemInfo.fType != MFT_STRING)
continue;
pT->UpdateMenuState(menuItemInfo.wID, szMenuText, &menuItemInfo.fState);
LoadString(_Module.GetResourceInstance(), menuItemInfo.wID, szStatusBar, 256);
OLECHAR wszStatusBar[256];
OLECHAR wszMenuText[128];
USES_CONVERSION;
ocscpy(wszMenuText, T2OLE(szMenuText));
ocscpy(wszStatusBar, T2OLE(szStatusBar));
CONTEXTMENUITEM contextMenuItem;
contextMenuItem.strName = wszMenuText;
contextMenuItem.strStatusBarText = wszStatusBar;
contextMenuItem.lCommandID = menuItemInfo.wID;
contextMenuItem.lInsertionPointID = insertionID;
contextMenuItem.fFlags = menuItemInfo.fState;
contextMenuItem.fSpecialFlags = 0;
HRESULT hr = piCallback->AddItem(&contextMenuItem);
ATLASSERT(SUCCEEDED(hr));
}
}
DestroyMenu(hMenu);
}
if (!bIsExtension)
pT->SetMenuInsertionFlags(true, pInsertionAllowed);
return S_OK;
}
STDMETHOD(Command)(long lCommandID,
CSnapInObjectRootBase* pObj,
DATA_OBJECT_TYPES type)
{
ATLTRACE2(atlTraceSnapin, 0, _T("CSnapInItemImpl::Command\n"));
bool bHandled;
T* pT = static_cast<T*>(this);
return pT->ProcessCommand(lCommandID, bHandled, pObj, type);
}
STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider,
long handle,
IUnknown* pUnk,
DATA_OBJECT_TYPES type)
{
ATLASSERT("Override Function in Derived Class");
ATLTRACENOTIMPL(_T("CSnapInItemImpl::CreatePropertyPages"));
}
STDMETHOD(QueryPagesFor)(DATA_OBJECT_TYPES type)
{
ATLASSERT("Override Function in Derived Class");
ATLTRACENOTIMPL(_T("CSnapInItemImpl::QueryPagesFor"));
}
STDMETHOD(SetControlbar)(IControlbar *pControlbar,
IExtendControlbar* pExtendControlBar,
CSimpleMap<UINT, IUnknown*>* pToolbarMap)
{
ATLTRACE2(atlTraceSnapin, 0, _T("CSnapInItemImpl::SetControlbar\n"));
static bool m_bAddTermFunc = false;
if (!m_bAddTermFunc)
{
m_bAddTermFunc = true;
AtlModuleAddTermFunc(&_Module, CleanUpToolbarInfo, 0);
}
T* pT = static_cast<T*>(this);
CSnapInToolbarInfo* pInfo = pT->GetToolbarInfo();
if (pInfo == NULL)
return S_OK;
for( ; pInfo->m_idToolbar; pInfo++)
{
IToolbar* p = (IToolbar*) pToolbarMap->Lookup(pInfo->m_idToolbar);
if (p != NULL)
continue;
HBITMAP hBitmap = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(pInfo->m_idToolbar));
if (hBitmap == NULL)
return S_OK;
HRSRC hRsrc = ::FindResource(_Module.GetResourceInstance(), MAKEINTRESOURCE(pInfo->m_idToolbar), RT_TOOLBAR);
if (hRsrc == NULL)
return S_OK;
HGLOBAL hGlobal = LoadResource(_Module.GetResourceInstance(), hRsrc);
if (hGlobal == NULL)
return S_OK;
CSnapInToolBarData* pData = (CSnapInToolBarData*)LockResource(hGlobal);
if (pData == NULL)
return S_OK;
ATLASSERT(pData->wVersion == 1);
ATLASSERT(pData->wWidth == 16);
ATLASSERT(pData->wHeight == 16);
pInfo->m_nButtonCount = pData->wItemCount;
if (pInfo->m_pnButtonID == NULL)
pInfo->m_pnButtonID = new UINT[pInfo->m_nButtonCount];
if (pInfo->m_pnButtonID == NULL)
continue;
MMCBUTTON *pButtons = new MMCBUTTON[pData->wItemCount];
if (pButtons == NULL)
{
delete []pInfo->m_pnButtonID;
continue;
}
if (pInfo->m_pStrToolTip == NULL)
{
pInfo->m_pStrToolTip = new OLECHAR* [pData->wItemCount];
if (pInfo->m_pStrToolTip)
memset(pInfo->m_pStrToolTip, 0, sizeof(OLECHAR*) * pData->wItemCount);
}
if (pInfo->m_pStrToolTip == NULL)
{
delete []pInfo->m_pnButtonID;
delete []pButtons;
continue;
}
for (int i = 0, j = 0; i < pData->wItemCount; i++)
{
pInfo->m_pnButtonID[i] = pButtons[i].idCommand = pData->items()[i];
if (pButtons[i].idCommand)
{
pButtons[i].nBitmap = j++;
// get the statusbar string and allow modification of the button state
TCHAR szStatusBar[512];
LoadString(_Module.GetResourceInstance(), pButtons[i].idCommand, szStatusBar, 512);
if (pInfo->m_pStrToolTip[i] == NULL)
pInfo->m_pStrToolTip[i] = new OLECHAR[lstrlen(szStatusBar) + 1];
if (pInfo->m_pStrToolTip[i] == NULL)
continue;
USES_CONVERSION;
ocscpy(pInfo->m_pStrToolTip[i], T2OLE(szStatusBar));
pButtons[i].lpTooltipText = pInfo->m_pStrToolTip[i];
pButtons[i].lpButtonText = OLESTR("");
pButtons[i].fsState = TBSTATE_ENABLED;
pButtons[i].fsType = TBSTYLE_BUTTON;
pT->SetToolbarButtonInfo(pButtons[i].idCommand, &pButtons[i].fsState, &pButtons[i].fsType);
}
else
{
pButtons[i].lpTooltipText = OLESTR("");
pButtons[i].lpButtonText = OLESTR("");
pButtons[i].fsType = TBSTYLE_SEP;
pButtons[i].fsState = 0;
}
}
IToolbar* pToolbar;
HRESULT hr = pControlbar->Create(TOOLBAR, pExtendControlBar, reinterpret_cast<LPUNKNOWN*>(&pToolbar));
if (SUCCEEDED(hr))
{
hr = pToolbar->AddBitmap(pData->wItemCount, hBitmap, pData->wWidth, pData->wHeight, RGB(192, 192, 192));
if (SUCCEEDED(hr))
{
hr = pToolbar->AddButtons(pData->wItemCount, pButtons);
if (SUCCEEDED(hr))
{
pToolbar->AddRef();
pToolbarMap->Add(pInfo->m_idToolbar, (IUnknown*)pToolbar);
}
}
}
pToolbar->Release();
delete [] pButtons;
}
return S_OK;
}
STDMETHOD(ControlbarNotify)(IControlbar *pControlbar,
IExtendControlbar *pExtendControlbar,
CSimpleMap<UINT, IUnknown*>* pToolbarMap,
MMC_NOTIFY_TYPE event,
long arg,
long param,
CSnapInObjectRootBase* pObj,
DATA_OBJECT_TYPES type)
{
ATLTRACE2(atlTraceSnapin, 0, _T("CSnapInItemImpl::ControlbarNotify\n"));
T* pT = static_cast<T*>(this);
SetControlbar(pControlbar, pExtendControlbar, pToolbarMap);
if(event == MMCN_SELECT)
{
if (pControlbar == NULL)
return S_OK;
BOOL bSelect = (BOOL) HIWORD (arg);
if (!bSelect)
return S_OK;
BOOL bScope = (BOOL) LOWORD(arg);
CSnapInToolbarInfo* pInfo = pT->GetToolbarInfo();
if (pInfo == NULL)
return S_OK;
for(; pInfo->m_idToolbar; pInfo++)
{
IToolbar* pToolbar = (IToolbar*)pToolbarMap->Lookup(pInfo->m_idToolbar);
if (pToolbar == NULL)
continue;
pControlbar->Attach(TOOLBAR, pToolbar);
for (UINT i = 0; i < pInfo->m_nButtonCount; i++)
{
if (pInfo->m_pnButtonID[i])
{
pToolbar->SetButtonState(pInfo->m_pnButtonID[i],
ENABLED,
pT->UpdateToolbarButton(pInfo->m_pnButtonID[i],
ENABLED));
pToolbar->SetButtonState(pInfo->m_pnButtonID[i],
CHECKED,
pT->UpdateToolbarButton(pInfo->m_pnButtonID[i],
CHECKED));
pToolbar->SetButtonState(pInfo->m_pnButtonID[i],
HIDDEN,
pT->UpdateToolbarButton(pInfo->m_pnButtonID[i],
HIDDEN));
pToolbar->SetButtonState(pInfo->m_pnButtonID[i],
INDETERMINATE,
pT->UpdateToolbarButton(pInfo->m_pnButtonID[i],
INDETERMINATE));
pToolbar->SetButtonState(pInfo->m_pnButtonID[i],
BUTTONPRESSED,
pT->UpdateToolbarButton(pInfo->m_pnButtonID[i],
BUTTONPRESSED));
}
}
}
return S_OK;
}
else if (event == MMCN_BTN_CLICK)
{
bool bHandled;
return pT->ProcessCommand((UINT) param, bHandled, pObj, type);
}
return E_UNEXPECTED;
}
STDMETHOD(GetScopeData)(SCOPEDATAITEM **pScopeDataItem)
{
if (pScopeDataItem == NULL)
return E_FAIL;
*pScopeDataItem = &m_scopeDataItem;
return S_OK;
}
STDMETHOD(GetResultData)(RESULTDATAITEM **pResultDataItem)
{
if (pResultDataItem == NULL)
return E_FAIL;
*pResultDataItem = &m_resultDataItem;
return S_OK;
}
STDMETHOD(GetDataObject)(IDataObject** pDataObj, DATA_OBJECT_TYPES type)
{
CComObject<CSnapInDataObjectImpl>* pData;
HRESULT hr = CComObject<CSnapInDataObjectImpl>::CreateInstance(&pData);
if (FAILED(hr))
return hr;
T* pT = static_cast<T*> (this);
pData->m_objectData.m_pItem = pT;
pData->m_objectData.m_type = type;
hr = pData->QueryInterface(IID_IDataObject, (void**)(pDataObj));
return hr;
}
void UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags)
{
return;
}
void SetToolbarButtonInfo(UINT id, BYTE *pfsState, BYTE *pfsType)
{
*pfsState = TBSTATE_ENABLED;
*pfsType = TBSTYLE_BUTTON;
}
BOOL UpdateToolbarButton(UINT id, BYTE fsState)
{
if (fsState == ENABLED)
return TRUE;
return FALSE;
}
HRESULT ProcessCommand(UINT nID,
bool& bHandled,
CSnapInObjectRootBase* pObj,
DATA_OBJECT_TYPES type)
{
ATLTRACE2(atlTraceSnapin, 0, _T("No handler for item with ID %d\n"), nID);
return S_OK;
}
STDMETHOD (FillData)(CLIPFORMAT cf, LPSTREAM pStream)
{
HRESULT hr = DV_E_CLIPFORMAT;
ULONG uWritten;
T* pT = static_cast<T*> (this);
if (cf == m_CCF_NODETYPE)
{
hr = pStream->Write(pT->GetNodeType(), sizeof(GUID), &uWritten);
return hr;
}
if (cf == m_CCF_SZNODETYPE)
{
hr = pStream->Write(pT->GetSZNodeType(), (ocslen((OLECHAR*)pT->GetSZNodeType()) + 1 )* sizeof(OLECHAR), &uWritten);
return hr;
}
if (cf == m_CCF_DISPLAY_NAME)
{
hr = pStream->Write(pT->GetDisplayName(), (ocslen((OLECHAR*)pT->GetDisplayName()) + 1) * sizeof(OLECHAR), &uWritten);
return hr;
}
if (cf == m_CCF_SNAPIN_CLASSID)
{
hr = pStream->Write(pT->GetSnapInCLSID(), sizeof(GUID), &uWritten);
return hr;
}
return hr;
}
static CSnapInToolbarInfo* GetToolbarInfo()
{
return NULL;
}
static void _stdcall CleanUpToolbarInfo(DWORD dw)
{
for (CSnapInToolbarInfo* pInfo = T::GetToolbarInfo(); pInfo->m_idToolbar != 0; pInfo++)
{
pInfo->CleanUp(dw);
}
}
static const UINT GetMenuID()
{
return 0;
}
void SetMenuInsertionFlags(bool bBeforeInsertion, long* pInsertionAllowed)
{
}
void* GetNodeType()
{
return (void*)T::m_NODETYPE;
}
void* GetSZNodeType()
{
return (void*)T::m_SZNODETYPE;
}
void* GetDisplayName()
{
return (void*)T::m_SZDISPLAY_NAME;
}
void* GetSnapInCLSID()
{
return (void*)T::m_SNAPIN_CLASSID;
}
CComBSTR m_bstrDisplayName;
SCOPEDATAITEM m_scopeDataItem;
RESULTDATAITEM m_resultDataItem;
};
_declspec( selectany ) CLIPFORMAT CSnapInItem::m_CCF_NODETYPE = 0;
_declspec( selectany ) CLIPFORMAT CSnapInItem::m_CCF_SZNODETYPE = 0;
_declspec( selectany ) CLIPFORMAT CSnapInItem::m_CCF_DISPLAY_NAME = 0;
_declspec( selectany ) CLIPFORMAT CSnapInItem::m_CCF_SNAPIN_CLASSID = 0;
_declspec( selectany ) CLIPFORMAT CSnapInItem::m_CCF_SNAPIN_GETOBJECTDATA = 0;
_declspec( selectany ) CLIPFORMAT CSnapInItem::m_CCF_MMC_MULTISELECT_DATAOBJECT = 0;
#endif //__ATL_SNAPIN_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -