版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第13章单文档窗体,13.1文档/视图结构13.2文字与图形输出13.3菜单设计13.4工具条设计13.5鼠标和键盘消息处理13.6定时器,13.1文档/视图结构,文档:用于管理应用程序的数据视图:用户界面,用于显示、打印文档中的数据管理与用户的交互。数据的管理与显示分离的思想简化了开发过程文档/视图结构应用程序:SDI-SingleDocumentInterface单文档界面MDI-MultipleDocumentInterface多文档界面,13.2文字与图形输出,13.2.1文字与图形的基本输出【例13.1】在窗口中显示一个矩形框,框中显示“同舟共济自强不息”,工程名为TEST1,1.生
2、成SDI应用程序框架2.在CTESTDoc类中添加数据成员:public:CRectr;CStrings;3.在文档类中对数据成员初始化,BOOLCTESTDoc:OnNewDocument()if(!CDocument:OnNewDocument()returnFALSE;/TODO:addreinitializationcodehere/(SDIdocumentswillreusethisdocument)r=CRect(100,60,260,100);s=同舟共济自强不息;returnTRUE;,4.在CTESTView类的OnDraw()函数添加代码:voidCTESTView:OnD
3、raw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherepDC-Rectangle(pDoc-r);pDC-TextOut(110,70,pDoc-s);,说明:(1)ClassView有5个类和1个全局对象:CAboutDlg类:about对话框类,由CDialog派生。CMainFrame类:窗口框架类,由CFrameWnd派生CTESTApp类:应用程序类,由CWinApp派生CTESTDoc类:文档类,由CDocument派生CTESTView类:视图类,由
4、CView派生theApp全局对象(2)CRect描述一个矩形,有4个数据成员:left、top、right和bottom。(3)GetDocument()返回值指向当前文档的指针。示例:CTESTDoc*pDoc=GetDocument();作用:让pDoc指向当前文档,(4)输出在OnDraw()中完成pDC指向窗口中央的客户区对象voidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();/获得指向文档类对象的指针ASSERT_VALID(pDoc);/检查pDoc是否有效,若无效结束程序/TODO:adddrawcodefornat
5、ivedatahere(5)OnDraw()的调用自动调用:当窗口发生变化时手工调用:调用Invalidate()和InvalidateRect()函数时Invalidate(TRUE)/擦除窗口原有的内容,重新绘制。Invalidate(FALSE)/窗口原有的内容保留,再进行绘制。InvalidateRect(矩形,TRUE)/重新绘制这个矩形区域。InvalidateRect(矩形,FALSE)/原有内容保留,再绘制矩形区域。,(1)文字输出BOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);(2)画点COLORREFSetPixel(i
6、ntx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);说明:例如:COLORREFC1=RGB(0,0,0)/合成黑色COLORREFC2=RGB(255,0,0)/合成红色COLORREFC3=RGB(255,255,0)/合成黄色COLORREFC4=RGB(255,255,255)/合成白色POINT:MFC的结构类型,表示平面上的一个点,数据成员是x和yCOLORREF:32位整数类型,表示颜色,文字与图形输出的基本函数:,(3)画线起点:CPointMoveTo(intx,inty);CPoint
7、MoveTo(POINTpoint);终点:BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);(4)画矩形BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);(5)画椭圆BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);(6)获取客户区的大小voidGetClientRect(LPRECTlpRect)const;,【例13.2】改变窗口时,矩形框和文字总是显示在窗口的中央,voidCTESTV
8、iew:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCRecta,b;intw=160;inth=40;GetClientRect(,【例13.3】绘制-22之间的sin曲线。,在TEST.CPP中添加命令:#includemath.hvoidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahe
9、reCRectrect;GetClientRect(rect);intx0=rect.Width()/2;inty0=rect.Height()/2;pDC-MoveTo(20,y0);pDC-LineTo(rect.Width()-20,y0);pDC-MoveTo(x0,20);pDC-LineTo(x0,rect.Height()-20);doublestep=3.14159/100;for(inti=-200;iSetPixel(x0+(i/300.0)*rect.Width()/2,y0-sin(step*i)*rect.Height()/4,RGB(255,0,0);,13.2.2
10、画笔和画刷,1.自定义画笔CPen是MFC中的一个类它的对象代表一支笔,并提供了函数示例代码/定义画笔pen和指向画笔的指针oldpenCPenpen,*oldpen;/创建一支红色能画实线3号粗细的画笔pen.CreatePen(PS_SOLID,3,RGB(255,0,0);/选用新的画笔pen,让oldpen指向旧的画笔oldpen=pDC-SelectObject(,(1)创建画笔函数BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);nPenStyle:样式nWidth线:宽度crColor:颜色。,(2)SelectObjec
11、t()CDC类的成员函数,选择对象(选择设备)/选用新的画笔CPen*SelectObject(CPen*pPen);/选用新的画刷CBrush*SelectObject(CBrush*pBrush);/选用新的字体virtualCFont*SelectObject(CFont*pFont);CBitmap*SelectObject(CBitmap*pBitmap);/选用新的位图注意:参数是指针,返回值也是指针,2.自定义画刷CBrush是MFC中的一个类代表一个画刷,并提供函数示例代码:/定义画刷对象brushCBrushbrush;/构造绿色十字线风格的画刷brush.CreateHat
12、chBrush(HS_CROSS,RGB(0,255,0);/选择一个新的画刷pDC-SelectObject(,(1)CreateHatchBrush创建画刷BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);nIndex:阴影风格crColor:颜色。,(2)CreateSolidBrush()创建画刷BOOLCreateSolidBrush(COLORREFcrColor);,【例13.4】输出图形voidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc
13、);CPenpen,*oldpen;pen.CreatePen(PS_SOLID,3,RGB(255,0,0);oldpen=pDC-SelectObject(,13.2.3位图,CBitmap是MFC中的一个类它的对象可装载一幅图,并提供函数【例13.5】显示SoapBubbles.bmp(1)导入位图(2)装载位图(3)读取位图信息(4)构造内存设备环境,并将位图装入该设备环境(5)将位图从内存设备环境复制到真正的设备环境中,(1)导入位图把位图文件作为资源导入到应用程序选择“插入|资源”命令注意其ID:IDB_BITMAP1(2)装载位图把位图资源装载到CBitmap对象CBitmapb
14、;b.LoadBitmap(IDB_BITMAP1);(3)读取位图信息BITMAPbm;b.GetBitmap(,(4)构造内存设备环境,并将位图装入该设备环境CDCm;m.CreateCompatibleDC(NULL);m.SelectObject(x,y):位图显示区域左上角的坐标nWidth和nHeight:显示区域的宽度和高度pSrcDC:指向内存设备环境(xSrc,ySrc)为原图欲显示区域左上角的坐标dwRop:复制方式,常用值为SRCCOPY,StretchBlt(),区别:可以缩放BOOLStretchBlt(intx,inty,intnWidth,intnHeight,C
15、DC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);nSrcWidt、nSrcHeight:欲显示的原图的区域大小,voidCMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCBitmapb;b.LoadBitmap(IDB_BITMAP1);BITMAPbm;b.GetBitmap(,13.3菜单,菜单的实现步骤,利用AppWizard生成程序框架(MenuTes
16、t)编辑资源加入菜单消息处理函数菜单命令的更新控制,4.1,步骤1生成程序框架(MenuTest),项目名称:MenuTest选择单文档界面应用程序(Singledocument),4.1,步骤2编辑资源,编辑菜单资源画图Pop-up选中CaptionIDPrompt矩形ID_DRAW_RECT在视中画矩形椭圆ID_DRAW_CIRCLE在视中画椭圆,4.1,步骤3加入菜单消息处理函数,ClassNameObjectsIDsMessagesCTEST6ViewID_DRAW_RECTCOMMANDCTEST6ViewID_DRAW_CIRCLECOMMAND,4.1,voidCTEST6Vie
17、w:OnDrawRect()CClientDCdc(this);dc.Rectangle(50,50,200,150);,voidCTEST6View:OnDrawCircle()CClientDCdc(this);dc.Ellipse(250,50,400,150);,13.4工具条,4.4,返回第4章,程序的实现步骤,编辑工具条资源创建工具条在工具条上添加控件加入控件响应函数,步骤1编辑工具条资源,添加工具条(IDR_MYTOOLBAR):,4.4,ID_DRAW_RECT,ID_DRAW_CIRCLE,ID_DRAW_LINE,ID_COMBOBOX,工具条含四个工具按扭,其中前两个与菜
18、单“画图”的前两个菜单项的ID号相同,第三个按扭用于画直线,第四个按扭用来显示组合框。,步骤2创建工具条,在类CMainFrame中定义工具条数据成员:CToolBarm_wndMyToolBar;在类CMainFrame的OnCreate函数中加入以下代码:,4.4,if(!m_wndMyToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndMyToolBar.LoadToolBar(IDR_M
19、YTOOLBAR)TRACE0(Failedtocreatetoolbarn);return-1;/failtocreate.m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(,步骤2创建工具条,3.添加画线响应函数,4.4,voidCMenuTestView:OnDrawLine()/TODO:AddyourcommandhandlercodehereCClientDCdc(this);dc.MoveTo(20,20);dc.LineTo(200,200);,步骤
20、3在工具条上添加控件,在类CMainFrame中定义数据成员CComboBoxm_ComboBox;2.在CMainFrame的OnCreate函数中加入代码,4.4,CRectrect;m_wndMyToolBar.SetButtonInfo(3,ID_COMBOBOX,TBBS_SEPARATOR,160);m_wndMyToolBar.GetItemRect(3,13.5鼠标和键盘消息处理,1.鼠标消息WM_LBUTTONDOWN按下鼠标左键WM_LBUTTONUP释放鼠标左键WM_LBUTTONDBLCLK双击鼠标左键WM_RBUTTONDOWN按下鼠标右键WM_RBUTTONUP释放
21、鼠标右键WM_RBUTTONDBLCLK双击鼠标右键WM_MOUSEMOVE鼠标移动voidCTest1View:OnLButtonDown(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultCView:OnLButtonDown(nFlags,point);,nFlags:包含Shift、Ctrl和Alt键的状态信息point:当前鼠标指针位置例如:在(100,200)处单击时,point.x和point.y的值分别为100和200。,【例8.7】显示鼠标指针的位置(1)在文档类中添加数据成员
22、。public:CPointa;/存放鼠标指针位置(2)在OnNewDocument()中进行如下的初始化。a=CPoint(-1,-1);/程序开始运行时显示(-1,-1)(3)视图键盘消息处理函数中把鼠标单击的位置把鼠标单击的位置存放在文档类的a中。voidCTESTView:OnLButtonDown(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultCTESTDoc*pDoc=GetDocument();pDoc-a=point;Invalidate();CView:OnLButtonD
23、own(nFlags,point);,(4)OnDraw()函数在OnDraw()函数中输出鼠标单击的位置。voidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCStrings;s.Format(x=%d,y=%d,pDoc-a.x,pDoc-a.y);pDC-TextOut(10,10,s);,【例8.8】按右键画圆,按左键移动画线(1)在文档类中添加数据成员。public:CPointc1,c2;intf1,f2;(2)在O
24、nNewDocument()中进行如下的初始化。f1=0;f2=0;(3)/按下左键画线开始,文档类的f1赋值1,c1记录当前鼠标位置voidCTESTView:OnLButtonDown(UINTnFlags,CPointpoint)CTESTDoc*p=GetDocument();p-c1=point;p-f1=1;/Invalidate(FALSE);CView:OnLButtonDown(nFlags,point);,/移动鼠标时根据f1的值判断当前位置是否处于画线状态,/如果处于画线状态,则f2赋值1,并把鼠标当前位置记录在c2中。voidCTESTView:OnMouseMove(
25、UINTnFlags,CPointpoint)CTESTDoc*p=GetDocument();if(p-f1=1)p-f2=1;p-c2=point;Invalidate(FALSE);CView:OnMouseMove(nFlags,point);/释放左键画线结束,文档类f1和f2赋值0。voidCTESTView:OnLButtonUp(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultCTESTDoc*p=GetDocument();p-f2=0;p-f1=0;CView:OnLBut
26、tonUp(nFlags,point);,/OnRButtonDown()将以单击处为圆心半径为30的圆的数据存放到文档类的r中voidCTESTView:OnRButtonUp(UINTnFlags,CPointpoint)CTESTDoc*p=GetDocument();intradius;radius=30;p-r=CRect(point.x-radius,point.y-radius,point.x+radius,point.y+radius);Invalidate(FALSE);CView:OnRButtonDown(nFlags,point);/OnDraw()函数绘制图形void
27、CTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(pDoc-f2=1)pDC-MoveTo(pDoc-c1);pDC-LineTo(pDoc-c2);pDoc-c1=pDoc-c2;pDC-Ellipse(pDoc-r);,13.5鼠标和键盘消息处理,2.键盘消息WM_KeyDown按下键WM_KeyUp释放键voidCTESTView:OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)/TODO:Addyourmessagehandlercodeherean
28、d/orcalldefaultCView:OnKeyDown(nChar,nRepCnt,nFlags);,nChar:键代码nRepCnt:为按键的重复次数nFlags:扫描码、转换键码和按键组合状态,8.5对话框通用对话框自定义对话框,1.文件对话框,CFileDialog(BOOLbOpenFileDialog,LPCTSTRlpszDefExt=NULL,LPCTSTRlpszFileName=NULL,DWORDdwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,LPCTSTRlpszFilter=NULL,CWnd*pParentWnd=NUL
29、L);说明:若bOpenFileDialog为TRUE,则显示打开对话框,否则显示另存为对话框。lpszDefExt指定缺省的扩展名。lpszFileName指定缺省的文件名。lpszFilter用于指明可供选择的文件类型和相应的扩展名。它的属性值是由一组元素或用“|”符号分开的分别表示不同类型文件的多组元素组成。例如,若要在打开文件类型列表框时显示如图1.8.10所示的三种文件类型供用户选择,则Filter属性应设为:Documents(*.DOC)|*.DOC|TextFiles(*.TXT)|*.txt|AllFiles|*.*,2DoModal()函数:打开打话框对象.DoModal(
30、)3GetPathName()GetPathName()用于获取用户选择的包括路径在内的文件名CStringGetPathName()const;4GetFileName()GetFileName()用于获取用户选择的文件名,不包括路径CStringGetPathName()const;,(4)在OnDraw()函数中,显示位图。voidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereif(pDoc-filename!=)HBITM
31、APhbitmap;hbitmap=(HBITMAP)LoadImage(NULL,pDoc-filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);CDCm;CRectrect;m.CreateCompatibleDC(pDC);GetClientRect(rect);m.SelectObject(hbitmap);pDC-BitBlt(20,20,rect.Width()-20,rect.Height()-20,说明:加载磁盘上的一个.bmp文件应使用LoadImage()。其函数原型为:HANDLELoadImage(HINSTANCEhinst,LPCTS
32、TRlpszName,UINTuType,intcxDesired,intcyDesired,UINTfuLoad);其中:hinst可以用NULL,lpszName是图象在磁盘上的文件名,uType表示图象的类型,fuLoad的值为LR_LOADFROMFILE表示从文件中导入位图。,【例8.18】从对话框输入两个点,在客户区线段(1)界面设计“输入数据”ID为ID_INPUTpublic:CStringfilename;(2)在OnNewDocument()中进行如下的初始化。filename=;(3)/按下左键画线开始,文档类的f1赋值1,c1记录当前鼠标位置voidCTESTView:
33、OnLButtonDown(UINTnFlags,CPointpoint)CTESTDoc*pDoc=GetDocument();CFileDialogdlg(TRUE,NULL,NULL,NULL,BMPFiles(*.BMP)|*.BMP|);if(dlg.DoModal()=IDOK)pDoc-filename=dlg.GetPathName();Invalidate();CView:OnLButtonDown(nFlags,point);,(4)在OnDraw()函数中,显示位图。voidCTESTView:OnDraw(CDC*pDC)CTESTDoc*pDoc=GetDocumen
34、t();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereif(pDoc-filename!=)HBITMAPhbitmap;hbitmap=(HBITMAP)LoadImage(NULL,pDoc-filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);CDCm;CRectrect;m.CreateCompatibleDC(pDC);GetClientRect(rect);m.SelectObject(hbitmap);pDC-BitBlt(20,20,rect.Width()-20,rect.Height
35、()-20,说明:加载磁盘上的一个.bmp文件应使用LoadImage()。其函数原型为:HANDLELoadImage(HINSTANCEhinst,LPCTSTRlpszName,UINTuType,intcxDesired,intcyDesired,UINTfuLoad);其中:hinst可以用NULL,lpszName是图象在磁盘上的文件名,uType表示图象的类型,fuLoad的值为LR_LOADFROMFILE表示从文件中导入位图。,【例8.14】图形浏览程序【8.14】利用AppWizard创建类似Windows记事本的文本编辑器。(1)在文档类中添加数据成员public:CSt
36、ringfilename;(2)在OnNewDocument()中进行如下的初始化。filename=;(3)/按下左键画线开始,文档类的f1赋值1,c1记录当前鼠标位置voidCTESTView:OnLButtonDown(UINTnFlags,CPointpoint)CTESTDoc*pDoc=GetDocument();CFileDialogdlg(TRUE,NULL,NULL,NULL,BMPFiles(*.BMP)|*.BMP|);if(dlg.DoModal()=IDOK)pDoc-filename=dlg.GetPathName();Invalidate();CView:OnLB
37、uttonDown(nFlags,point);,步骤4菜单命令的更新控制,4.1,voidCMenuTestView:OnDrawDisable()m_Enable=FALSE;,voidCMenuTestView:OnDrawEnable()m_Enable=TRUE;,voidCMenuTestView:OnUpdateDrawEnable(CCmdUI*pCmdUI)pCmdUI-SetCheck(m_Enable?1:0);,voidCMenuTestView:OnUpdateDrawDisable(CCmdUI*pCmdUI)pCmdUI-SetCheck(m_Enable?0:1);,步骤4菜单命令的更新控制,1.在画图菜单中再添加两个菜单项CaptionIDPrompt允许画矩形ID_DRAW_ENABLE-禁止画矩形ID_DRAW_DISABLE-在视类中添加一个记录当前“矩形”菜单项状态的变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省国土整治中心关于2026年考核招聘专业技术人员的备考题库附答案详解(预热题)
- 2026年财产保全申请与担保操作实务
- 2026年离心机日常维护与故障处理
- 2026年宠物智能摄像头细分市场机会
- 2026年社区网格员结核病防治知识培训
- 2026年通信工程施工安全晨会交底
- 2026年跨校家长学校建设与家校共育经验交流
- 2026年四白穴改善视力与面部美容
- 2026湖南高速物业发展有限公司招聘职业技能工作岗(以完成一定任务为期限员工)笔试历年参考题库附带答案详解
- 2026湖北省新能源有限公司社会招聘1人笔试历年参考题库附带答案详解
- GB/T 18302-2026国旗升挂装置基本要求
- 第13课摔跤(课件)
- 输送线培训教学课件
- 自制挖掘机培训课件大全
- 企业董事长助理岗位职责书
- 民兵军事训练教案
- 教师形体与礼仪(成都师范学院)知到智慧树网课答案
- 2025年黑龙江省公安辅警招聘知识考试题(含答案)
- 打叶复烤设备操作工职业考核试卷及答案
- 矿山工程质量监理评估报告范文
- 《数字图像与视频处理》课件-第8章 数字水印技术
评论
0/150
提交评论