MFC--绘图

来源:互联网 发布:电机原理及拖动 知乎 编辑:程序博客网 时间:2024/05/29 11:02
一 绘图环境

绘图需要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

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击