1、第四讲 基于文档视图的应用程序设计5/22/20241内容提要nVC的集成开发环境简介n消息映射的基本原理n菜单,工具栏,快捷键及其消息映射5/22/20242VC的的编编程程环环境境简简介介5/22/20243使用应用程序向导n生成基于文档视图的应用程序n生成基于对话框的应用程序5/22/202445/22/20245Developer Studio操作界面(开发)n标题栏n菜单栏n工具栏n状态栏n项目工作区:qClassViewqResourceViewqFileViewn编辑区n输出框5/22/20246n创建项目工作区时,将创建:q一个项目工作区目录q一个项目工作区文件(.dsw)q一
2、个项目文件(.dsp)q一个工作区选项文件(.opt)P1725/22/20247要打开一个要打开一个项项目,目,只需要打开只需要打开对应对应的的项项目工作区文件目工作区文件.dsw5/22/20248项目工作区窗口nClassView:显示项目中定义的C类nResource View:显示项目中包含的资源nFile View:显示包含在项目工作区中的文件5/22/20249ClassViewn类q成员变量q成员函数q访问类型npublicnprivatenprotected5/22/202410RecourceViewnAcceleratornDialognIconnMenunString
3、TablenToolBarnVersion5/22/202411FileViewn查看文件n增加文件n删除文件5/22/202412打开打开应应用程序用程序n单击File|Open Work Space菜单项,单击“查找范围”下拉列表框,找到所要打开的项目的路径,再单击“文件类型”下拉列表框,设定文件类型为WorksSpaces(.dsw;.mdp),最后,双击项目工作区文件.dsw,即可打开相应的应用程序。5/22/202413关闭应用程序 n要关闭应用程序,必须将整个项目的所有文件关闭。n选择File|Close Work Space,将应用程序的工作区全部关闭。5/22/202414举举
4、例:在例:在视图视图区区输输出出“七彩前湖,美丽的家园!”5/22/202415void CMyView:OnDraw(CDC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(0,0,七彩前湖,美丽的家园!);5/22/202416OnDraw(CDC*pDC)函数n是实现视图输出的重要函数。n当程序窗口创建、移动、改变大小等情况时,窗口都需要重绘,系统会自动调用视图类的OnDraw()函数。5/22/202417进阶n设置文本的字体颜色和给文本添加背景色。5/22/202418void CMyView:OnDraw(C
5、DC*pDC)CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);pDC-SetTextColor(RGB(255,0,0);pDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(0,0,0);pDC-SetBkColor(RGB(0,0,0);pDC-TextOut(100,100,hello world!);5/22/202419n举例:在视图区画圆5/22/202420void CCircle_moveView:OnDraw(CDC*pDC)CCircle_moveDoc*pDoc=GetDocument(
6、);ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-Ellipse(0,0,50,50);/画圆5/22/202421Ellipse()函数nEllipse(x1,y1,x2,y2),画椭圆函数,其参数是左上角和右下角的坐标。n如果x2-x1=y2-y1,则所绘制的图形为圆。5/22/202422消息映射的基本原理消息映射的基本原理n鼠标消息及其处理n键盘消息及其处理5/22/202423鼠标消息及其处理5/22/202424n举例:在视图区点击鼠标左键,输出鼠标点击处位置的坐标。5/22/202425设计步骤:1、
7、为视图类添加一个CPoint类型的成员变量m_pt12、在构造函数中对m_pt1进行初始化3、为单击鼠标左键消息添加消息处理函数4、在OnDraw函数中添加相应的代码5/22/202426COutput_mouseView:COutput_mouseView()m_pt1.x=m_pt1.y=0;5/22/202427 void COutput_mouseView:OnDraw(CDC*pDC)CString str;str.Format(鼠标位置%d,%d,m_pt1.x,m_pt1.y);pDC-TextOut(0,0,str);5/22/202428void COutput_mouseV
8、iew:OnLButtonDown(UINT nFlags,CPoint point)m_pt1=point;Invalidate();CView:OnLButtonDown(nFlags,point);5/22/202429Invalidate()函数n该函数的作用是使原来的客户区失效,此时客户区需要重绘,会再次调用OnDraw()n简单地说就是刷新视图。5/22/202430n在视图区移动鼠标,文字跟踪鼠标的位置移动并显示鼠标所在位置的坐标(鼠标跑到了,文字跟到哪里)。举例(鼠标跟随)5/22/2024311、为视图类添加一个CPoint类型的成员变量m_pt12、在构造函数中对m_pt1
9、进行初始化3、为单击鼠标移动消息添加消息处理函数4、在OnDraw()函数中添加相应的代码设计步骤:5/22/202432CMouse_withView:CMouse_withView()/TODO:add construction code here m_pt1.x=m_pt1.y=0;5/22/202433void CMouse_withView:OnMouseMove(UINT nFlags,CPoint point)/TODO:Add your message handler code here m_pt1=point;Invalidate();CView:OnMouseMove(nF
10、lags,point);5/22/202434void CMouse_withView:OnDraw(CDC*pDC)CMouse_withDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereCString str;str.Format(鼠标位置:%d,%d,m_pt1.x,m_pt1.y);pDC-TextOut(m_pt1.x,m_pt1.y,str);5/22/202435举例:画直线程序n内容:按住鼠标左键时,并且鼠标移动时画线,当放开鼠标左键时绘图结束。5/22/20243
11、6设计步骤:1、在视图类添加私有bool型成员变量 m_bDragging;CPoint 类型成员变量m_ptOrigin;5/22/2024372、在视图类构造函数中完成其初始化CDraw_lineView:CDraw_lineView()/TODO:add construction code here m_bDragging=false;5/22/202438void CDraw_lineView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defau
12、ltm_ptOrigin=point;m_bDragging=true;CView:OnLButtonDown(nFlags,point);3、为按下鼠标左键时添加处理程序5/22/202439void CDraw_lineView:OnMouseMove(UINT nFlags,CPoint point)if(m_bDragging=true)CClientDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin=point;CView:OnMouseMove(nFlags,point);4、为鼠标移动消息添加消息处理程序5/
13、22/202440void CDraw_lineView:OnLButtonUp(UINT nFlags,CPoint point)m_bDragging=false;CView:OnLButtonUp(nFlags,point);5、为释放鼠标左键时添加处理程序5/22/202441键盘键盘消息及其消息及其处处理理5/22/202442举例:按键操作5/22/202443void CKey_caseView:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)CClientDC dc(this);if(nChar=VK_CAPITAL)dc.TextO
14、ut(100,50,Cap Lock键按下!);if(nChar=VK_CONTROL)dc.TextOut(100,100,CTRL键按下!);if(nChar=13)dc.TextOut(100,150,ENTER键被按下!);CView:OnKeyDown(nChar,nRepCnt,nFlags);5/22/202444VK_RETURN Enter(或者另一个)VK_SHIFT Shift(或者另一个)VK_CONTROL Ctrl(或者另一个)VK_PAUSE Pause VK_CAPITAL Caps Lock VK_ESCAPE Esc VK_SPACE Spacebar虚虚拟
15、键码拟键码5/22/202445VK_LEFT 左箭头 VK_UP 上箭头 VK_RIGHT 右箭头 VK_DOWN 下箭头 虚虚拟键码拟键码5/22/202446举例:能上下左右移动的圆 程序描述:程序启动,在视图显示一个半径为25的圆,按上、下、左、右键,该圆分别向上、下、左、右移动。5/22/2024471、给视图类添加CPoint类型的成员变量m_pt2、在构造函数中对其进行初始化3、在视图类的OnDraw()函数中添加代码4、为视图类的WM_KEYDOWN消息添加消息处理函数设计设计步步骤骤:5/22/202448构造函数中完成初始化CKey_messageView:CKey_mes
16、sageView()/TODO:add construction code herem_pt.x=0;m_pt.y=0;5/22/202449在视图类的OnDraw()函数中添加代码void CKey_messageView:OnDraw(CDC*pDC)CKey_messageDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-Ellipse(m_pt.x,m_pt.y,m_pt.x+50,m_pt.y+50);5/22/202450void CCircle_moveVie
17、w:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)if(nChar=VK_LEFT)m_pt.x-;/左移 Invalidate();if(nChar=VK_RIGHT)m_pt.x+;/右移 Invalidate();if(nChar=VK_DOWN)m_pt.y+;/下移 Invalidate();if(nChar=VK_UP)m_pt.y-;/上移 Invalidate();CView:OnKeyDown(nChar,nRepCnt,nFlags);5/22/202451举例:键盘鼠标消息综合举例(1)n程序描述:如果把程序修改如果点击鼠标左
18、键,圆半径加大,点击鼠标右键,圆半径减小,该如何编程?5/22/2024521、给视图类添加CPoint类型的成员变量m_pt2、在构造函数中对其进行初始化3、在视图类的OnDraw()函数中添加代码4、为视图类的WM_KEYDOWN消息添加消息处理函数5、为点击鼠标左键消息添加消息处理函数6、为点击鼠标右键消息添加消息处理函数5/22/202453CCircle_moveView:CCircle_moveView()/TODO:add construction code herem_pt.x=200;m_pt.y=200;radius=50;5/22/202454void CCircle_m
19、oveView:OnDraw(CDC*pDC)CCircle_moveDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-Ellipse(m_pt.x,m_pt.y,m_pt.x+radius,m_pt.y+radius);/画圆5/22/202455void CCircle_moveView:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)if(nChar=VK_LEFT)m_pt.x-;/左移 Invalidate();if(n
20、Char=VK_RIGHT)m_pt.x+;/右移 Invalidate();if(nChar=VK_DOWN)m_pt.y+;/下移 Invalidate();if(nChar=VK_UP)m_pt.y-;/上移 Invalidate();CView:OnKeyDown(nChar,nRepCnt,nFlags);5/22/202456void CCircle_moveView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultradius=ra
21、dius+5;Invalidate();CView:OnLButtonDown(nFlags,point);5/22/202457void CCircle_moveView:OnRButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call default radius=radius-5;Invalidate();CView:OnRButtonDown(nFlags,point);5/22/202458限制其半径不让其比原半径还小void CCircle_moveView:OnR
22、ButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultif(radius=50)radius=radius-5;Invalidate();CView:OnRButtonDown(nFlags,point);5/22/202459举例:键盘鼠标消息综合举例(2)n如果把程序修改,如果点击鼠标左键,移动速度加快,点击鼠标右键,移动速度减慢,该如何编程?(注意方向)5/22/2024601、给视图类添加CPoint类型的成员变量m_pt2、在构造函数中对其进行初始
23、化3、在视图类的OnDraw()函数中添加代码4、为视图类的WM_KEYDOWN消息添加消息处理函数5、为点击鼠标左键消息添加消息处理函数6、为点击鼠标右键消息添加消息处理函数5/22/202461CCircle_moveView:CCircle_moveView()/TODO:add construction code herem_pt.x=200;m_pt.y=200;step=2;5/22/202462void CCircle_moveView:OnDraw(CDC*pDC)CCircle_moveDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TO
24、DO:add draw code for native data herepDC-Ellipse(m_pt.x,m_pt.y,m_pt.x+50,m_pt.y+50);/画圆5/22/202463void CCircle_moveView:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)if(nChar=VK_LEFT)m_pt.x=m_pt.x-step;/左移 Invalidate();if(nChar=VK_RIGHT)m_pt.x=m_pt.x+step;/右移 Invalidate();if(nChar=VK_DOWN)m_pt.y=m_p
25、t.y+step;/下移 Invalidate();if(nChar=VK_UP)m_pt.y=m_pt.y-step;/上移 Invalidate();CView:OnKeyDown(nChar,nRepCnt,nFlags);5/22/202464void CCircle_moveView:OnLButtonDown(UINT nFlags,CPoint point)step=step+2;Invalidate();CView:OnLButtonDown(nFlags,point);5/22/202465void CCircle_moveView:OnRButtonDown(UINT nF
26、lags,CPoint point)if(step=2)step=step-2;Invalidate();CView:OnRButtonDown(nFlags,point);5/22/202466菜菜单单、工具、工具栏栏、快捷、快捷键键及其消息映射及其消息映射n菜单n工具栏n快捷键n快捷菜单5/22/202467void CMenuTestView:OnShowTxt()CClientDC dc(this);dc.TextOut(100,100,七彩前湖,美丽的家园!);5/22/202468void CMenuTestView:OnPopMsg()AfxMessageBox(日新自强,知行合一!);5/22/202469void CMenuTestView:OnContextMenu(CWnd*pWnd,CPoint point)CMenu MenuPop;if(MenuPop.CreatePopupMenu()MenuPop.AppendMenu(MF_STRING,ID_ShowTxt,显示文本(&T)t Ctrl+T);MenuPop.AppendMenu(MF_STRING,ID_PopMsg,弹出信息框(&I)t Ctrl+I);MenuPop.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);5/22/202470