📄 atlsnap.h
字号:
{
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
hr = pT->m_pComponentData->GetDataClass(lpDataObject, &pItem, &type);
ATLASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr))
hr = pItem->Notify(event, arg, param, pT, NULL, type);
}
return hr;
}
STDMETHOD(Destroy)(void)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentDataImpl::Destroy\n"));
T* pT = static_cast<T*>(this);
if (pT->m_spControlbar != NULL)
{
int n = pT->m_toolbarMap.GetSize();
for (int i = 0; i < n; i++)
{
IToolbar* pToolbar = (IToolbar*)pT->m_toolbarMap.GetValueAt(i);
if (pToolbar != NULL)
{
pT->m_spControlbar->Detach(pToolbar);
pToolbar->Release();
}
}
}
pT->m_toolbarMap.RemoveAll();
m_spConsole.Release();
return S_OK;
}
STDMETHOD(QueryDataObject)(long cookie,
DATA_OBJECT_TYPES type,
LPDATAOBJECT *ppDataObject)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentDataImpl::QueryDataObject\n"));
HRESULT hr = E_POINTER;
ATLASSERT(ppDataObject != NULL);
if (ppDataObject == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentData::QueryDataObject called with ppDataObject == NULL\n"));
else
{
*ppDataObject = NULL;
CSnapInItem* pItem = (CSnapInItem*) cookie;
if (cookie == NULL)
pItem = m_pNode;
hr = pItem->GetDataObject(ppDataObject, type);
}
return hr;
}
STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM *pScopeDataItem)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentDataImpl::GetDisplayInfo\n"));
HRESULT hr = E_POINTER;
ATLASSERT(pScopeDataItem != NULL);
if (pScopeDataItem == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentData::GetDisplayInfo called with pScopeDataItem == NULL\n"));
else
{
CSnapInItem* pItem= (CSnapInItem*) pScopeDataItem->lParam;
if (pItem == NULL)
pItem = m_pNode;
hr = E_UNEXPECTED;
if (pItem != NULL)
hr = pItem->GetScopePaneInfo(pScopeDataItem);
}
return hr;
}
STDMETHOD(CompareObjects)(LPDATAOBJECT lpDataObjectA,
LPDATAOBJECT lpDataObjectB)
{
ATLTRACENOTIMPL(_T("IComponentDataImpl::CompareObjects\n"));
}
CComPtr<IConsole> m_spConsole;
CSnapInItem* m_pNode;
};
template <class T>
class ATL_NO_VTABLE IComponentImpl : public IComponent
{
public:
STDMETHOD(Initialize)(LPCONSOLE lpConsole)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentImpl::Initialize\n"));
HRESULT hr = E_POINTER;
ATLASSERT(lpConsole != NULL);
if (lpConsole == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("lpConsole is NULL\n"));
else
{
m_spConsole = lpConsole;
CComPtr<IHeaderCtrl> spHeaderCtrl;
hr = m_spConsole.QueryInterface(&spHeaderCtrl);
if (FAILED(hr))
ATLTRACE2(atlTraceSnapin, 0, _T("QI for IHeaderCtrl failed\n"));
else
{
hr = m_spConsole->SetHeader(spHeaderCtrl);
if (FAILED(hr))
ATLTRACE2(atlTraceSnapin, 0, _T("IConsole::SetHeader failed (HRESULT = %x)\n"), hr);
}
}
return hr;
}
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject,
MMC_NOTIFY_TYPE event,
long arg,
long param)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentImpl::Notify\n"));
ATLASSERT(lpDataObject != NULL && _T("Override Notify in derived class handle notifications for which lpDataObject == NULL"));
HRESULT hr = E_POINTER;
if (lpDataObject == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IComponent::Notify called with lpDataObject==NULL \n"));
else
{
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
// Make sure that the object is derived from CSnapInObjectRoot
hr = pT->m_pComponentData->GetDataClass(lpDataObject, &pItem, &type);
if (SUCCEEDED(hr))
hr = pItem->Notify(event, arg, param, NULL, pT, type);
}
return hr;
}
STDMETHOD(Destroy)(long cookie)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentImpl::Destroy\n"));
T* pT = static_cast<T*>(this);
if (pT->m_spControlbar != NULL)
{
int n = pT->m_toolbarMap.GetSize();
for (int i = 0; i < n; i++)
{
IToolbar* pToolbar = (IToolbar*)pT->m_toolbarMap.GetValueAt(i);
if (pToolbar != NULL)
{
pT->m_spControlbar->Detach(pToolbar);
pToolbar->Release();
}
}
}
pT->m_toolbarMap.RemoveAll();
m_spConsole->SetHeader(NULL);
m_spConsole.Release();
return S_OK;
}
STDMETHOD(QueryDataObject)(long cookie,
DATA_OBJECT_TYPES type,
LPDATAOBJECT *ppDataObject)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentImpl::QueryDataObject\n"));
ATLASSERT(ppDataObject != NULL);
if (ppDataObject == NULL)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponent::QueryDataObject called with ppDataObject==NULL \n"));
return E_POINTER;
}
if (cookie == NULL)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponent::QueryDataObject called with cookie==NULL \n"));
return E_UNEXPECTED;
}
*ppDataObject = NULL;
if (cookie == MMC_MULTI_SELECT_COOKIE)
{
ATLTRACE2(atlTraceSnapin, 0, _T("Override QueryDataObject to handle multiselect\n"));
return E_UNEXPECTED;
}
CSnapInItem* pItem = (CSnapInItem*) cookie;
return pItem->GetDataObject(ppDataObject, type);
}
STDMETHOD(GetResultViewType)(long cookie,
LPOLESTR *ppViewType,
long *pViewOptions)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentImpl::GetResultViewType\n"));
HRESULT hr = E_FAIL;
if (cookie == NULL)
{
T* pT = static_cast<T*> (this);
ATLASSERT( pT->m_pComponentData != NULL );
ATLASSERT( pT->m_pComponentData->m_pNode != NULL );
hr = pT->m_pComponentData->m_pNode->GetResultViewType(ppViewType, pViewOptions);
}
else
{
CSnapInItem* pItem = (CSnapInItem*)cookie;
hr = pItem->GetResultViewType(ppViewType, pViewOptions);
}
return hr;
}
STDMETHOD(GetDisplayInfo)(RESULTDATAITEM *pResultDataItem)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponentImpl::GetDisplayInfo\n"));
ATLASSERT(pResultDataItem != NULL);
if (pResultDataItem == NULL)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IComponent::GetDisplayInfo called with pResultDataItem==NULL\n"));
return E_POINTER;
}
CSnapInItem* pItem = (CSnapInItem*) pResultDataItem->lParam;
if (pItem == NULL)
{
ATLTRACE2(atlTraceSnapin, 0, _T("Invalid Item\n"));
return E_UNEXPECTED;
}
return pItem->GetResultPaneInfo(pResultDataItem);
}
STDMETHOD(CompareObjects)( LPDATAOBJECT lpDataObjectA,
LPDATAOBJECT lpDataObjectB)
{
ATLTRACENOTIMPL(_T("IComponentImpl::CompareObjects\n"));
}
CComPtr<IConsole> m_spConsole;
};
template <class T, class D>
class ATL_NO_VTABLE IResultDataCompareImpl : public IResultDataCompare
{
public:
STDMETHOD(Compare)(long lUserParam,
long cookieA,
long cookieB,
int *pnResult)
{
ATLTRACENOTIMPL(_T("IResultDataCompareImpl::Compare"));
}
};
template <class T>
class ATL_NO_VTABLE IExtendContextMenuImpl : public IExtendContextMenu
{
public:
STDMETHOD(AddMenuItems)(LPDATAOBJECT pDataObject,
LPCONTEXTMENUCALLBACK piCallback,
long *pInsertionAllowed)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenuImpl::AddMenuItems\n"));
HRESULT hr = E_POINTER;
ATLASSERT(pDataObject != NULL);
if (pDataObject == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenu::AddMenuItems called with pDataObject==NULL\n"));
else
{
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
hr = pT->m_pComponentData->GetDataClass(pDataObject, &pItem, &type);
if (SUCCEEDED(hr))
hr = pItem->AddMenuItems(piCallback, pInsertionAllowed, type);
}
return hr;
}
STDMETHOD(Command)(long lCommandID,
LPDATAOBJECT pDataObject)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenuImpl::Command\n"));
HRESULT hr = E_POINTER;
ATLASSERT(pDataObject != NULL);
if (pDataObject == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenu::Command called with pDataObject==NULL\n"));
else
{
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
hr = pT->m_pComponentData->GetDataClass(pDataObject, &pItem, &type);
if (SUCCEEDED(hr))
hr = pItem->Command(lCommandID, (CSnapInObjectRootBase*)pT, type);
}
return hr;
}
};
template<class T>
class ATL_NO_VTABLE IExtendPropertySheetImpl : public IExtendPropertySheet
{
public:
STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider,
long handle,
LPDATAOBJECT pDataObject)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendPropertySheetImpl::CreatePropertyPages\n"));
HRESULT hr = E_POINTER;
ATLASSERT(pDataObject != NULL);
if (pDataObject == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendPropertySheetImpl::CreatePropertyPages called with pDataObject==NULL\n"));
else
{
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
hr = pT->m_pComponentData->GetDataClass(pDataObject, &pItem, &type);
if (SUCCEEDED(hr))
hr = pItem->CreatePropertyPages(lpProvider, handle, this, type);
}
return hr;
}
STDMETHOD(QueryPagesFor)(LPDATAOBJECT pDataObject)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendPropertySheetImpl::QueryPagesFor\n"));
HRESULT hr = E_POINTER;
ATLASSERT(pDataObject != NULL);
if (pDataObject == NULL)
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendPropertySheetImpl::QueryPagesFor called with pDataObject==NULL\n"));
else
{
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
hr = pT->m_pComponentData->GetDataClass(pDataObject, &pItem, &type);
if (SUCCEEDED(hr))
hr = pItem->QueryPagesFor(type);
}
return hr;
}
};
template <class T>
class ATL_NO_VTABLE IExtendControlbarImpl : public IExtendControlbar
{
public:
STDMETHOD(SetControlbar)(LPCONTROLBAR pControlbar)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendControlbarImpl::SetControlbar\n"));
T* pT = static_cast<T*>(this);
if (pT->m_spControlbar != NULL)
{
int n = pT->m_toolbarMap.GetSize();
for (int i = 0; i < n; i++)
{
IToolbar* pToolbar = (IToolbar*)pT->m_toolbarMap.GetValueAt(i);
if (pToolbar != NULL)
{
pT->m_spControlbar->Detach(pToolbar);
pToolbar->Release();
}
}
}
pT->m_toolbarMap.RemoveAll();
pT->m_spControlbar = pControlbar;
return S_OK;
}
STDMETHOD(ControlbarNotify)(MMC_NOTIFY_TYPE event,
long arg,
long param)
{
ATLTRACE2(atlTraceSnapin, 0, _T("IExtendControlbarImpl::ControlbarNotify\n"));
CSnapInItem* pItem = NULL;
DATA_OBJECT_TYPES type;
HRESULT hr = S_OK;
T* pT = static_cast<T*>(this);
if (event == MMCN_BTN_CLICK)
hr = pT->m_pComponentData->GetDataClass((IDataObject*) arg, &pItem, &type);
else if (event == MMCN_SELECT)
{
hr = pT->m_pComponentData->GetDataClass((IDataObject*) param, &pItem, &type);
BOOL bSelect = (BOOL) HIWORD (arg);
BOOL bScope = (BOOL) LOWORD(arg);
if (bSelect)
{
int n = pT->m_toolbarMap.GetSize();
for (int i = 0; i < n; i++)
{
IToolbar* pToolbar = (IToolbar*)pT->m_toolbarMap.GetValueAt(i);
if (pToolbar != NULL)
pT->m_spControlbar->Detach(pToolbar);
}
}
}
if (SUCCEEDED(hr))
hr = pItem->ControlbarNotify(pT->m_spControlbar, this, &(pT->m_toolbarMap), event, arg, param, (CSnapInObjectRootBase*) pT, type);
return hr;
}
};
#define SNAPINMENUID(id) \
public: \
static const UINT GetMenuID() \
{ \
static const UINT IDMENU = id; \
return id; \
}
#define EXT_SNAPINMENUID(id) \
public: \
static const UINT GetMenuID() \
{ \
static const UINT IDMENU = id; \
return id; \
}
#define BEGIN_SNAPINCOMMAND_MAP(theClass, bIsExtension) \
HRESULT ProcessCommand(UINT nID, \
bool& bHandled, \
CSnapInObjectRootBase* pObj, \
DATA_OBJECT_TYPES type) \
{ \
bHandled = true; \
HRESULT hr = S_OK;
#define SNAPINCOMMAND_ENTRY(id, func) \
if (id == nID) \
{ \
hr = func(bHandled, pObj); \
if (bHandled) \
return hr; \
}
#define SNAPINCOMMAND_RANGE_ENTRY(id1, id2, func) \
if (id1 >= nID && nID <= id2) \
{ \
hr = func(nID, bHandled, pObj); \
if (bHandled) \
return hr; \
}
#define CHAIN_SNAPINCOMMAND_MAP(theChainClass) \
{ \
hr = theChainClass::ProcessCommand(nID, bHandled, pObj, type); \
if (bHandled) \
return hr; \
}
#define END_SNAPINCOMMAND_MAP() \
return hr; \
}
struct CSnapInToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
//WORD aItems[wItemCount]
WORD* items()
{ return (WORD*)(this+1); }
};
#define RT_TOOLBAR MAKEINTRESOURCE(241)
class CSnapInToolbarInfo
{
public:
void __stdcall CleanUp(DWORD dw)
{
if (m_pStrToolTip)
{
for (UINT i = 0; i < m_nButtonCount; i++)
{
delete m_pStrToolTip[i];
m_pStrToolTip[i] = NULL;
}
delete [] m_pStrToolTip;
m_pStrToolTip = NULL;
}
if (m_pStrButtonText)
{
for (UINT i = 0; i < m_nButtonCount; i++)
{
delete m_pStrButtonText[i];
m_pStrButtonText[i] = NULL;
}
delete [] m_pStrButtonText;
m_pStrButtonText = NULL;
}
if (m_pnButtonID)
{
delete m_pnButtonID;
m_pnButtonID = NULL;
}
m_nButtonCount = 0;
}
OLECHAR** m_pStrToolTip;
OLECHAR** m_pStrButtonText;
UINT* m_pnButtonID;
UINT m_idToolbar;
UINT m_nButtonCount;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -