//=--------------------------------------------------------------------------= // CtlWrap.Cpp //=--------------------------------------------------------------------------= // Copyright 1995 Microsoft Corporation. All Rights Reserved. // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. //=--------------------------------------------------------------------------= // // wrappers for various routines that have slightly different implementations // for windowed and windowless controls. // #include "pch.h" #include "CtrlObj.H" // for ASSERT and FAIL // SZTHISFILE //=--------------------------------------------------------------------------= // COleControl::OcxGetFocus [wrapper] //=--------------------------------------------------------------------------= // indicates whether or not we have the focus. // // Parameters: // none // // Output: // TRUE if we have focus, else false // // Notes: // BOOL COleControl::OcxGetFocus ( void ) { // if we're windowless, the site provides this functionality // if (m_pInPlaceSiteWndless) { return (m_pInPlaceSiteWndless->GetFocus() == S_OK); } else { // we've got a window. just let the APIs do our work // if (m_fInPlaceActive) return (GetFocus() == m_hwnd); else return FALSE; } // dead code } //=--------------------------------------------------------------------------= // COleControl::OcxGetWindowRect [wrapper] //=--------------------------------------------------------------------------= // returns the current rectangle for this control, and correctly handles // windowless vs windowed. // // Parameters: // LPRECT - [out] duh. // // Output: // BOOL - false means unexpected. // // Notes: // BOOL COleControl::OcxGetWindowRect ( LPRECT prc ) { // if we're windowless, then we have this information already! // if (Windowless()) { *prc = m_rcLocation; return TRUE; } else return GetWindowRect(m_hwnd, prc); // dead code } //=--------------------------------------------------------------------------= // COleControl::OcxDefWindowProc [wrapper] //=--------------------------------------------------------------------------= // default window processing // // Parameters: // UINT - [in] duh. // WPARAM - [in] duh. // LPARAM - [in] DUH. // // Output: // LRESULT // // Notes: // LRESULT COleControl::OcxDefWindowProc ( UINT msg, WPARAM wParam, LPARAM lParam ) { LRESULT l; // if we're windowless, this is a site provided pointer // if (m_pInPlaceSiteWndless) m_pInPlaceSiteWndless->OnDefWindowMessage(msg, wParam, lParam, &l); else // we've got a window -- just pass it along // l = DefWindowProc(m_hwnd, msg, wParam, lParam); return l; } //=--------------------------------------------------------------------------= // COleControl::OcxGetDC [wrapper] //=--------------------------------------------------------------------------= // wraps the functionality of GetDC, and correctly handles windowless controls // // Parameters: // none // // Output: // HDC - null means we couldn't get one // // Notes: // - we don't bother with a bunch of the IOleInPlaceSiteWindowless::GetDc // parameters, since the windows GetDC doesn't expose these either. users // wanting that sort of fine tuned control can call said routine // explicitly // HDC COleControl::OcxGetDC ( void ) { HDC hdc = NULL; // if we're windowless, the site provides this functionality. // if (m_pInPlaceSiteWndless) m_pInPlaceSiteWndless->GetDC(NULL, 0, &hdc); else hdc = GetDC(m_hwnd); return hdc; } //=--------------------------------------------------------------------------= // COleControl::OcxReleaseDC [wrapper] //=--------------------------------------------------------------------------= // releases a DC returned by OcxGetDC // // Parameters: // HDC - [in] release me // // Output: // none // // Notes: // void COleControl::OcxReleaseDC ( HDC hdc ) { // if we're windowless, the site does this for us // if (m_pInPlaceSiteWndless) m_pInPlaceSiteWndless->ReleaseDC(hdc); else ReleaseDC(m_hwnd, hdc); } //=--------------------------------------------------------------------------= // COleControl::OcxSetCapture [wrapper] //=--------------------------------------------------------------------------= // provides a means for the control to get or release capture. // // Parameters: // BOOL - [in] true means take, false release // // Output: // BOOL - true means it's yours, false nuh-uh // // Notes: // BOOL COleControl::OcxSetCapture ( BOOL fGrab ) { HRESULT hr; // the host does this for us if we're windowless [i'm getting really bored // of typing that] // if (m_pInPlaceSiteWndless) { hr = m_pInPlaceSiteWndless->SetCapture(fGrab); return (hr == S_OK); } else { // people shouldn't call this when they're not in-place active, but // just in case... // if (m_fInPlaceActive) { if (fGrab) SetCapture(m_hwnd); else ReleaseCapture(); return TRUE; } else return FALSE; } // dead code } //=--------------------------------------------------------------------------= // COleControl::OcxGetCapture [wrapper] //=--------------------------------------------------------------------------= // tells you whether or not you have the capture. // // Parameters: // none // // Output: // BOOL - true it's yours, false it's not // // Notes: // BOOL COleControl::OcxGetCapture ( void ) { // host does this for windowless dudes // if (m_pInPlaceSiteWndless) return m_pInPlaceSiteWndless->GetCapture() == S_OK; else { // people shouldn't call this when they're not in-place active, but // just in case. // if (m_fInPlaceActive) return GetCapture() == m_hwnd; else return FALSE; } // dead code } //=--------------------------------------------------------------------------= // COleControl::OcxInvalidateRect [wrapper] //=--------------------------------------------------------------------------= // invalidates the control's rectangle // // Parameters: // LPCRECT - [in] rectangle to invalidate // BOOL - [in] do we erase background first? // // Output: // BOOL // // Notes: // BOOL COleControl::OcxInvalidateRect ( LPCRECT prcInvalidate, BOOL fErase ) { // if we're windowless, then we need to get the site to do all this for // us if (m_pInPlaceSiteWndless) return m_pInPlaceSiteWndless->InvalidateRect(prcInvalidate, fErase) == S_OK; else { // otherwise do something different depending on whether or not we're // in place active or not // if (m_fInPlaceActive && m_hwnd) return InvalidateRect(m_hwnd, prcInvalidate, fErase); else ViewChanged(); } return TRUE; } //=--------------------------------------------------------------------------= // COleControl::OcxScrollRect [wrapper] //=--------------------------------------------------------------------------= // does some window scrolling for the control // // Parameters: // LPCRECT - [in] region to scroll // LPCRECT - [in] region to clip // int - [in] dx to scroll // int - [in] dy to scroll // // Output: // BOOL // // Notes: // BOOL COleControl::OcxScrollRect ( LPCRECT prcBounds, LPCRECT prcClip, int dx, int dy ) { // if we're windowless, the site provides this functionality, otherwise // APIs do the job // if (m_pInPlaceSiteWndless) return m_pInPlaceSiteWndless->ScrollRect(dx, dy, prcBounds, prcClip) == S_OK; else { if (m_fInPlaceActive) ScrollWindowEx(m_hwnd, dx, dy, prcBounds, prcClip, NULL, NULL, SW_INVALIDATE); else return FALSE; } return TRUE; }