📄 occsite.cpp
字号:
va_list argList; // really only one arg, but...
va_start(argList, vtProp);
BOOL bSuccess;
TRY
{
SetPropertyV(dwDispID, vtProp, argList);
bSuccess = TRUE;
}
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
bSuccess = FALSE;
}
END_CATCH_ALL
va_end(argList);
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////
// special cases for CWnd functions
DWORD COleControlSite::GetStyle() const
{
DWORD dwStyle = m_dwStyle |
(::GetWindowLong(m_hWnd, GWL_STYLE) & WS_VISIBLE);
TRY
{
BOOL bEnabled = TRUE;
GetProperty(DISPID_ENABLED, VT_BOOL, &bEnabled);
if (!bEnabled)
dwStyle |= WS_DISABLED;
}
END_TRY
TRY
{
short sBorderStyle = 0;
GetProperty(DISPID_BORDERSTYLE, VT_I2, &sBorderStyle);
if (sBorderStyle == 1)
dwStyle |= WS_BORDER;
}
END_TRY
return dwStyle;
}
DWORD COleControlSite::GetExStyle() const
{
DWORD dwExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);
TRY
{
short sAppearance = 0;
GetProperty(DISPID_APPEARANCE, VT_I2, &sAppearance);
if (sAppearance == 1)
dwExStyle |= WS_EX_CLIENTEDGE;
}
END_TRY
return dwExStyle;
}
BOOL COleControlSite::ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags)
{
m_dwStyle = ((m_dwStyle & ~dwRemove) | dwAdd) & m_dwStyleMask;
// Enabled property
if ((dwRemove & WS_DISABLED) || (dwAdd & WS_DISABLED))
{
if (SafeSetProperty(DISPID_ENABLED, VT_BOOL, (~dwAdd & WS_DISABLED)))
{
dwRemove &= ~WS_DISABLED;
dwAdd &= ~WS_DISABLED;
}
}
// BorderStyle property
if ((dwRemove & WS_BORDER) || (dwAdd & WS_BORDER))
{
if (SafeSetProperty(DISPID_BORDERSTYLE, VT_I2, (dwAdd & WS_BORDER)))
{
dwRemove &= ~WS_BORDER;
dwAdd &= ~WS_BORDER;
}
}
return CWnd::ModifyStyle(m_hWnd, dwRemove, dwAdd, nFlags);
}
BOOL COleControlSite::ModifyStyleEx(DWORD dwRemove, DWORD dwAdd, UINT nFlags)
{
// BorderStyle property
if ((dwRemove & WS_EX_CLIENTEDGE) || (dwAdd & WS_EX_CLIENTEDGE))
{
if (SafeSetProperty(DISPID_APPEARANCE, VT_I2, (dwAdd & WS_EX_CLIENTEDGE)))
{
dwRemove &= ~WS_EX_CLIENTEDGE;
dwAdd &= ~WS_EX_CLIENTEDGE;
}
}
return CWnd::ModifyStyleEx(m_hWnd, dwRemove, dwAdd, nFlags);
}
void COleControlSite::SetWindowText(LPCTSTR lpszString)
{
ASSERT(::IsWindow(m_hWnd));
if (!SafeSetProperty(DISPID_CAPTION, VT_BSTR, lpszString))
SafeSetProperty(DISPID_TEXT, VT_BSTR, lpszString);
}
void COleControlSite::GetWindowText(CString& str) const
{
ASSERT(::IsWindow(m_hWnd));
TRY
{
GetProperty(DISPID_CAPTION, VT_BSTR, &str);
}
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
TRY
{
GetProperty(DISPID_TEXT, VT_BSTR, &str);
}
END_TRY
}
END_CATCH_ALL
}
int COleControlSite::GetWindowText(LPTSTR lpszString, int nMaxCount) const
{
ASSERT(nMaxCount > 0);
CString str;
GetWindowText(str);
lstrcpyn(lpszString, str, nMaxCount);
return lstrlen(lpszString);
}
int COleControlSite::GetWindowTextLength() const
{
CString str;
GetWindowText(str);
return str.GetLength();
}
int COleControlSite::GetDlgCtrlID() const
{
return (int)m_nID;
}
int COleControlSite::SetDlgCtrlID(int nID)
{
int nPrevID = (int)m_nID;
m_nID = (UINT)nID;
return nPrevID;
}
void COleControlSite::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL)
{
ASSERT(m_pInPlaceObject != NULL);
ASSERT(m_pObject != NULL);
CRect rectOld(m_rect);
m_rect.SetRect(x, y, x + nWidth, y + nHeight);
if (SetExtent())
{
m_rect.SetRect(x, y, x + m_rect.Width(), y + m_rect.Height());
m_pInPlaceObject->SetObjectRects(m_rect, m_rect);
}
else
{
m_rect = rectOld;
}
}
BOOL COleControlSite::SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx,
int cy, UINT nFlags)
{
if (nFlags & SWP_HIDEWINDOW)
ShowWindow(SW_HIDE);
if ((nFlags & (SWP_NOMOVE|SWP_NOSIZE)) != (SWP_NOMOVE|SWP_NOSIZE))
{
int xNew;
int yNew;
if (nFlags & SWP_NOMOVE)
{
xNew = m_rect.left;
yNew = m_rect.top;
}
else
{
xNew = x;
yNew = y;
}
int cxNew;
int cyNew;
if (nFlags & SWP_NOSIZE)
{
cxNew = m_rect.Width();
cyNew = m_rect.Height();
}
else
{
cxNew = cx;
cyNew = cy;
}
MoveWindow(xNew, yNew, cxNew, cyNew, !(nFlags & SWP_NOREDRAW));
}
if (nFlags & SWP_SHOWWINDOW)
ShowWindow(SW_SHOW);
// we've handled hide, move, size, and show; let Windows do the rest
nFlags &= ~(SWP_HIDEWINDOW|SWP_SHOWWINDOW);
nFlags |= (SWP_NOMOVE|SWP_NOSIZE);
return ::SetWindowPos(m_hWnd, pWndInsertAfter->GetSafeHwnd(),
x, y, cx, cy, nFlags);
}
BOOL COleControlSite::ShowWindow(int nCmdShow)
{
BOOL bReturn = ::IsWindowVisible(m_hWnd);
int iVerb = 0;
switch (nCmdShow)
{
case SW_SHOW:
case SW_SHOWNORMAL:
case SW_SHOWNOACTIVATE:
iVerb = OLEIVERB_SHOW;
break;
case SW_HIDE:
iVerb = OLEIVERB_HIDE;
break;
}
if (iVerb != 0)
DoVerb(iVerb);
return bReturn;
}
BOOL COleControlSite::IsWindowEnabled() const
{
BOOL bEnabled = TRUE;
TRY
GetProperty(DISPID_ENABLED, VT_BOOL, &bEnabled);
END_TRY
return bEnabled;
}
BOOL COleControlSite::EnableWindow(BOOL bEnable)
{
BOOL bResult;
TRY
{
GetProperty(DISPID_ENABLED, VT_BOOL, &bResult);
SetProperty(DISPID_ENABLED, VT_BOOL, bEnable);
}
CATCH_ALL(e)
{
DELETE_EXCEPTION(e);
bResult = TRUE;
}
END_CATCH_ALL
return !bResult; // return TRUE if previously disabled
}
CWnd* COleControlSite::SetFocus()
{
if (m_dwMiscStatus & OLEMISC_NOUIACTIVATE)
return CWnd::FromHandle(::SetFocus(m_hWnd));
CWnd* pWndPrev = CWnd::GetFocus();
DoVerb(OLEIVERB_UIACTIVATE);
return pWndPrev;
}
void COleControlSite::EnableDSC()
{
if (m_pDataSourceControl == NULL)
{
m_pDataSourceControl = new CDataSourceControl(this);
m_pDataSourceControl->Initialize();
}
}
void COleControlSite::BindDefaultProperty(DISPID dwDispID, VARTYPE vtProp, LPCTSTR szFieldName, CWnd* pDSCWnd)
{
// Remove any previous binding
if (m_pDSCSite != NULL)
{
m_pDSCSite->m_pDataSourceControl->BindProp(this, FALSE);
m_pDSCSite->m_pDataSourceControl->BindColumns();
m_pDSCSite = NULL;
}
if (pDSCWnd != NULL)
{
ASSERT(pDSCWnd->m_pCtrlSite); // must be an OLE control
pDSCWnd->m_pCtrlSite->EnableDSC();
m_pDSCSite = pDSCWnd->m_pCtrlSite;
m_defdispid = dwDispID;
m_dwType = vtProp;
m_strDataField = szFieldName;
m_pDSCSite->m_pDataSourceControl->BindProp(this, TRUE);
if (m_pDSCSite != NULL)
m_pDSCSite->m_pDataSourceControl->BindColumns();
}
}
void COleControlSite::BindProperty(DISPID dwDispId, CWnd* pWndDSC)
{
ASSERT(pWndDSC == NULL || pWndDSC->m_pCtrlSite);
if (pWndDSC != NULL && dwDispId != DISPID_UNKNOWN)
{
m_pBindings = new CDataBoundProperty(m_pBindings, dwDispId, 0);
m_pBindings->m_pDSCSite = pWndDSC->m_pCtrlSite;
m_pBindings->m_pClientSite = this;
m_pBindings->m_pDSCSite->EnableDSC();
m_pBindings->m_pDSCSite->m_pDataSourceControl->BindProp(m_pBindings, TRUE);
}
else
{
// Try and locate the particular property to unbind
// if dwDispId == DISPID_UNKNOWN && pWndDSC == NULL it unbinds all properties
// if dwDispId == DISPID_UNKNOWN && pWndDSC != NULL it unbinds properties for that DSC
CDataBoundProperty *pCurrent = m_pBindings;
CDataBoundProperty* pPrev = NULL;
while (pCurrent != NULL)
{
CDataBoundProperty* pNext = pCurrent->GetNext();
if (dwDispId == DISPID_UNKNOWN || pCurrent->m_dispid == dwDispId)
{
if (pWndDSC == NULL || pWndDSC->m_pCtrlSite == pCurrent->m_pDSCSite)
{
if (pPrev != NULL)
pPrev->m_pNext = pNext;
else
m_pBindings = pNext;
if (pCurrent->m_pDSCSite != NULL && pCurrent->m_pDSCSite->m_pDataSourceControl != NULL)
pCurrent->m_pDSCSite->m_pDataSourceControl->BindProp(pCurrent, FALSE);
delete pCurrent;
}
}
if (pPrev != NULL)
pPrev = pPrev->GetNext();
pCurrent = pNext;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// COleControlSite::XOleClientSite
STDMETHODIMP_(ULONG) COleControlSite::XOleClientSite::AddRef()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleClientSite)
return (ULONG)pThis->InternalAddRef();
}
STDMETHODIMP_(ULONG) COleControlSite::XOleClientSite::Release()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleClientSite)
return (ULONG)pThis->InternalRelease();
}
STDMETHODIMP COleControlSite::XOleClientSite::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleClientSite)
return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControlSite::XOleClientSite::SaveObject()
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XOleClientSite::GetMoniker(DWORD, DWORD,
LPMONIKER*)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XOleClientSite::GetContainer(
LPOLECONTAINER* ppContainer)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleClientSite)
return (HRESULT)pThis->m_pCtrlCont->InternalQueryInterface(
&IID_IOleContainer, (LPVOID*)ppContainer);
}
STDMETHODIMP COleControlSite::XOleClientSite::ShowObject()
{
METHOD_PROLOGUE_EX(COleControlSite, OleClientSite)
pThis->AttachWindow();
return S_OK;
}
STDMETHODIMP COleControlSite::XOleClientSite::OnShowWindow(BOOL)
{
return S_OK;
}
STDMETHODIMP COleControlSite::XOleClientSite::RequestNewObjectLayout()
{
return E_NOTIMPL;
}
/////////////////////////////////////////////////////////////////////////////
// COleControlSite::XOleIPSite
STDMETHODIMP_(ULONG) COleControlSite::XOleIPSite::AddRef()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
return (ULONG)pThis->InternalAddRef();
}
STDMETHODIMP_(ULONG) COleControlSite::XOleIPSite::Release()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
return (ULONG)pThis->InternalRelease();
}
STDMETHODIMP COleControlSite::XOleIPSite::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
return (HRESULT)pThis->InternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControlSite::XOleIPSite::GetWindow(HWND* phWnd)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
*phWnd = pThis->m_pCtrlCont->m_pWnd->GetSafeHwnd();
return *phWnd != NULL ? S_OK : E_FAIL;
}
STDMETHODIMP COleControlSite::XOleIPSite::ContextSensitiveHelp(BOOL)
{
return E_NOTIMPL;
}
STDMETHODIMP COleControlSite::XOleIPSite::CanInPlaceActivate()
{
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::OnInPlaceActivate()
{
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::OnUIActivate()
{
METHOD_PROLOGUE_EX_(COleControlSite, OleIPSite)
pThis->m_pCtrlCont->OnUIActivate(pThis);
return S_OK;
}
STDMETHODIMP COleControlSite::XOleIPSite::GetWindowContext(
LPOLEINPLACEFRAME* ppFrame, LPOLEINPLACEUIWINDOW* ppDoc, LPRECT prectPos,
LPRECT prectClip, LPOLEINPLACEFRAMEINFO pFrameInfo)
{
METHOD_PROLOGUE_EX(COleControlSite, OleIPSite)
ASSERT_VALID(pThis->m_pCtrlCont);
ASSERT_VALID(pThis->m_pCtrlCont->m_pWnd);
ASSERT(AfxIsValidAddress(ppFrame, sizeof(LPOLEINPLACEFRAME)));
ASSERT((ppDoc == NULL) ||
AfxIsValidAddress(ppDoc, sizeof(LPOLEINPLACEUIWINDOW)));
ASSERT(AfxIsValidAddress(prectPos, sizeof(RECT)));
ASSERT(AfxIsValidAddress(prectClip, sizeof(RECT)));
ASSERT(AfxIsValidAddress(pFrameInfo, pFrameInfo->cb));
//WINBUG: This is a temporary patch for IE3 beta. When IE3 is fixed, this
// assert can be re-enabled. Otherwise it fires everytime you browse via
// the CWebBrowser control.
//
// ASSERT(pFrameInfo->cb >= offsetof(OLEINPLACEFRAMEINFO, cAccelEntries) +
// sizeof(int));
// There is no separate doc window
if (ppDoc != NULL)
*ppDoc = NULL;
// Set pointer to frame
if (FAILED(pThis->m_pCtrlCont->InternalQueryInterface(
&IID_IOleInPlaceFrame, (LPVOID*)ppFrame)))
return E_FAIL;
// Fill in position and clip rectangles
CWnd* pWndContainer = pThis->m_pCtrlCont->m_pWnd;
CopyRect(prectPos, pThis->m_rect);
pWndContainer->GetClientRect(prectClip);
// Fill in frame info
pFrameInfo->fMDIApp = FALSE;
pFrameInfo->hwndFrame = pWndContainer->GetSafeHwnd();
pFrameInfo->haccel = NULL;
pFrameInfo->cAccelEntries = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -