/*++ Copyright (C) 1993-1999 Microsoft Corporation Module Name: ipolylin.cpp Abstract: Implementation of the IPolyline10 interface exposed on the CPolyline object. --*/ #include "polyline.h" #include "unkhlpr.h" /* * CImpIPolyline interface implementation */ IMPLEMENT_CONTAINED_INTERFACE(CPolyline, CImpIPolyline) /* * CImpIPolyline::Init * * Purpose: * Instantiates a polyline window within a given parent. The * parent may be a main application window, could be an MDI child * window. We really do not care. * * Parameters: * hWndParent HWND of the parent of this window * pRect LPRECT that this window should occupy * dwStyle DWORD containing the window's style flags * uID UINT ID to associate with this window * * Return Value: * HRESULT NOERROR if successful, otherwise E_OUTOFMEMORY */ STDMETHODIMP CImpIPolyline::Init(HWND hWndParent, LPRECT /* pRect */ , DWORD /* dwStyle */, UINT /* uID */) { SCODE sc; BOOL stat; stat = m_pObj->m_pCtrl->Init(hWndParent); sc = (stat == TRUE) ? S_OK : E_OUTOFMEMORY; return ResultFromScode(sc); } /* * CImpIPolyline::New * * Purpose: * Cleans out and reinitializes the data to defaults. * * Parameters: * None * * Return Value: * HRESULT NOERROR always */ STDMETHODIMP CImpIPolyline::New(void) { RECT rc; HWND hWnd; hWnd = m_pObj->m_pCtrl->Window(); //Our rectangle is the size of our window's client area. if (hWnd) { GetClientRect(hWnd, &rc); //RECTTORECTS(rc, ppl->rc); } else { SetRect(&rc, 0, 0, 300, 200); //Something reasonable //RECTTORECTS(rc, ppl->rc); } //This is now conditional since we may not yet have a window. if (hWnd) { InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); m_pObj->m_fDirty=TRUE; } m_pObj->SendAdvise(OBJECTCODE_DATACHANGED); return NOERROR; } /* * CImpIPolyline::Undo * * Purpose: * Reverses previous actions in a Polyline. * * Parameters: * None * * Return Value: * HRESULT S_OK if we can Undo more, S_FALSE otherwise. */ STDMETHODIMP CImpIPolyline::Undo(void) { return ResultFromScode(S_FALSE); } /* * CImpIPolyline::Window * * Purpose: * Returns the window handle associated with this polyline. * * Parameters: * phWnd HWND * in which to return the window handle. * * Return Value: * HRESULT NOERROR always. */ STDMETHODIMP CImpIPolyline::Window(HWND *phWnd) { *phWnd = m_pObj->m_pCtrl->Window(); return NOERROR; } /* * CImpIPolyline::RectGet * * Purpose: * Returns the rectangle of the Polyline in parent coordinates. * * Parameters: * pRect LPRECT in which to return the rectangle. * * Return Value: * HRESULT NOERROR always */ STDMETHODIMP CImpIPolyline::RectGet(LPRECT pRect) { // RECT rc; // POINT pt; // I know this seems wrong, but it works. // Always return the last extent that the container gave us. // Then it will set our window to the correct size. *pRect = m_pObj->m_RectExt; // Return extent rect return NOERROR; /*********** if (NULL==m_pObj->m_hWnd) { } //Retrieve the size of our rectangle in parent coordinates. GetWindowRect(m_pObj->m_hWnd, &rc); pt.x=rc.left; pt.y=rc.top; ScreenToClient(GetParent(m_pObj->m_hWnd), &pt); SetRect(pRect, pt.x, pt.y, pt.x+(rc.right-rc.left) , pt.y+(rc.bottom-rc.top)); return NOERROR; **********/ } /* * CImpIPolyline::SizeGet * * Purpose: * Retrieves the size of the Polyline in parent coordinates. * * Parameters: * pRect LPRECT in which to return the size. The right * and bottom fields will contain the dimensions. * * Return Value: * HRESULT NOERROR always */ STDMETHODIMP CImpIPolyline::SizeGet(LPRECT pRect) { RectGet(pRect); return NOERROR; } /* * CImpIPolyline::RectSet * * Purpose: * Sets a new rectangle for the Polyline which sizes to fit. * * Parameters: * pRect LPRECT containing the new rectangle. * fNotify BOOL indicating if we're to notify anyone of * the change. * * Return Value: * HRESULT NOERROR always */ STDMETHODIMP CImpIPolyline::RectSet(LPRECT pRect, BOOL fNotify) { UINT cx, cy; RECT rc; HWND hWnd; //Scale the points from our current size to the new size cx = pRect->right - pRect->left; cy = pRect->bottom - pRect->top; SetRect(&rc, 0, 0, cx, cy); hWnd = m_pObj->m_pCtrl->Window(); if ( NULL != hWnd ) { SetWindowPos(hWnd, NULL, pRect->left, pRect->top, cx, cy, SWP_NOZORDER); InvalidateRect(hWnd, NULL, TRUE); } if (fNotify) m_pObj->m_fDirty = TRUE; return NOERROR; } /* * CImpIPolyline::SizeSet * * Purpose: * Sets a new size for the Polyline which sizes to fit. * * Parameters: * pRect LPRECT containing the new rectangle. * fNotify BOOL indicating if we're to notify anyone of * the change. * * Return Value: * HRESULT NOERROR always */ STDMETHODIMP CImpIPolyline::SizeSet(LPRECT pRect, BOOL fNotify) { UINT cx, cy; HWND hWnd; //Scale the points from our current size to the new size cx=pRect->right-pRect->left; cy=pRect->bottom-pRect->top; hWnd = m_pObj->m_pCtrl->Window(); if ( NULL != hWnd ) { SetWindowPos(hWnd, NULL, 0, 0, (UINT)cx, (UINT)cy, SWP_NOMOVE | SWP_NOZORDER); InvalidateRect(hWnd, NULL, TRUE); } if (fNotify) m_pObj->m_fDirty=TRUE; return NOERROR; }