📄 occcont.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// special cases for CWnd functions
void COleControlContainer::CheckDlgButton(int nIDButton, UINT nCheck)
{
CWnd* pWnd = GetDlgItem(nIDButton);
if (pWnd == NULL)
return;
if (pWnd->m_pCtrlSite == NULL)
{
pWnd->SendMessage(BM_SETCHECK, nCheck, 0);
return;
}
pWnd->m_pCtrlSite->SafeSetProperty(DISPID_VALUE, VT_I4, (DWORD)nCheck);
}
void COleControlContainer::CheckRadioButton(int nIDFirstButton, int nIDLastButton,
int nIDCheckButton)
{
ASSERT(nIDFirstButton <= nIDCheckButton);
ASSERT(nIDCheckButton <= nIDLastButton);
// the following code is for OLE control containers only
for (int nID = nIDFirstButton; nID <= nIDLastButton; nID++)
CheckDlgButton(nID, (nID == nIDCheckButton));
}
CWnd* COleControlContainer::GetDlgItem(int nID) const
{
HWND hWnd;
GetDlgItem(nID, &hWnd);
return CWnd::FromHandle(hWnd);
}
void COleControlContainer::GetDlgItem(int nID, HWND* phWnd) const
{
// first, look for a non-OLE control
HWND hWnd = ::GetDlgItem(m_pWnd->GetSafeHwnd(), nID);
if (hWnd == NULL)
{
// now, look for an OLE control
COleControlSite* pSite = FindItem(nID);
if (pSite != NULL)
hWnd = pSite->m_hWnd;
}
*phWnd = hWnd;
}
UINT COleControlContainer::GetDlgItemInt(int nID, BOOL* lpTrans, BOOL bSigned) const
{
TCHAR szText[256];
if (GetDlgItemText(nID, szText, 256) == 0)
{
if (lpTrans != NULL)
*lpTrans = FALSE;
return 0;
}
// Quick check for valid number
LPTSTR pch = szText;
while (_istspace(*pch))
pch = CharNext(pch); // skip whitespace
if ((*pch) == '+' || (*pch) == '-')
pch = CharNext(pch); // skip sign
BOOL bTrans = _istdigit(*pch); // did we find a digit?
if (lpTrans != NULL)
*lpTrans = bTrans;
if (!bTrans)
return 0;
if (bSigned)
return _tcstol(szText, NULL, 10);
else
return _tcstoul(szText, NULL, 10);
}
int COleControlContainer::GetDlgItemText(int nID, LPTSTR lpStr, int nMaxCount) const
{
CWnd* pWnd = GetDlgItem(nID);
if (pWnd == NULL)
return 0;
return pWnd->GetWindowText(lpStr, nMaxCount);
}
LRESULT COleControlContainer::SendDlgItemMessage(int nID, UINT message, WPARAM wParam,
LPARAM lParam)
{
CWnd* pWnd = GetDlgItem(nID);
if (pWnd == NULL)
return 0;
return pWnd->SendMessage(message, wParam, lParam);
}
void COleControlContainer::SetDlgItemInt(int nID, UINT nValue, BOOL bSigned)
{
TCHAR szText[34];
if (bSigned)
_ltot((long)nValue, szText, 10);
else
_ultot((unsigned long)nValue, szText, 10);
SetDlgItemText(nID, szText);
}
void COleControlContainer::SetDlgItemText(int nID, LPCTSTR lpszString)
{
CWnd* pWnd = GetDlgItem(nID);
if (pWnd == NULL)
return;
pWnd->SetWindowText(lpszString);
}
UINT COleControlContainer::IsDlgButtonChecked(int nIDButton) const
{
CWnd* pWnd = GetDlgItem(nIDButton);
if (pWnd == NULL)
return 0;
if (pWnd->m_pCtrlSite == NULL)
return pWnd->SendMessage(BM_GETCHECK, 0, 0);
DWORD dwValue;
TRY
{
pWnd->GetProperty(DISPID_VALUE, VT_I4, &dwValue);
}
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
dwValue = 0;
}
END_CATCH_ALL
if (dwValue == 0x0000ffff) // VARIANT_BOOL TRUE
dwValue = 1;
return dwValue;
}
/////////////////////////////////////////////////////////////////////////////
// COleControlContainer::XOleIPFrame
STDMETHODIMP COleControlContainer::XOleIPFrame::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleIPFrame)
return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP_(ULONG) COleControlContainer::XOleIPFrame::AddRef()
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleIPFrame)
return (ULONG)pThis->InternalAddRef();
}
STDMETHODIMP_(ULONG) COleControlContainer::XOleIPFrame::Release()
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleIPFrame)
return (ULONG)pThis->InternalRelease();
}
STDMETHODIMP COleControlContainer::XOleIPFrame::GetWindow(HWND* phWnd)
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleIPFrame)
*phWnd = pThis->m_pWnd->m_hWnd;
return S_OK;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::ContextSensitiveHelp(BOOL)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::GetBorder(LPRECT)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::RequestBorderSpace(
LPCBORDERWIDTHS)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::SetBorderSpace(
LPCBORDERWIDTHS)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::SetActiveObject(
LPOLEINPLACEACTIVEOBJECT pActiveObject, LPCOLESTR)
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleIPFrame)
if (pThis->m_pSiteUIActive != NULL)
{
LPOLEINPLACEACTIVEOBJECT pOldActiveObject = pThis->m_pSiteUIActive->m_pActiveObject;
if (pActiveObject != NULL)
pActiveObject->AddRef();
pThis->m_pSiteUIActive->m_pActiveObject = pActiveObject;
if (pOldActiveObject != NULL)
pOldActiveObject->Release();
}
return S_OK;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::InsertMenus(HMENU,
LPOLEMENUGROUPWIDTHS)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::SetMenu(HMENU, HOLEMENU, HWND)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::RemoveMenus(HMENU)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::SetStatusText(LPCOLESTR)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::EnableModeless(BOOL)
{
// As long as we don't create any modeless dialogs, we can just return S_OK.
return S_OK;
}
STDMETHODIMP COleControlContainer::XOleIPFrame::TranslateAccelerator(LPMSG,
WORD)
{
return E_NOTIMPL;
}
/////////////////////////////////////////////////////////////////////////////
// CEnumUnknown - enumerator for IUnknown pointers
class CEnumUnknown : public CEnumArray
{
public:
CEnumUnknown(const void* pvEnum, UINT nSize) :
CEnumArray(sizeof(LPUNKNOWN), pvEnum, nSize, TRUE) {}
~CEnumUnknown();
protected:
virtual BOOL OnNext(void* pv);
DECLARE_INTERFACE_MAP()
};
BEGIN_INTERFACE_MAP(CEnumUnknown, CEnumArray)
INTERFACE_PART(CEnumUnknown, IID_IEnumUnknown, EnumVOID)
END_INTERFACE_MAP()
CEnumUnknown::~CEnumUnknown()
{
if (m_pClonedFrom == NULL)
{
LPUNKNOWN* ppUnk = (LPUNKNOWN*)(void*)m_pvEnum;
for (UINT i = 0; i < m_nSize; i++)
{
ASSERT(ppUnk[i] != NULL);
ppUnk[i]->Release();
}
}
// destructor will free the actual array (if it was not a clone)
}
BOOL CEnumUnknown::OnNext(void* pv)
{
if (!CEnumArray::OnNext(pv))
return FALSE;
// AddRef the pointer (the caller has responsibility to Release it)
ASSERT(*(LPUNKNOWN*)pv != NULL);
(*(LPUNKNOWN*)pv)->AddRef();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// COleControlContainer::XOleContainer
STDMETHODIMP COleControlContainer::XOleContainer::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleContainer)
return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP_(ULONG) COleControlContainer::XOleContainer::Release()
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleContainer)
return (ULONG)pThis->InternalRelease();
}
STDMETHODIMP_(ULONG) COleControlContainer::XOleContainer::AddRef()
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleContainer)
return (ULONG)pThis->InternalAddRef();
}
STDMETHODIMP COleControlContainer::XOleContainer::ParseDisplayName(LPBINDCTX,
LPOLESTR, ULONG*, LPMONIKER*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlContainer::XOleContainer::EnumObjects(DWORD dwFlags,
LPENUMUNKNOWN* ppEnumUnknown)
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleContainer)
*ppEnumUnknown = NULL;
HRESULT hr = S_OK;
CEnumUnknown* pEnum = NULL;
UINT cObjects = 0;
LPUNKNOWN* ppUnk = NULL;
TRY
{
if (dwFlags & OLECONTF_EMBEDDINGS)
{
cObjects = pThis->m_siteMap.GetCount();
ppUnk = new LPUNKNOWN[cObjects];
UINT i = 0;
POSITION pos = pThis->m_siteMap.GetStartPosition();
HWND hWnd;
COleControlSite* pSite;
while (pos != NULL)
{
pThis->m_siteMap.GetNextAssoc(pos, (void*&)hWnd, (void*&)pSite);
ASSERT(pSite->m_pObject != NULL);
pSite->m_pObject->AddRef();
ppUnk[i++] = pSite->m_pObject;
}
ASSERT(cObjects == i);
}
pEnum = new CEnumUnknown(ppUnk, cObjects);
}
CATCH_ALL(e)
{
// Note: DELETE_EXCEPTION(e) not necessary
hr = E_OUTOFMEMORY;
}
END_CATCH_ALL
// clean up in case of failure
if (SUCCEEDED(hr))
{
ASSERT(pEnum != NULL);
*ppEnumUnknown = (IEnumUnknown*)&pEnum->m_xEnumVOID;
}
else
{
ASSERT(pEnum == NULL);
ASSERT(*ppEnumUnknown == NULL);
if (ppUnk != NULL)
{
for (UINT i = 0; i < cObjects; i++)
{
ASSERT(ppUnk[i] != NULL);
ppUnk[i]->Release();
}
}
}
return hr;
}
STDMETHODIMP COleControlContainer::XOleContainer::LockContainer(BOOL)
{
return E_NOTIMPL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -