288 lines
5.8 KiB
C++
288 lines
5.8 KiB
C++
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
|