MFC--绘图

一 绘图环境

绘图需要DC,各个DC的关系如下图:

二 绘图工具

包括画笔,画刷等,如下图:

以画笔为例,试用方法如下;

 CClientDC dc(this);
  CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); //参数一为类型;参数二为宽度,参数三为颜色。
  CPen* pPen = dc.SelectObject(&pen);

用完之后需要dc.SelectObject(pPen);

也可以使用预定于的画笔,画刷,字体,如:pDC-> SelectStockObject(GRAY_BRUSH);

三 绘图函数

Arc:绘制一段弧
Chord:绘制弦形
Ellipse:绘制椭圆或圆
MoveTo:将当前位置移动到指定位置
LineTo:从当前位置到指定位置画一条直线
Polyline:画连接指定点的折线段
PolyBezler:根据两个端点和两个控制点画贝塞尔曲线
Pie:画冰块
Polygon:根据两个或两个以上的顶点绘制一个多边形
Rectangle:根据指定的左上角和右下角坐标绘制一个矩形
RoundRect:画圆角矩形
SetPixel:画一个点

四 常用方法

1 橡皮线

需要试用SetROP2设置DC模式,参数的部分结束如下:

  • R2_NOTXORPEN绘画模式
    你用红色画笔在黑色背景上画一条直线,显示红色,但你再用这只笔在刚画的直线上重画一遍,就相当于把开始画的红线擦除掉了,划线的地方显示为背景色。
  • R2_NOT绘画模式
    同样有在同一个地方画两次相当于什么都没画的功能,不过R2_NOT绘画模式第一次画的时候显示颜色并不是你选定的画笔颜色,而是默认的颜色。 

如下代码:

void CDrawDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bButDown = true;
	if (m_bNeedErase)
	{
		m_bNeedErase = false;
		InvalidateRect(CRect(m_BeginPoint.x,m_BeginPoint.y,m_LastPoint.x,m_LastPoint.y));
	}
   m_BeginPoint = m_LastPoint = point;
   
	CDialog::OnLButtonDown(nFlags, point);
}

void CDrawDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_bButDown = false;

	CDialog::OnLButtonUp(nFlags, point);
}

void CDrawDlg::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_bButDown)
	{
		CClientDC dc(this);
		CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
		CPen* pPen = dc.SelectObject(&pen);
		dc.SetROP2(R2_NOTXORPEN);
		if (m_bButDown)
		{
			dc.Rectangle(CRect(m_BeginPoint.x,m_BeginPoint.y,m_LastPoint.x,m_LastPoint.y));

		    dc.Rectangle(CRect(m_BeginPoint.x,m_BeginPoint.y,point.x,point.y));
		    CRect crect;
			GetClientRect(crect);
			if (point.x>=crect.right-5||point.y>=crect.bottom-5)
			{
				m_bButDown = false;

			}
            m_bNeedErase = true;
			m_LastPoint = point;
		}
		dc.SelectObject(pPen);
	}
	CDialog::OnMouseMove(nFlags, point);
}

2

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值