MFC实现画布

随便新建一个MFC项目,我选了MDI,SDI差不多吧。

先把视图背景改成灰色,在BOOL CMFCMDIView::PreCreateWindow(CREATESTRUCT& cs)中:

BOOL CMFCMDIView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	cs.lpszClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS, LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(LTGRAY_BRUSH));

	return CView::PreCreateWindow(cs);
}

当然还有一个方法,响应WM_ERASEBKGND消息:

BOOL CMFCMDIView::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	RECT rcClient;
	GetClientRect(&rcClient);
	pDC->FillSolidRect(&rcClient, GetSysColor(COLOR_APPWORKSPACE));
	return TRUE;
	//return CView::OnEraseBkgnd(pDC);
}
都行。在OnDraw中画一遍也行。

在视图类添加一个成员变量:

protected:
	CRectTracker m_Tracker;
找个地方初始化一下,视图类的构造函数也行:
		m_Tracker.m_rect.SetRect(5, 5, 69, 69);
		m_Tracker.m_nStyle = CRectTracker::resizeOutside | CRectTracker::dottedLine;

为了给拉伸句柄一个鼠标指针变化的指示,响应WM_SETCURSOR消息:

	BOOL CMFCMDIView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
	{
		// TODO: 在此添加消息处理程序代码和/或调用默认值
		POINT pt;
		GetCursorPos(&pt);
		ScreenToClient(&pt);
		switch( m_Tracker.HitTest(pt))
		{
		case CRectTracker::hitRight:
			SetCursor(LoadCursor(NULL, IDC_SIZEWE));
			break;
		case CRectTracker::hitBottom:
			SetCursor(LoadCursor(NULL, IDC_SIZENS));
			break;
		case CRectTracker::hitBottomRight:
			SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
			break;
		default:
			return CView::OnSetCursor(pWnd, nHitTest, message);
		}

		return TRUE;
	}
响应鼠标消息WM_LBUTTONDOWN:
	void CMFCMDIView::OnLButtonDown(UINT nFlags, CPoint point)
	{
		// TODO: 在此添加消息处理程序代码和/或调用默认值
		int nHitTest = m_Tracker.HitTest(point);
		if (nHitTest == CRectTracker::hitRight ||
			nHitTest == CRectTracker::hitBottom ||
			nHitTest == CRectTracker::hitBottomRight)
		{
			if (m_Tracker.Track(this, point))
			{
				Invalidate();
			}
		}

		CView::OnLButtonDown(nFlags, point);
	}
好了,下面就是绘图:
	void CMFCMDIView::OnDraw(CDC* pDC)
	{
		CMFCMDIDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		if (!pDoc)
			return;

		pDC->FillSolidRect(m_Tracker.m_rect, RGB(255, 255, 255));
		m_Tracker.Draw(pDC);

		CRgn rgnClip;
		rgnClip.CreateRectRgnIndirect(m_Tracker.m_rect);
		pDC->SelectClipRgn(&rgnClip); // 设置剪裁区域免得画到画布外面去

		// TODO: 在此处为本机数据添加绘制代码

		pDC->MoveTo(0, 500);
		pDC->LineTo(500, 0);
		pDC->MoveTo(100, 50);
		pDC->LineTo(350, 100);

		pDC->SelectClipRgn(NULL);
		rgnClip.DeleteObject();
	}
搞定。

初始状态-〉拉伸后

MFC实现画布_第1张图片MFC实现画布_第2张图片


你可能感兴趣的:(C++,mfc)