📄 polywin.cpp
字号:
/*
* POLYWIN.CPP
* Polyline Component Chapter 24
*
* Window procedure for the polyline drawing window and support
* functions.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#include "polyline.h"
/*
* PolylineWndProc
*
* Purpose:
* Window procedure for the polyline drawing window.
*/
LRESULT APIENTRY PolylineWndProc(HWND hWnd, UINT iMsg
, WPARAM wParam, LPARAM lParam)
{
PCPolyline ppl;
PAINTSTRUCT ps;
HDC hDC;
POINTS pt;
RECT rc;
COMMANDPARAMS(wID, wCode, hWndMsg);
ppl=(PCPolyline)GetWindowLong(hWnd, PLWL_STRUCTURE);
switch (iMsg)
{
case WM_CREATE:
ppl=(PCPolyline)((LPCREATESTRUCT)lParam)->lpCreateParams;
SetWindowLong(hWnd, PLWL_STRUCTURE, (LONG)ppl);
ppl->m_hWnd=hWnd;
break;
case WM_PAINT:
hDC=BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rc);
ppl->Draw(hDC, FALSE, TRUE, &rc, NULL);
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN:
//CHAPTER24MOD
//If the UI is dead, we ignore all mouse clicks.
if (ppl->m_fUIDead)
break;
//End CHAPTER24MOD
//We become UI Active with mouse action
if (!ppl->m_fUIActive && NULL!=ppl->m_pIOleIPSite)
ppl->UIActivate();
//Stop if we are already at the limit.
if (CPOLYLINEPOINTS==ppl->m_pl.cPoints)
{
MessageBeep(0);
break;
}
//Convert the points into 0-32767 range
GetClientRect(hWnd, &rc);
pt=MAKEPOINTS(lParam);
ppl->PointScale(&rc, &pt, FALSE);
ppl->m_pl.rgpt[ppl->m_pl.cPoints++]=pt;
//Draw the lines to this new point only.
hDC=GetDC(hWnd);
ppl->Draw(hDC, FALSE, FALSE, &rc, NULL);
ReleaseDC(hWnd, hDC);
if (NULL!=ppl->m_pAdv)
ppl->m_pAdv->OnPointChange();
ppl->SendAdvise(OBJECTCODE_DATACHANGED);
break;
case WM_COMMAND:
//CHAPTER24MOD
//Ignore Open commands when we're UIDead
if (ppl->m_fUIDead)
break;
//End CHAPTER24MOD
if (ID_HATCHWINDOW==wID
&& HWN_BORDERDOUBLECLICKED==wCode)
{
ppl->m_pImpIOleObject->DoVerb(OLEIVERB_OPEN, NULL
, ppl->m_pIOleClientSite, -1, NULL, NULL);
}
break;
default:
return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
return 0L;
}
/*
* CPolyline::Draw
*
* Purpose:
* Paints the current line in the polyline window.
*
* Parameters:
* hDC HDC to draw on, a metafile or printer DC.
* fMetafile BOOL indicating if hDC is a metafile or not,
* so we can avoid operations that RIP.
* fEntire BOOL indicating if we should draw the entire
* figure or not.
* pRect LPRECT defining the bounds in which to draw.
* ppl PPOLYLINEDATA to draw. If NULL, use current.
*
* Return Value:
* None
*/
void CPolyline::Draw(HDC hDC, BOOL fMetafile, BOOL fEntire
, LPRECT pRect, PPOLYLINEDATA ppl)
{
HBRUSH hBrush;
HPEN hPen;
HGDIOBJ hObj1, hObj2;
UINT i, j;
int nDC;
POINTS pt1,pt2;
POINT rgpt[CPOLYLINEPOINTS];
if (NULL==ppl)
ppl=&m_pl;
nDC=SaveDC(hDC);
for (i=0; i < ppl->cPoints; i++)
{
rgpt[i].x=ppl->rgpt[i].x;
rgpt[i].y=ppl->rgpt[i].y;
}
//Printer and frozen differences handled in IViewObject::Draw
hPen=CreatePen(ppl->iLineStyle, 1, ppl->rgbLine);
hObj1=SelectObject(hDC, hPen);
hBrush=CreateSolidBrush(ppl->rgbBackground);
hObj2=SelectObject(hDC, hBrush);
SetBkColor(hDC, ppl->rgbBackground);
/*
* Either draw the entire figure or just a single point. The
* entire figure also includes erasing the background completely,
* since hDC may be a metafile DC. Drawing a single point just
* updates the figure for that new point.
*/
if (fEntire || 0==ppl->cPoints)
{
//Erase the background for bitmaps and metafiles.
SelectObject(hDC, GetStockObject(NULL_PEN));
Rectangle(hDC, pRect->left, pRect->top, pRect->right+1
, pRect->bottom+1);
SelectObject(hDC, hPen);
/*
* If we are drawing the entire figure, then loop through
* each point drawing a line to each successive point.
*/
for (i=0; i < ppl->cPoints; i++)
{
for (j=i; j < ppl->cPoints; j++)
{
pt1.x=(short)rgpt[i].x;
pt1.y=(short)rgpt[i].y;
pt2.x=(short)rgpt[j].x;
pt2.y=(short)rgpt[j].y;
PointScale(pRect, &pt1, TRUE);
PointScale(pRect, &pt2, TRUE);
MoveToEx(hDC, pt1.x, pt1.y, NULL);
LineTo(hDC, pt2.x, pt2.y);
}
}
}
else
{
/*
* If we are only drawing the last point, just cycle once
* through previous points.
*/
//Get the last point entered in the array.
j=ppl->cPoints-1;
pt1.x=(short)rgpt[j].x;
pt1.y=(short)rgpt[j].y;
PointScale(pRect, &pt1, TRUE);
for (i=0; i < j; i++)
{
pt2.x=(short)rgpt[i].x;
pt2.y=(short)rgpt[i].y;
PointScale(pRect, &pt2, TRUE);
MoveToEx(hDC, pt1.x, pt1.y, NULL);
LineTo(hDC, pt2.x, pt2.y);
}
}
//If we have one point, draw a dot to indicate it's position.
if (1==ppl->cPoints)
{
pt1.x=(short)rgpt[0].x;
pt1.y=(short)rgpt[0].y;
PointScale(pRect, &pt1, TRUE);
SetPixel(hDC, pt1.x, pt1.y, m_pl.rgbLine);
}
SelectObject(hDC, hObj1);
SelectObject(hDC, hObj2);
DeleteObject(hBrush);
DeleteObject(hPen);
RestoreDC(hDC, nDC);
return;
}
/*
* CPolyline::PointScale
*
* Purpose:
* Scales a point to or from a relative window coordinate to a
* 0-32767 coordinate.
*
* Parameters:
* pRect LPRECT of the window.
* ppt LPPOINTS to convert
* fScaleToWindow BOOL indicating direction of scaling.
*
* Return Value:
* None
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -