null第4章 GDI与Windows绘图第4章 GDI与Windows绘图设备环境类
绘图工具
绘图函数
文本处理
位图与位操作
图标与光标设备文本的概念设备文本的概念设备文本用于程序的可视化输出
设备文本提供一张画布,可在上面书写文字,或绘制点、直线、曲线等
图形既可通过屏幕显示,还可通过打印机等设备输出应用
程序GDI设备驱动程序输出设备设备环境类(1)设备环境类(1)CDC:MFC的设备文本基类
CClientDC:客户区(不包括边框、标题栏和菜单栏)的设备文本类
CWindowDC:程序窗口的设备文本类
CPaintDC:OnPaint函数使用的设备文本类
CMetaFileDC:图元文件的设备文本类设备环境类(2)设备环境类(2)画线程序的例子(CDC)(添加start)void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
CDC *pDC=GetDC();
pDC->MoveTo(start);
pDC->LineTo(point);
ReleaseDC(pDC);
}设备环境类(3)设备环境类(3)画线程序的例子(CClientDC)void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
//CClientDC dc(GetParent());
dc.MoveTo(start);
dc.LineTo(point);
}设备环境类(4)设备环境类(4)画线程序的例子(CWindowDC)void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(this);
//CWindowDC dc(GetParent());
//CWindowDC dc(GetDesktopWindow());
dc.MoveTo(start);
dc.LineTo(point);
}设备环境类(5)设备环境类(5)绘图的基本
绘图的基本方法通过CClientDC构造对象
通过GetDC获得设备环境指针CClientDC dc(this);
dc.Ellipse(10,10,200,200);CDC* pDC=GetDC();
pDC->Ellipse(10,10,200,200);
ReleaseDC(pDC);CPoint、CSize与CRect(1)CPoint、CSize与CRect(1)CPoint:封装POINT结构的类
定义一个点坐标,成员为x、y
CRect:封装RECT结构的类
定义一个矩形区域,成员为left、right、top、bottom
CSize:封装SIZE结构的类
定义矩形区域的大小,成员为cx、cyCPoint、CSize与CRect(2)CPoint、CSize与CRect(2)CPoint类的例子POINT p;
p.x=10; p.y=10;
pDC->TextOut(p.x,p.y,"POINT为一个结构,成员只有x,y");
CPoint q,q1(10,10),q2(0,90);
q=q1+q2;
pDC->TextOut(q.x,q.y,"CPoint为一个类,封装POINT结构,成员有x,y等");绘图工具(1)绘图工具(1)设备文本类(CDC)提供绘图工具,例如CPen、CBrush与CFont等,基类是CGdiObject
默认的画笔是黑色,宽度是一个像素,默认的画刷是白色
颜色由RGB值来指定
RGB(Red,Green,Blue)
0x 00 FF FF FF
B G R绘图工具(2)绘图工具(2)库存画刷的类型绘图工具(3)绘图工具(3)SelectStockObject的例子pDC->SelectStockObject(BLACK_PEN);
pDC->MoveTo(10,100);
pDC->LineTo(550,100);
pDC->SelectStockObject(LTGRAY_BRUSH);
pDC->Ellipse(50,50,150,150);
pDC->SelectStockObject(DKGRAY_BRUSH);
pDC->Ellipse(200,50,350,150);
pDC->SelectStockObject(NULL_BRUSH);
pDC->Rectangle(400,50,500,150);自定义画笔(1)自定义画笔(1)单步构造方法
两步构造方法
画笔风格是实线,宽度是5,颜色是蓝色CPen NewPen(PS_SOLID,5,RGB(0,0,255));CPen NewPen;
NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255));自定义画笔(2)自定义画笔(2)库存画笔的类型(除实线外,宽度为1)自定义画笔(3)自定义画笔(3)自定义画笔的例子CPen NewPen;
CPen *pOldPen;
NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255));
pOldPen=pDC->SelectObject(&NewPen);
pDC->Ellipse(150,100,300,200);
pDC->MoveTo(100,200);
pDC->LineTo(350,200);
pDC->SelectObject(pOldPen); 自定义画笔(4)自定义画笔(4)自定义画刷(1)自定义画刷(1)实心(solid)风格
CreateSolidBrush(COLORREF crColor);
网格(hatched)风格
CreateHatchBrush(int nIndex,COLORREF crColor);
模式(patterned)风格
CreatePatternBrush(CBitmap *pBitmap);自定义画刷(2)自定义画刷(2)自定义画刷(3)自定义画刷(3)自定义画刷的例子CBrush NewBrush;
CBrush *pOldBrush;
NewBrush.CreateHatchBrush(HS_CROSS,RGB(0,0,255));
pOldBrush=pDC->SelectObject(&NewBrush);
pDC->Rectangle(100,100,200,200);
pDC->SelectObject(pOldBrush);自定义画刷(4)自定义画刷(4)绘图函数(1)绘图函数(1)绘图函数的坐标是逻辑单位。默认的左上角坐标为(0,0),逻辑单位为像素
绘图函数
设置像素(SetPixel)、当前位置(Moveto)、画直线(Lineto)、画弧线(Arc)、画矩形(Rectangle)、画椭圆(Ellipse)、画饼图(Pie)、画多边型(Polygon)绘图函数(2)绘图函数(2)圆角矩形
弧线pDC->Rectangle(100,100,300,200);
pDC->MoveTo(200,150); pDC->LineTo(300,175);
pDC->MoveTo(200,150); pDC->LineTo(125,100);
pDC->Arc(100,100,300,200,300,175,125,100);pDC->Rectangle(100,100,300,200);
pDC->RoundRect(100,100,300,200,50,40);绘图函数(3)绘图函数(3)饼图
多边形pDC->Rectangle(100,100,300,200);
pDC->Pie(100,100,300,200,300,100,100,100);CPoint point[4];
point[0].x=100; point[0].y=100;
point[1].x=200; point[1].y=200;
point[2].x=200; point[2].y=100;
point[3].x=100; point[3].y=200;
pDC->Polygon(point,4);绘图函数(4)绘图函数(4)用点线画矩形边框(DrawFocusRect)
用画刷填充矩形,不画边框(FillRect)pDC->DrawFocusRect(CRect(100,100,200,200));CBrush NewBrush;
NewBrush.CreateSolidBrush(RGB(0,0,255));
pDC->SelectObject(&NewBrush);
pDC->FillRect(CRect(100,100,200,200), &NewBrush);绘图函数(5)绘图函数(5)用画刷画矩形边框,不填充内部(FrameRect)CBrush NewBrush;
CBrush *pOldBrush;
NewBrush.CreateSolidBrush(RGB(0,0,255));
pOldBrush=pDC->SelectObject(&NewBrush);
pDC->FrameRect(CRect(100,100,200,200), &NewBrush);
pDC->SelectObject(pOldBrush);绘图函数(6)绘图函数(6)在矩形区域中反显颜色(InvertRect)CPen NewPen;
CPen *pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
pOldPen=pDC->SelectObject(&NewPen);
pDC->MoveTo(100,100);
pDC->LineTo(200,200);
pDC->SelectObject(pOldPen);
pDC->InvertRect(CRect(100,100,200,200));绘图模式(1)绘图模式(1)绘图模式指定画笔颜色和现有颜色的处理
SetROP2(int nDrawMode)
绘图模式
R2_COPYPEN(画笔颜色)
R2_NOT(画笔颜色取反)
R2_XORPEN(显示颜色与画笔颜色异或)绘图模式(2)绘图模式(2)R2_NOT的例子
蓝色(0x00FF0000)反色为黄色(0x0000FFFF)
白色(0x00FFFFFF)反色为黑色(0x00000000)
在CTestView::OnDraw()中CBrush NewBrush;
CBrush *pOldBrush;
NewBrush.CreateSolidBrush(RGB(0,0,255));
pOldBrush=pDC->SelectObject(&NewBrush);
pDC->Rectangle(100,100,300,200);
pDC->SelectObject(pOldBrush);绘图模式(3)绘图模式(3)在CTestView::OnLButtonDown()中CDC *pDC=GetDC();
CPen NewPen;
CPen *pOldPen;
NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255));
pOldPen=pDC->SelectObject(&NewPen);
pDC->SetROP2(R2_NOT);
pDC->MoveTo(50,150); pDC->LineTo(350,150);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);绘图模式(4)绘图模式(4)绘图模式(5)绘图模式(5)R2_XORPEN的例子
0x00FF0000^0x00FF0000=0x00000000
0x00FFFFFF^0x00FF0000=0x0000FFFF
在CTestView::OnDraw()中CBrush NewBrush;
CBrush *pOldBrush;
NewBrush.CreateSolidBrush(RGB(0,0,255));
pOldBrush=pDC->SelectObject(&NewBrush);
pDC->Rectangle(100,100,300,200);
pDC->SelectObject(pOldBrush);绘图模式(6)绘图模式(6)在CTestView::OnLButtonDown()中CDC *pDC=GetDC();
CPen NewPen;
CPen *pOldPen;
NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255));
pOldPen=pDC->SelectObject(&NewPen);
pDC->SetROP2(R2_XORPEN);
pDC->MoveTo(50,150); pDC->LineTo(350,150);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);绘图模式(7)绘图模式(7)CRgn与区域(1)CRgn与区域(1)设置区域保证绘图时不超过给定范围
MFC的CRgn封装区域,其成员函数有:
CreateRectRgn、CreateEllipseRgn、CreatePolygonRgn等
CombineRgn用于将新的区域合并
CDC的FillClipRgn或PaintRgnyong填充区域,SelectClipRgn设置剪裁区域,SelectObject将区域选入设备文本CRgn与区域(2)CRgn与区域(2)在CTestView::OnDraw()中pDC->DrawFocusRect(CRect(10,10,200,200));
CRgn rgn;
rgn.CreateRectRgn(10,10,200,200);
pDC->SelectObject(rgn);
pDC->MoveTo(0,50);
pDC->LineTo(300,50);
pDC->MoveTo(50,0);
pDC->LineTo(50,300);CRgn与区域(3)CRgn与区域(3)映射模式(1)映射模式(1)在视图窗口绘制图形时,给定的坐标为逻辑坐标,视图对象的实际坐标为设备坐标
绘图函数的坐标是逻辑坐标,鼠标消息处理函数的坐标是设备坐标
映射模式定义逻辑坐标与设备坐标单位的关系
约束映射模式:比例因子固定
非约束映射模式:由矩形区域推导出比例因子及轴向映射模式(2)映射模式(2)CDC的SetMapMode用于设置映射模式
LPtoDP:逻辑坐标转为设备坐标
DPtoLP:设备坐标转为逻辑坐标
MM_TEXT:默认映射模式,每个单位映射为一个像素,X轴向右、Y轴向下
MM_HIENGLISH:每个单位映射成0.001英寸,X轴向右、Y轴向上映射模式(3)映射模式(3)MM_TEXT与MM_HIENGLISH的区别pDC->SetMapMode(MM_TEXT);
CRect rect;
GetClientRect(&rect);
int x=rect.right/2; int y=rect.bottom/2;
pDC->SetViewportOrg(x,y);
pDC->MoveTo(-20,0); pDC->LineTo(100,0);
pDC->MoveTo(0,-20); pDC->LineTo(0,100);
CPoint pt(100,100); int r=50;
pDC->Ellipse(pt.x-r,pt.y-r,pt.x+r,pt.y+r);文本处理(1)文本处理(1)文本输出函数
TextOut:在指定位置输出文本
DrawText:在指定矩形区域输出文本
ExtTextOut:在指定位置输出文本,并使用当前选择字体
TabbedTextOut:在指定位置输出文本,并使用指定的字符间距文本处理(2)文本处理(2)文本属性设置函数
SetBkMode:设置背景模式
SetBkColor:设置背景颜色
SetTextColor:设置文本颜色
SetTextAlign:设置文本对齐方式
SetTextCharacterExtra:设置字符间隔值文本处理(3)文本处理(3)文本属性设置的例子pDC->SetBkMode(OPAQUE);
pDC->SetBkColor(RGB(0,255,255));
pDC->SetTextColor(RGB(0,0,255));
pDC->SetTextAlign(TA_CENTER|TA_BOTTOM);
pDC->SetTextCharacterExtra(10);
pDC->TextOut(100,50,"设置文本属性");
pDC->MoveTo(0,50); pDC->LineTo(200,50);
pDC->MoveTo(100,0); pDC->LineTo(100,100);文本处理(4)文本处理(4)字符属性(1)字符属性(1)字符属性包括:字符大小、行距typedef struct tagTEXTMETRIC
{
LONG tmHeight; //字符高度
LONG tmAscent; //字符上升高度
LONG tmDescent; //字符下降高度
LONG tmExternalLeading; //行间距
……
} TEXTMETRIC;字符属性(2)字符属性(2)tmAscent与tmDescent的含义字符属性(3)字符属性(3)字符属性的例子TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
CString str;
str.Format("字符高度(tmHeight)=%d,行间距(tmExternalLeading)=%d",tm.tmHeight,tm.tmExternalLeading);
pDC->TextOut(50,50,str);字符属性(4)字符属性(4)CString str; CSize sz;
sz=pDC->GetTextExtent("字");
str.Format("字的宽度=%d,高度=%d",sz.cx,sz.cy);
pDC->TextOut(50,50,str);
sz=pDC->GetTextExtent("a");
str.Format("a的宽度=%d,高度=%d",sz.cx,sz.cy);
pDC->TextOut(50,100,str);
sz=pDC->GetTextExtent("m");
str.Format("m的宽度=%d,高度=%d",sz.cx,sz.cy);
pDC->TextOut(50,150,str);
sz=pDC->GetTextExtent("i");
str.Format("i的宽度=%d,高度=%d",sz.cx,sz.cy);
pDC->TextOut(50,200,str);字体操作(1)字体操作(1)库存字体的类型字体操作(2)字体操作(2)库存字体的例子pDC->TextOut(50,50,"DEFAULT字体");
pDC->SelectStockObject(ANSI_FIXED_FONT);
pDC->TextOut(50,100,"ANSI_FIXED_FONT字体");
pDC->SelectStockObject(SYSTEM_FONT);
pDC->TextOut(50,150,"SYSTEM_FONT字体");字体操作(3)字体操作(3)两步构造方法
在LOGFONT结构中定义逻辑字体
调用CreateFontIndirect()函数
单步构造方法
直接调用CreateFont()函数字体操作(4)字体操作(4)LOGFONT lf;
lf.lfHeight=30; //高度为30
lf.lfWidth=0; //默认宽度
lf.lfEscapement=150; //逆时针旋转15度
lf.lfWeight=FW_BOLD; //粗体
lf.lfUnderline=false; //无下划线
lf.lfItalic=false; //非斜体
lf.lfStrikeOut=false; //无删除线
lf.lfCharSet=GB2312_CHARSET; //GB2312字符集
CFont NewFont,*pOldFont;
NewFont.CreateFontIndirect(&lf);
pOldFont=pDC->SelectObject(&NewFont);
pDC->TextOut(100,100,"例子Example");
pDC->SelectObject(pOldFont);位图操作(1)位图操作(1)BMP是与硬件无关的图像格式,采用位映射存储方式,除图像深度可选外,不使用其它压缩
图像深度包括:1位(单色)、4位(16色)、8位(256色)、24位(16M色)
BMP文件结构
文件头:文件类型、大小、起始位置等
信息头:图像大小、压缩方法等
颜色
与位图数据:在24位BMP中,每个像素由BGR表示位图操作(2)位图操作(2)位图用位模式形成图像,MFC提供CBitmap类管理位图,LoadBitmap()从资源装载位图
CDC提供传输图形数据的函数
PatBlt():用选定画刷填充一个矩形
BitBlt():将图像数据输出到指定位置
StetchBlt():与BitBlt()类似,可改变图像数据大小位图操作(3)位图操作(3)画刷参数的类型位图操作(4)位图操作(4)PatBlt的例子CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);
CBrush NewBrush,*pOldBrush;
NewBrush.CreatePatternBrush(&bm);
pOldBrush=pDC->SelectObject(&NewBrush);
RECT rect; GetClientRect(&rect);
pDC->PatBlt(0,0,rect.right,rect.bottom, PATCOPY);
pDC->SelectObject(pOldBrush);
bm.DeleteObject();位图操作(5)位图操作(5)位图操作(6)位图操作(6)BitBlt的例子CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&bm);
BITMAP tmp; bm.GetBitmap(&tmp);
pDC->BitBlt(0,0,tmp.bmWidth,tmp.bmHeight, &MemDC,0,0,SRCCOPY);
bm.DeleteObject();位图操作(7)位图操作(7)StretchBlt的例子CBitmap bm; bm.LoadBitmap(IDB_MYBITMAP);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&bm);
BITMAP tmp; bm.GetBitmap(&tmp);
pDC->StretchBlt(0,0,tmp.bmWidth/2,tmp. bmHeight/2,&MemDC,0,0,tmp.bmWidth,tmp. bmHeight,SRCCOPY);
bm.DeleteObject();位图操作(7)位图操作(7)图标操作(1)图标操作(1)图标(Icon)是一种特殊的位图,其与位图的区别是固定大小
CWinApp提供LoadStandardIcon(),用于加载系统预定义的图标
CWinApp提供LoadIcon(),用于加载图形编辑器创建的图标图标操作(2)图标操作(2)系统预定义的图标图标操作(3)图标操作(3)显示图标的例子HICON hIcon;
hIcon=AfxGetApp()->LoadStandardIcon (IDI_QUESTION);
//hIcon=AfxGetApp()->LoadIcon(IDI_MYICON);
CRect rect;
GetClientRect(&rect);
pDC->DrawIcon((rect.right-GetSystemMetrics (SM_CXICON))/2,(rect.bottom-GetSystemMetrics(SM_CYICON))/2,hIcon);图标操作(4)图标操作(4)光标操作(1)光标操作(1)光标(Cursor)用于显示鼠标操作时,鼠标所在位置与显示形状
CWinApp提供LoadStandardCursor(),用于加载系统预定义的光标
CWinApp提供LoadCursor(),用于加载图形编辑器创建的光标
SetCursor用于设置光标形状光标操作(2)光标操作(2)系统预定义的光标光标操作(3)光标操作(3)在CTestView::OnLButtonDown()中SetCapture();
HCURSOR hCursor;
hCursor=AfxGetApp()->LoadStandardCursor (IDC_CROSS);
//hCursor=AfxGetApp()->LoadCursor (IDC_MYCURSOR);
SetCursor(hCursor);
RECT rect; GetClientRect(&rect);
ClientToScreen(&rect); ClipCursor(&rect);光标操作(4)光标操作(4)在CTestView::OnLButtonUp()中ReleaseCapture();
ClipCursor(NULL);鼠标画线的例子(1)鼠标画线的例子(1)在CTestView类定义中
在CTestView构造函数中private:
int m_Draw;
HCURSOR m_Cursor;
CPoint m_Old, m_Origin;m_Draw=0;
m_Cursor=AfxGetApp()->LoadStandardCursor (IDC_CROSS);鼠标画线的例子(2)鼠标画线的例子(2)在CTestView::OnLButtonDown()中
在CTestView::OnLButtonUp()中m_Old=point; m_Origin=point;
SetCapture(); SetCursor(m_Cursor);
m_Draw=1;
CRect rect; GetClientRect(&rect);
ClientToScreen(&rect); ClipCursor(&rect);m_Draw=0;
ReleaseCapture(); ClipCursor(NULL); }鼠标画线的例子(3)鼠标画线的例子(3)在CTestView::OnMouseMove()中CClientDC dc(this);
dc.SetROP2(R2_NOT);
if(m_Draw==1)
{
dc.MoveTo(m_Origin); dc.LineTo(m_Old);
dc.MoveTo(m_Origin); dc.LineTo(point);
m_Old=point;
}鼠标画线的例子(4)鼠标画线的例子(4)背景与贴图的例子(1)背景与贴图的例子(1)在CTestView类定义中
在CTestView构造函数中private:
CBitmap m_Back;
CBitmap m_Bird0;
CBitmap m_Bird1;m_Back.LoadBitmap(IDB_BACK);
m_Bird0.LoadBitmap(IDB_BIRD0);
m_Bird1.LoadBitmap(IDB_BIRD1);背景与贴图的例子(2)背景与贴图的例子(2)在CMainFrame::PreCreateWindow()中
在CTestView::OnDraw()中CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Back);
pDC->BitBlt(0,0,534,432,&MemDC,0,0,SRCCOPY);cs.cx=534;
cs.cy=432;
cs.style&=~WS_MAXIMIZEBOX;背景与贴图的例子(3)背景与贴图的例子(3)在CTestView::OnLButtonDown()中CDC *pDC=GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&m_Bird0);
pDC->BitBlt(point.x,point.y,point.x+137, point.y+99,&MemDC,0,0,SRCAND);
MemDC.SelectObject(&m_Bird1);
pDC->BitBlt(point.x,point.y,point.x+137, point.y+99,&MemDC,0,0,SRCPAINT);
ReleaseDC(pDC);背景与贴图的例子(4)背景与贴图的例子(4)扇面效果的例子(1)扇面效果的例子(1)在CTestView类中添加数据成员
在CTestView构造函数中初始化
在CTestView::OnLButtonDown中private:
BOOL m_Draw;
CPoint m_Old, m_Origin;m_Draw=false;m_Draw=true;
m_Old=point; m_Origin=point;扇面效果的例子(2)扇面效果的例子(2)在CTestView::OnMouseMove()中
在CTestView::OnLButtonUp()中CClientDC dc(this);
CPen NewPen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&NewPen);
if(m_Draw==true)
{ dc.MoveTo(m_Origin); dc.LineTo(point);
dc.LineTo(m_Old); m_Old=point; }m_Draw=false;扇面效果的例子(3)扇面效果的例子(3)鼠标拖动圆的例子(1)鼠标拖动圆的例子(1)鼠标拖动圆的例子(2)鼠标拖动圆的例子(2)在CTestView类定义中
在CTestView构造函数中private:
CRect m_Ellipse;
CPoint m_MousePos;
bool m_Capture;m_Ellipse=CRect(0,0,100,100);
m_Capture=false;鼠标拖动圆的例子(3)鼠标拖动圆的例子(3)在CTestView::OnDraw()中
在CTestView::OnLButtonUp()中pDC->SelectStockObject(LTGRAY_BRUSH);
pDC->Ellipse(m_Ellipse);ReleaseCapture();
m_Capture=false;鼠标拖动圆的例子(4)鼠标拖动圆的例子(4)在CTestView::OnLButtonDown()中CRgn circle;
circle.CreateEllipticRgnIndirect(m_Ellipse);
if(circle.PtInRegion(point))
{
SetCapture();
m_Capture=true;
m_MousePos=point;
SetCursor(LoadCursor(NULL,IDC_CROSS));
}鼠标拖动圆的例子(5)鼠标拖动圆的例子(5)在CTestView::OnMouseMove()中CSize offset; offset=point-m_MousePos;
CRect clientRect,tempRect,newRect;
GetClientRect(&clientRect);
if(m_Capture==true)
{ if(clientRect.PtInRect(point))
{ newRect=m_Ellipse+offset;
tempRect.UnionRect(m_Ellipse,newRect);
InvalidateRect(tempRect,true);
m_MousePos=point; m_Ellipse=newRect; }
}鼠标拖动圆的例子(6)鼠标拖动圆的例子(6)第4次作业第4次作业设计一个带动画操作的程序,要求具有以下几种功能:
带快捷选单(Line、Ellipse、Rectangle)
通过点击菜单项输出相应的图形
通过工具栏按钮保存与打开图形
按键盘上的“M”键开始动画操作,使一个位图(自行设计)沿着图形移动谢谢大家谢谢大家