| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
- #include "stdafx.h"
- #include "occimpl.h"
- #ifdef AFX_CORE1_SEG
- #pragma code_seg(AFX_CORE1_SEG)
- #endif
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #define new DEBUG_NEW
- #ifndef _AFX_NO_OCC_SUPPORT
- /////////////////////////////////////////////////////////////////////////////
- // CWnd overridable for ambient properties
- BOOL CWnd::OnAmbientProperty(COleControlSite* pSite, DISPID dispid,
- VARIANT* pvar)
- {
- ASSERT(m_pCtrlCont != NULL);
- return m_pCtrlCont->GetAmbientProp(pSite, dispid, pvar);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CWnd access to underlying OLE control interface
- LPUNKNOWN CWnd::GetControlUnknown()
- {
- if (m_pCtrlSite == NULL)
- return NULL;
- return m_pCtrlSite->m_pObject;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CWnd functions with special cases for OLE Control containment
- void CWnd::CheckDlgButton(int nIDButton, UINT nCheck)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- ::CheckDlgButton(m_hWnd, nIDButton, nCheck);
- else
- m_pCtrlCont->CheckDlgButton(nIDButton, nCheck);
- }
- void CWnd::CheckRadioButton(int nIDFirstButton, int nIDLastButton,
- int nIDCheckButton)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- ::CheckRadioButton(m_hWnd, nIDFirstButton, nIDLastButton,
- nIDCheckButton);
- else
- m_pCtrlCont->CheckRadioButton(nIDFirstButton, nIDLastButton,
- nIDCheckButton);
- }
- CWnd* CWnd::GetDlgItem(int nID) const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
- else
- return m_pCtrlCont->GetDlgItem(nID);
- }
- void CWnd::GetDlgItem(int nID, HWND* phWnd) const
- {
- ASSERT(::IsWindow(m_hWnd));
- ASSERT(phWnd != NULL);
- if (m_pCtrlCont == NULL)
- *phWnd = ::GetDlgItem(m_hWnd, nID);
- else
- m_pCtrlCont->GetDlgItem(nID, phWnd);
- }
- UINT CWnd::GetDlgItemInt(int nID, BOOL* lpTrans, BOOL bSigned) const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- return ::GetDlgItemInt(m_hWnd, nID, lpTrans, bSigned);
- else
- return m_pCtrlCont->GetDlgItemInt(nID, lpTrans, bSigned);
- }
- int CWnd::GetDlgItemText(int nID, LPTSTR lpStr, int nMaxCount) const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- return ::GetDlgItemText(m_hWnd, nID, lpStr, nMaxCount);
- else
- return m_pCtrlCont->GetDlgItemText(nID, lpStr, nMaxCount);
- }
- LRESULT CWnd::SendDlgItemMessage(int nID, UINT message, WPARAM wParam,
- LPARAM lParam)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- return ::SendDlgItemMessage(m_hWnd, nID, message, wParam, lParam);
- else
- return m_pCtrlCont->SendDlgItemMessage(nID, message, wParam, lParam);
- }
- void CWnd::SetDlgItemInt(int nID, UINT nValue, BOOL bSigned)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- ::SetDlgItemInt(m_hWnd, nID, nValue, bSigned);
- else
- m_pCtrlCont->SetDlgItemInt(nID, nValue, bSigned);
- }
- void CWnd::SetDlgItemText(int nID, LPCTSTR lpszString)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- ::SetDlgItemText(m_hWnd, nID, lpszString);
- else
- m_pCtrlCont->SetDlgItemText(nID, lpszString);
- }
- UINT CWnd::IsDlgButtonChecked(int nIDButton) const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlCont == NULL)
- return ::IsDlgButtonChecked(m_hWnd, nIDButton);
- else
- return m_pCtrlCont->IsDlgButtonChecked(nIDButton);
- }
- int CWnd::ScrollWindowEx(int dx, int dy, LPCRECT lpRectScroll,
- LPCRECT lpRectClip, CRgn* prgnUpdate, LPRECT lpRectUpdate,
- UINT flags)
- {
- ASSERT(::IsWindow(m_hWnd));
- int iReturn = ::ScrollWindowEx(m_hWnd, dx, dy, lpRectScroll, lpRectClip,
- (HRGN)prgnUpdate->GetSafeHandle(), lpRectUpdate, flags);
- if ((m_pCtrlCont == NULL) || !(flags & SW_SCROLLCHILDREN))
- return iReturn;
- // the following code is for OLE control containers only
- m_pCtrlCont->ScrollChildren(dx, dy);
- return iReturn;
- }
- BOOL CWnd::IsDialogMessage(LPMSG lpMsg)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_nFlags & WF_OLECTLCONTAINER)
- return afxOccManager->IsDialogMessage(this, lpMsg);
- else
- return ::IsDialogMessage(m_hWnd, lpMsg);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CWnd functions with special cases for OLE Control wrappers
- DWORD CWnd::GetStyle() const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return (DWORD)GetWindowLong(m_hWnd, GWL_STYLE);
- else
- return m_pCtrlSite->GetStyle();
- }
- DWORD CWnd::GetExStyle() const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return (DWORD)GetWindowLong(m_hWnd, GWL_EXSTYLE);
- else
- return m_pCtrlSite->GetExStyle();
- }
- BOOL CWnd::ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ModifyStyle(m_hWnd, dwRemove, dwAdd, nFlags);
- else
- return m_pCtrlSite->ModifyStyle(dwRemove, dwAdd, nFlags);
- }
- BOOL CWnd::ModifyStyleEx(DWORD dwRemove, DWORD dwAdd, UINT nFlags)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ModifyStyleEx(m_hWnd, dwRemove, dwAdd, nFlags);
- else
- return m_pCtrlSite->ModifyStyleEx(dwRemove, dwAdd, nFlags);
- }
- void CWnd::SetWindowText(LPCTSTR lpszString)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- ::SetWindowText(m_hWnd, lpszString);
- else
- m_pCtrlSite->SetWindowText(lpszString);
- }
- int CWnd::GetWindowText(LPTSTR lpszString, int nMaxCount) const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::GetWindowText(m_hWnd, lpszString, nMaxCount);
- else
- return m_pCtrlSite->GetWindowText(lpszString, nMaxCount);
- }
- int CWnd::GetWindowTextLength() const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::GetWindowTextLength(m_hWnd);
- else
- return m_pCtrlSite->GetWindowTextLength();
- }
- int CWnd::GetDlgCtrlID() const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::GetDlgCtrlID(m_hWnd);
- else
- return m_pCtrlSite->GetDlgCtrlID();
- }
- int CWnd::SetDlgCtrlID(int nID)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return (int)::SetWindowLong(m_hWnd, GWL_ID, nID);
- else
- return m_pCtrlSite->SetDlgCtrlID(nID);
- }
- void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- ::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);
- else
- m_pCtrlSite->MoveWindow(x, y, nWidth, nHeight, bRepaint);
- }
- BOOL CWnd::SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx,
- int cy, UINT nFlags)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::SetWindowPos(m_hWnd, pWndInsertAfter->GetSafeHwnd(),
- x, y, cx, cy, nFlags);
- else
- return m_pCtrlSite->SetWindowPos(pWndInsertAfter, x, y, cx, cy, nFlags);
- }
- BOOL CWnd::ShowWindow(int nCmdShow)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::ShowWindow(m_hWnd, nCmdShow);
- else
- return m_pCtrlSite->ShowWindow(nCmdShow);
- }
- BOOL CWnd::IsWindowEnabled() const
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::IsWindowEnabled(m_hWnd);
- else
- return m_pCtrlSite->IsWindowEnabled();
- }
- BOOL CWnd::EnableWindow(BOOL bEnable)
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return ::EnableWindow(m_hWnd, bEnable);
- else
- return m_pCtrlSite->EnableWindow(bEnable);
- }
- CWnd* CWnd::SetFocus()
- {
- ASSERT(::IsWindow(m_hWnd));
- if (m_pCtrlSite == NULL)
- return CWnd::FromHandle(::SetFocus(m_hWnd));
- else
- return m_pCtrlSite->SetFocus();
- }
- /////////////////////////////////////////////////////////////////////////////
- // CWnd invoke helpers for OLE Control wrappers
- void AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
- void* pvRet, const BYTE* pbParamInfo, ...)
- {
- ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
- if (m_pCtrlSite == NULL)
- return;
- va_list argList;
- va_start(argList, pbParamInfo);
- m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,
- argList);
- va_end(argList);
- }
- void CWnd::GetProperty(DISPID dwDispID, VARTYPE vtProp,
- void* pvProp) const
- {
- ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
- if (m_pCtrlSite == NULL)
- return;
- const_cast<CWnd*>(this)->InvokeHelper(dwDispID, DISPATCH_PROPERTYGET,
- vtProp, pvProp, NULL);
- }
- void AFX_CDECL CWnd::SetProperty(DISPID dwDispID, VARTYPE vtProp, ...)
- {
- ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
- if (m_pCtrlSite == NULL)
- return;
- va_list argList; // really only one arg, but...
- va_start(argList, vtProp);
- m_pCtrlSite->SetPropertyV(dwDispID, vtProp, argList);
- va_end(argList);
- }
- IUnknown* CWnd::GetDSCCursor()
- {
- ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
- if (m_pCtrlSite == NULL)
- return NULL;
- m_pCtrlSite->EnableDSC();
- IUnknown* pCursor = m_pCtrlSite->m_pDataSourceControl->GetCursor();
- ASSERT(pCursor != NULL); // data source control has no cursor
- return pCursor;
- }
- void CWnd::BindDefaultProperty(DISPID dwDispID, VARTYPE vtProp, LPCTSTR szFieldName, CWnd* pDSCWnd)
- {
- ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
- m_pCtrlSite->BindDefaultProperty(dwDispID, vtProp, szFieldName, pDSCWnd);
- }
- void CWnd::BindProperty(DISPID dwDispId, CWnd* pWndDSC)
- {
- ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
- m_pCtrlSite->BindProperty(dwDispId, pWndDSC);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CWnd implementation helpers
- void CWnd::AttachControlSite(CHandleMap* pMap)
- {
- if (this != NULL && m_pCtrlSite == NULL)
- {
- // Determine if parent is an OLE control container
- CWnd* pWndParent = (CWnd*)pMap->LookupPermanent(::GetParent(m_hWnd));
- if (pWndParent != NULL && pWndParent->m_pCtrlCont != NULL)
- {
- // delegate through helper in COleControlSite
- pWndParent->m_pCtrlCont->AttachControlSite(this);
- }
- }
- }
- void CWnd::AttachControlSite(CWnd* pWndParent)
- {
- ASSERT(this != NULL);
- ASSERT(pWndParent != NULL);
- if (m_pCtrlSite == NULL && pWndParent->m_pCtrlCont != NULL)
- {
- // delegate through helper in COleControlSite
- pWndParent->m_pCtrlCont->AttachControlSite(this);
- }
- }
- void COleControlContainer::AttachControlSite(CWnd* pWnd)
- {
- ASSERT(this != NULL);
- ASSERT(pWnd != NULL);
- // If a matching control site exists, it's an OLE control
- COleControlSite* pSite = (COleControlSite*)m_siteMap.GetValueAt(pWnd->m_hWnd);
- if (pSite != NULL)
- {
- // detach any existing CWnd from this site (last one wins)
- CWnd* pOldCtrl = pSite->m_pWndCtrl;
- if (pOldCtrl != NULL && pOldCtrl->m_pCtrlSite == pSite)
- pOldCtrl->m_pCtrlSite = NULL;
- // now wire the site and CWnd together
- pWnd->m_pCtrlSite = pSite;
- pSite->m_pWndCtrl = pWnd;
- }
- }
- #endif // !_AFX_NO_OCC_SUPPORT
|