实验6 绘图.docx
- 文档编号:26444512
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:17
- 大小:453.09KB
实验6 绘图.docx
《实验6 绘图.docx》由会员分享,可在线阅读,更多相关《实验6 绘图.docx(17页珍藏版)》请在冰豆网上搜索。
实验6绘图
实验六绘图
一、实验目的
1、掌握在窗口绘图的基本方法;
2、掌握各种绘图工具的使用方法;
3、掌握图形文件在窗口内显示的方法。
二、实验要求
1、创建单文档窗口,当鼠标在窗口中移动并按下左键时画图,左键弹起时停止。
2、用鼠标在屏幕上选择一个区域,(按下左键开始,弹起左键时结束)并在该区域中填充不同的颜色
3、鼠标在窗口内移动时,在屏幕的左上角开辟一个方块显示鼠标位置的显示内容,利用菜单弹出对话窗口输入要显示的大小。
4、在单文档背景中装入位图文件,要求分别显示不同的位图。
三、实验过程
3.1首先创建单文档工程,如下图:
为此单文档工程的菜单添加四个选项分别对应实验六的四部分内容,由菜单选择相应实验内容,添加全局变量intm_drawtype保存所选择的实验内容。
3.2第一部分──鼠标绘图:
3.2.1为实验六View添加成员变量:
BOOLm_bdownup;//保存鼠标是否按下
CPointm_pstart;//鼠标的起始坐标
3.2.2利用ClassWizard为实验六View添加关于鼠标消息的三个成员函数(如右图):
WM_LBUTTONDOWN//左键按下
WM_LBUTTONUP//左键弹起
WM_MOUSEMOVE//鼠标移动
当左键按下同时在窗口内拖动时,用SetCapture()命令捕捉鼠标消息即当鼠标移至用户激活窗口外仍然将鼠标移动消息发至窗口,ReleaseCapture()取消捕捉鼠标消息。
3.2.3选择自定义画笔,格式:
CClientDCdc(this);
CPenhPen(PS_SOLID,5,RGB(0,0,255));
//创建新画笔(实线、宽度5像素、蓝色)
CPen*pOldPen=dc.SelectObject(&hPen);
//保存原始画笔并使用新画笔
在自定义画笔使用完毕后记得恢复原始画笔。
3.2.4在选择好画笔后,就可以开始做图了,MFC提供具有绘图能力的类有:
✓CDC
✓CPaintDC
✓CClientDC
✓CWindowDC
✓CMetaFileDC
其中,CDC是其它DC类的基类,CDC基类定义设备描述表的对象,利用CDC提供的类方法实现全部的图形生成,具体能提供的服务有:
使用绘图工具,管理设备描述表,选择安全类型GDI对象,控制着色和调色板,处理坐标映像和转换,加工多边形和区域,绘制形状,绘制正文,使用不同字体,处理元文件等等。
实验第一部分使用的绘图函数有:
CDC:
:
MoveTo(CPointpoint1);//将当前坐标移至point1
CDC:
:
LineTo(CPointpoint2);
//以当前坐标为起始点,point2为终点画一直线
最终效果为:
第一部分程序如下:
voidOnLButtonDown(UINTnFlags,CPointpoint)
{
m_pstart=point;//保存起始鼠标位置
m_bdownup=TRUE;//开始画图
SetCapture();
CView:
:
OnLButtonDown(nFlags,point);
}
voidOnMouseMove(UINTnFlags,CPointpoint)
{
CClientDCdc(this);
CPenhPen(PS_SOLID,5,RGB(0,0,255));//创建新画笔(实线、宽度5像素、蓝色)
CPen*pOldPen=dc.SelectObject(&hPen);//保存原始画笔并使用新画笔
CDC*pDC=GetDC();
switch(m_drawtype)
{
case1:
if(m_bdownup)
{
dc.MoveTo(m_pstart);
dc.LineTo(point);
m_pstart=point;
}//画图
break;
case3:
pDC->StretchBlt(0,0,m_gbwidth,m_gbheight,pDC,point.x,point.y,10,10,SRCCOPY);//部分显示
break;
default:
break;
}
dc.SelectObject(pOldPen);//恢复原始画笔
ReleaseDC(pDC);
CView:
:
OnMouseMove(nFlags,point);
}
3.3第二部分──颜色填充:
3.3.1首先选择自定义画刷,其方法与选择自定义画笔非常相似:
CBrushNewBrush;
CBrush*OldBrush;
CClientDCdc(this);
NewBrush.CreateSolidBrush(RGB(255,0,0));
//初始化画刷
OldBrush=dc.SelectObject(&NewBrush);
//选择画刷
3.3.2利用选择的自定义画刷填充矩形:
CRectrect(point1,point2);
//需要填充的矩形边界(point1为左上角,point2为右下角)
dc.FillRect(rect,&NewBrush);//给矩形填充颜色
dc.SelectObject(OldBrush);//恢复原始画刷
最终效果为:
第二部分程序如下:
voidOnLButtonUp(UINTnFlags,CPointpoint)
{
m_bdownup=FALSE;//停止画图
if(m_drawtype==2)
{
CBrushNewBrush;
CBrush*OldBrush;
CClientDCdc(this);
CRectrect(m_pstart,point);//矩形边界
NewBrush.CreateSolidBrush(RGB(255,0,0));//初始化画刷
OldBrush=dc.SelectObject(&NewBrush);
dc.FillRect(rect,&NewBrush);//给矩形填充颜色
dc.SelectObject(OldBrush);
}
ReleaseCapture();
CView:
:
OnLButtonUp(nFlags,point);
}
3.4第三部分──部分显示:
3.4.1首先为工程插入一个对话框,对话框包括两个按钮以及两个EditBox,用来调整部分显示的范围大小,如下图:
利用ClassWizard为两个EditBox添加成员变量:
intm_width以及intm_height。
当菜单选择“部分显示”时弹出此对话框,并由用户输入部分显示的范围(起始点为屏幕左上角)。
3.4.2显示鼠标所在位置的内容可利用以下两个函数:
CDC:
:
BitBlt(intx,inty,intnWidth,intnHeight,
CDC*pSrcDC,
intxSrc,intySrc,
DWORDdwRop);
CDC:
:
StretchBlt(intx,inty,
intnWidth,intnHeight,CDC*pSrcDC,
intxSrc,intySrc,
intnSrcWidth,intnSrcHeight,
DWORDdwRop);
这两个函数用法基本相同,具体可查阅MSDN。
最终结果如下:
第三部分程序见第一部分。
3.5第四部分──显示位图:
3.5.1首先装入位图,有以下两种方法:
Ø从应用程序的资源中装入位图
要把位图装入应用程序中进行绘制,用下面的方法(可以用自己的位图ID替代IDB_MY_BITMAP):
CBitmapm_bitmap;
m_bitmap.LoadBitmap(IDB_MY_BITMAP);
Ø从一个bmp文件中装入位图(使用CFileDialog)
CBitmapm_bmp;
CStringfilename;
filename=_T("example.bmp");
HBITMAPhbitmap=(HBITMAP)LoadImage(
NULL,//handleoftheinstancethatcontainstheimage
(LPCTSTR)filename,//nameoridentifierofimage
IMAGE_BITMAP,//typeofimage
//canalsobeIMAGE_CURSORorIMAGE_ICON
0,0,//desiredwidthandheight
LR_LOADFROMFILE);//loadfromfile
m_bmp.Attach(hbitmap);//attachthisbitmapobjectto//ourbitmapclass
上面是一个例子,实际应用时需要修改。
3.5.2显示位图:
Ø在OnDraw(CDC*pDC)中输入显示位图的例子:
CRectrcClient;
GetClientRect(rcClient);
CBitmap*pbmOld;
CBitmapm_bmp;
CDCdcComp;
dcComp.CreateCompatibleDC(pDC);
pbmOld=dcComp.SelectObject(&m_bitmap);
//getsizeofbitmapforBitBlt()
BITMAPbmInfo;
m_bmp.GetObject(sizeof(bmInfo),&bmInfo),
pDC->StretchBlt(0,0,rcClient.right,rcClient.bottom,
&dcComp,
0,0,bmInfo.bmWidth,bmInfo.bmHeight,
SRCCOPY);
dcComp.SelectObject(pbmOld);
dcComp.DeleteDC();
用BitBlt同样可以完成显示位图的操作,最终结果如下:
第四部分程序如下:
voidOnTest6Loadbitmap()
{
//TODO:
Addyourcommandhandlercodehere
m_drawtype=0;
GetMenu()->CheckMenuItem(ID_TEST6_PEN,MF_BYCOMMAND|MF_UNCHECKED);
GetMenu()->CheckMenuItem(ID_TEST6_BRUSH,MF_BYCOMMAND|MF_UNCHECKED);
CStringlpszFilter="位图(*.bmp)|*.bmp|\
全部文件(*.*)|*.*||";
CFileDialogdlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|
OFN_ALLOWMULTISELECT,lpszFilter,NULL);
CBitmapbitmap;
if(dlg.DoModal()==IDOK){
HBITMAPhbmp=(HBITMAP)LoadImage(
NULL,
dlg.GetPathName(),
IMAGE_BITMAP,
0,0,
LR_LOADFROMFILE);//将选择好的bmp文件装入hbmp
bitmap.Attach(hbmp);
}
elsereturn;
CDC*pDC=GetDC();//得到当前DC
CDCdcComp;
dcComp.CreateCompatibleDC(pDC);//创建兼容DC
dcComp.SelectObject(&bitmap);//位图文件装入兼容DC
BITMAPbminfo;
bitmap.GetObject(sizeof(bminfo),&bminfo);
pDC->BitBlt(100,100,
bminfo.bmWidth,bminfo.bmHeight,
&dcComp,
0,0,
SRCCOPY);//将bmp文件从兼容DC复制到当前DC
}
四、思考题
1、当窗口大小改变或被其他窗口覆盖时,窗口内的图像即被重画,如何避免这种情况的发生?
五、技术支持
MFC提供具有绘图能力的类有:
∙CDC
∙CPaintDC
∙CClientDC
∙CWindowDC
∙CMetaFileDC
其中,CDC是其它DC类的基类,CDC基类定义设备描述表的对象,利用CDC提供的类方法实现全部的图形生成,具体能提供的服务有:
使用绘图工具,管理设备描述表,选择安全类型GDI对象,控制着色和调色板,处理坐标映像和转换,加工多边形和区域,绘制形状,绘制正文,使用不同字体,处理元文件等等。
屏幕
创建一个屏幕设备环境,可以用:
CDC*pDC=GetDC();
这里的GetDC()是CWnd类的成员函数,它返回一个允许用户绘制它的窗口客户区的设备环境;如果还希望绘制非客户区,则使用:
CDC*pDC=GetWindowDC();如果需要绘制整个屏幕,如编写一个屏幕保护程序或游戏程序时,可能需要对整屏进行绘制,这时使用:
CDC*pDC=CDC:
:
FromHandle(:
:
GetDC(NULL));
屏幕设备环境来自三种资源之一:
私有设备环境、类设备环境和通用设备环境。
创建一个设备环境
1)如果处理一个WM_PAINT消息或其他类似的消息,则可以提供一个设备环境,如果没有提供,则必须自己创建一个;如果要绘制一个屏幕,可以用下面的代码创建一个设备环境,这里的pWnd是CWnd类的实例的指针。
该类的实例应该拥有需要绘制的窗口。
CDC*pDC=pWnd->GetDC();
2)如果创建了一个自己的设备环境,用完后必须销毁它;销毁一个设备环境,用:
pWnd->ReleaseDC(pDC);
即上述步骤1)和2)必须配对使用,否则会发生内存泄漏,称为资源泄漏。
绘图方法和例程
CDC类封装了全部Windows图形API,这些成员函数包括:
■画点的函数。
■画线的函数。
■画形状的函数。
■填充和翻转形状的函数。
■滚动屏幕的函数。
■绘制文本的函数。
■绘制位图和图标的函数。
与绘图相关的MFC类
MFC中CDC类封装了WindowsAPI中用来画图的函数。
由其派生的几个类并提供了一些额外功能。
CClientDC用来方便地创建和破坏一个设备环境。
它的构造函数通过调用CDC:
:
GetDC()为窗口的客户区创建一个设备环境。
当例程返回时,CClientDC的析构函数通过调用CDC:
ReleaseDC()销毁该设备。
既不麻烦也不复杂,更不会因忘记释放设备环境而导致资源泄漏。
CWindowDC类维护窗口的非客户区,如CClientDC维护客户区一样。
CPaintDC在被构造以获得设备环境时调用CWnd:
:
BeginPaint()。
在这种情况下,设备环境只允许在已被无效化的窗口客户区绘图,而不能在整个客户区绘图。
析构时,CPaintDC类调用CWnd:
:
EndPaint()。
CMetaFileDC创建一个Microsoft元文件,元文件是一个磁盘文件,它包含绘制一幅图形时所必需的全部绘图行为和模型。
可以通过打开一个元文件设备环境创建一个元文件,然后用画图工具对它进行绘制,就当它是一个屏幕或打印机设备一样。
产生的文件可以在未来的某个时刻被再次读进,以创建其他设备之一的图像。
MFC封装的图形对象
CGdiObject类为不同Windows图形设备界面(GDI)对象提供了基类。
图形对象目的
CBitmap内存中的位图
CBrush画刷特性—填充某个图形时所使用的颜色和模式
voidCDrawView:
:
onDraw(CDC*pDC)
{
CBrushbrush(HS_CROSS,RGB(255,0,0));//定义并初始化一个画刷实例
CBrush*poIdBrush=pDC->SelectObject(&brush);//将画刷选入绘图对象
…//省略以下的绘制操作
pDC->SelectObject(pOldBrush);//恢复原来的画刷
}
CFont字体特性—写文本时所使用的字体
字体的使用:
voidCDrawView:
:
OnDraw(CDC*pDC)
{
CFontfont;//定义一个CFont类的对象//用各种参数建立字体
font.CreateFont(30,15,0,0,200,0,0,0,255,0,0,2,DEFAULT_PITCH,”VC”);
CFont*pOldFont=pDC->SelectObject(&font);//将字体选入绘图对象
……//省略进行文本绘制的部分
pDC->SelectObject(pOldFont);//将字体选出绘图对象
}
CPalette调色板颜色
CPen画笔特性—画轮廓时所使用的线的粗细
voidCDrawView:
:
OnDraw(CDC*pDC)
{
CPenpen(PS_SOLID,1,RGB(255,0,0));//定义并初始化一个画笔实力
CPen*pOldPen=pDC->SelectObject(&pen);//将画笔选入绘画对象
……//省略各种绘制操作代码
pDC->SelectObject(pOldPen);
};
在CClientDC、CWindowDC等其他绘图类中引用CPen对象的方法与以上类似。
CRgn区域特性—包括定义它的点
CRgn类封装了区域的种种特性和操作,它是窗口中的椭圆或多边形范围的组合,可被用来进行填充、反显、移动、判定某点是否在区域等操作
CRgn类的构造函数只有一个,定义一个CRgn类的对象后,对象并不能直接被使用,必须调用一个创建函数对对象进行初始化以后才能被使用。
①函数CreateRectRgn和CreateRectRgnIndirect创建一矩形区域,完整定义如下:
BOOLCreateRectRgn(intx1,inty1,intx2,inty2);
BOOLCreateRectRgnIndirect(LPCRECTlpRect);
②函数CreateEllipticRgn和CreateEllipticRgnIndirect创建一椭圆形区域,这两个函数的完整定义为:
BOOLCreateEllipticRgn(intx1,inty1,intx2,inty2);
BOOLCreateEllipticRgnIndirect(LPCRECTlpRect);
③函数CreatePoIygonRgn创建一多边形区域,函数的完整定义为:
BOOLCreatePoIygonRgn(LPPOINTlpPoints,intnCount,intnMode);
④函数CreatePolyPolygonRgn创建一系列多边形区域,函数的完整定义为:
BOOLCreatePolyPolygonRgn(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount,intnPolyFillMode)
CRgn对象的删除
一个CRgn类的构造函数并没有进行对象的初始化工作,必须通过上述的一些函数将其初始化。
同样,CRgn的析构函数不能删除初始化后的CRgn对象,需要调用其基类的函数DeleteObject删除定义的CRgn对象。
方法是:
myRgn.DeleteObject();//删除定义的myRgn对象
各图形操作对象类的使用方法查考MFC的帮助
利用MFC的CDC类绘制控件和视图,包括:
■Windows和MFC支持的绘图工具类型。
■Windows和MFC支持的绘图模式和特性。
■两种存储为将来显示用的绘图命令的方法:
元文件(Metafile)和路径(Path)。
■怎样在抖动色(ditheredcolor)和未经抖动色(nonditheredcolor)中绘图。
■什么时候Windows绘制它的窗口。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验6 绘图 实验