
创建程序创建一个MFC单个文档的小程序,高级功能全都点掉即可.注:我设置的项目名是Test_2_2,设置的项目存储路径和项目名不要出现中文,可能出现未知异常.创建文件画图菜单在资源视图中找到 IDR_MARINFRAME 点击打开点击 IDR_MARINFRAME 中的输入框属于信息点击画线选项编辑ID (本人依次编辑的是 ID_DRAW_LINE , ID_DRAW_RECT , ID_DRAW_ELLIPSE , ID_DRAW_PEN)至此前期的准备完成.程序分析: 我们要在点击一个选项后在界面上绘制对应的图形,那么点击选项就如同打开了这个绘制的开关一样,所以我们设置4个enum选项来表示要画的图形 在 Test_2_2View.h 文件中 如下图:如果点击了画线选项,鼠标在界面中,按下左键拖动到另一点松开,两点连线便是要画的线.所以要在Test_2_2View.h 文件中的类CTest22View中添加鼠标按下时点的位置,画线开关和所画的图形形式添加四个选项的应命令(如下图)左键按下抬起消息和鼠标移动消息WM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSEMOVE参考代码如下:当你按下画笔选项时, 形式m_DrawType DT_PEN 切换为画笔形式. 在界面按下鼠标左键时画笔开关m_bDraw设true,并记录此时的位置在m_pOrigin中随着你鼠标移动激活鼠标移动函数 OnMouseMove(UINT nFlags, CPoint point)画线,鼠标抬起时便会关键开关m_bDraw.voidCTest22View::OnDrawLine(){// TODO: 在此添加命令处理程序代码m_DrawTypeDT_LINE;}voidCTest22View::OnDrawRect(){// TODO: 在此添加命令处理程序代码m_DrawTypeDT_RECT;}voidCTest22View::OnDrawEllipse(){// TODO: 在此添加命令处理程序代码m_DrawTypeDT_ELLIPSE;}voidCTest22View::OnDrawPen(){// TODO: 在此添加命令处理程序代码m_DrawTypeDT_PEN;}voidCTest22View::OnLButtonDown(UINT nFlags,CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if(m_DrawTypeDT_PEN){m_bDrawtrue;}m_pOriginpoint;CView::OnLButtonDown(nFlags,point);}voidCTest22View::OnLButtonUp(UINT nFlags,CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CClientDCdc(this);////创建笔 (实线,宽度2,颜色)CPenpen(PS_SOLID,2,RGB(100,10,199));//默认保存至pOldPen,设备选择新的笔CPen*pOldPendc.SelectObject(pen);switch(m_DrawType)//分辨激活的是哪个操作{caseDT_LINE://画线dc.MoveTo(m_pOrigin);dc.LineTo(point);break;caseDT_RECT://换矩形dc.Rectangle(CRect(m_pOrigin,point));break;caseDT_ELLIPSE://画椭圆dc.Ellipse(CRect(m_pOrigin,point));break;caseDT_PEN:m_bDrawfalse;//鼠标抬起结束画笔break;default:break;}CView::OnLButtonUp(nFlags,point);}voidCTest22View::OnMouseMove(UINT nFlags,CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if(m_DrawTypeDT_PENm_bDrawtrue){CClientDCdc(this);CPenpen(PS_SOLID,2,RGB(0,100,220));CPen*pOldPendc.SelectObject(pen);//从起点画一段线到终点dc.MoveTo(m_pOrigin);dc.LineTo(point);//终点变成新的起点m_pOriginpoint;dc.SelectObject(pOldPen);}CView::OnMouseMove(nFlags,point);}