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