15,979
社区成员
发帖
与我相关
我的任务
分享
private:
CArray<CPoint, CPoint&> starsCenter;
CArray<int, int&> starsRadius;
CPoint center;
int radius;
void drawStar(CDC * pDC, const CPoint & pt, int r, bool erase = false);
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
void CStarView::OnDraw(CDC* pDC)
{
CStarDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->SelectStockObject(NULL_BRUSH);
for (int i=0; i<starsCenter.GetSize(); i++)
{
drawStar(pDC, starsCenter[i], starsRadius[i]);
}
}
void CStarView::OnLButtonDown(UINT nFlags, CPoint point)
{
center = point;
radius = 0;
CClientDC dc(this);
dc.SetPixel(center, RGB(0, 0, 0));
SetCapture();
CView::OnLButtonDown(nFlags, point);
}
void CStarView::drawStar(CDC * pDC, const CPoint & pt, int r, bool erase)
{
using namespace std;
CRect rc;
GetClientRect(&rc);
int mm = pDC->SetMapMode(MM_ANISOTROPIC);
CSize wext = pDC->SetWindowExt(rc.Size());
CSize ext = pDC->SetViewportExt(rc.Width(), -rc.Height());
CPoint org = pDC->SetViewportOrg(pt);
int rop = 0;
if (erase)
{
rop = pDC->SetROP2(R2_XORPEN);
}
CPoint vertex[5];
const double PI = 3.1415927;
double angle = 2*PI/5;
vertex[0].SetPoint(0, r);
vertex[1].SetPoint(r*sin(angle), r*cos(angle));
vertex[2].SetPoint(r*sin(angle/2), -r*cos(angle/2));
vertex[3].SetPoint(-vertex[2].x, vertex[2].y);
vertex[4].SetPoint(-vertex[1].x, vertex[1].y);
pDC->MoveTo(vertex[0]);
pDC->LineTo(vertex[2]);
pDC->LineTo(vertex[4]);
pDC->LineTo(vertex[1]);
pDC->LineTo(vertex[3]);
pDC->LineTo(vertex[0]);
if (erase)
{
pDC->SetROP2(rop);
}
pDC->SetViewportOrg(org);
pDC->SetViewportExt(ext);
pDC->SetWindowExt(wext);
pDC->SetMapMode(mm);
}
void CStarView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
{
CClientDC dc(this);
dc.SelectStockObject(NULL_BRUSH);
CRect rt(center, CSize(0, 0));
rt.InflateRect(radius, radius+1);
dc.SetROP2(R2_XORPEN);
dc.Ellipse(rt);
starsCenter.Add(center);
starsRadius.Add(radius);
ReleaseCapture();
}
CView::OnLButtonUp(nFlags, point);
}
void CStarView::OnMouseMove(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
{
CClientDC dc(this);
dc.SelectStockObject(NULL_BRUSH);
drawStar(&dc, center, radius, true);
CRect rt(center, CSize(0, 0));
rt.InflateRect(radius, radius+1);
int rop = dc.SetROP2(R2_XORPEN);
dc.Ellipse(rt);
dc.SetROP2(rop);
radius = sqrt(double((point.x - center.x)*(point.x - center.x) + (point.y - center.y)*(point.y - center.y)));
drawStar(&dc, center, radius);
rt = CRect(center, CSize(0, 0));
rt.InflateRect(radius, radius+1);
dc.Ellipse(rt);
}
CView::OnMouseMove(nFlags, point);
}