home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
winocc.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
12KB
|
458 lines
// 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