Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

287 lines
5.8 KiB

/*++
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;
}