




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、打字功能1加入数据成员选择ClassView,双击CMyView,光标直接停留在类CMyView的定义处。在类CMyView中加入如下部分:class CMyView : public CViewprotected: / create from serialization only CMyView(); DECLARE_DYNCREATE(CMyView)/ Attributespublic: CMyDoc* GetDocument();/ Operationspublic:/代码编写开始POINT Caret; /用于存放插入符当前坐标位置/代码编写结束/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMyView)public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:virtual CMyView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:/ Generated message map functionsprotected:/AFX_MSG(CMyView)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);/AFX_MSGDECLARE_MESSAGE_MAP();2加入消息:WM_CREATE(1)在“查看”菜单中选择“建立类向导”(ClassWizard)命令,打开MFC ClassWizard窗口。(2)选择 Message Maps。(3)分别选择:Project: 打字Class Name: CMyViewObjects: CMyViewMessges: WM_CREATE(4)单击Add Function按钮。(5)单击Edit Code按钮。在OnCreate()函数体中加入以下部分。int CMyView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;/代码编写开始 TEXTMETRIC tm; /声明TEXTMETRIC结构类型对象tm,用于存放字符信息。CClientDC dc(this); /生成应用程序窗口设备情景对象/调用CDC类成员函数GetTextMetrics()取得字符信息,并存入变量tm中。dc.GetTextMetrics(&tm);/调用CWnd类成员函数CreateSolidCaret()创建黑色矩形条插入符,插入符宽度为tm.tmAveCharWidth/8,高度为tm.tmHeight。CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);/设置插入符的初始位置Caret.x=0; Caret.y=tm.tmHeight;SetCaretPos(Caret);/在初始位置显示插入符ShowCaret();/代码编写结束return 0;3加入键盘消息:WM_CHAR(1)在“查看”菜单中选择“建立类向导”(ClassWizard)命令,打开MFC ClassWizard窗口。(2)选择 Message Maps。(3)分别选择:Project: 打字Class Name: CMyViewObjects: CMyViewMessges: WM_CHAR(4)单击Add Function按钮。(5)单击Edit Code按钮。在OnChar()函数体中加入以下部分。void CMyView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call default/代码编写开始SIZE size; /存放字符的宽度和长度。static UINT dy=Caret.y; /声明静态变量dy,存放插入符Y轴坐标。CString a; /声明CString类对象a,存放键盘检索到的字符nChar。a=nChar;CClientDC dc(this);/生成应用程序窗口设备情景对象for(UINT i=0;iSetWindowText(绘制图形);/代码编写结束m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();return TRUE;7编译、运行(三)光标特性1 在视图类CDrawView加入数据成员选择ClassView视图,双击CdrawView,光标直接停留在类CdrawView的定义处。在类CdrawView的定义中加入如下代码。class CDrawView : public CViewprotected: int m_Dragging;CPoint m_PointOld;CPoint m_PointOrigin; /代码开始编写HCURSOR m_HCross;HCURSOR m_HArrow;/代码编写结束protected: / create from serialization onlyCDrawView();DECLARE_DYNCREATE(CDrawView)/ Attributespublic:CDrawDoc* GetDocument();/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CDrawView)public:virtual void OnDraw(CDC* pDC); / overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);/AFX_VIRTUAL/ Implementationpublic:virtual CDrawView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:/ Generated message map functionsprotected:/AFX_MSG(CDrawView)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_MAP();2 在视图类构造函数CdrawView()中初始化数据成员选择ClassView视图,单击CdrawView,找到并双击构造函数CdrawView(),光标直接停留在CDrawView:CDrawView()处。在类CdrawView类构造函数CdrawView()的函数体中加入如下代码。CDrawView:CDrawView()/ TODO: add construction code here m_Dragging=0; /代码开始编写 m_HCross=AfxGetApp()-LoadStandardCursor(IDC_CROSS); m_HArrow=AfxGetApp()-LoadStandardCursor(IDC_ARROW); /代码编写结束3 在函数OnDraw( )中加入代码,绘制绘图区域选择ClassView视图,单击CdrawView,找到并双击函数OnDraw (),光标直接停留在CDrawView: OnDraw ()处。在OnDraw ()的函数体中加入如下代码。void CDrawView:OnDraw(CDC* pDC)CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/代码开始编写 pDC-MoveTo(40,40); pDC-LineTo(600,40); pDC-LineTo(600,400); pDC-LineTo(40,400); pDC-LineTo(40,40); /代码编写结束4 修改消息处理函数OnLButtonDown( )选择ClassView视图,单击CdrawView,找到并双击函数OnLButtonDown (),光标直接停留在CDrawView: OnLButtonDown ()处。在OnLButtonDown ()的函数体中加入如下代码。void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/代码开始编写CRect Rect(40,40,600,400);if(!Rect.PtInRect(point)return;else /代码编写结束 m_PointOrigin=point; m_PointOld=point; m_Dragging=1;/代码开始编写 /代码编写结束 CView:OnLButtonDown(nFlags, point);5 修改消息处理函数OnMouseMove( )选择ClassView视图,单击CdrawView,找到并双击函数OnMouseMove (),光标直接停留在CDrawView: OnMouseMove ()处。在OnMouseMove ()的函数体中加入如下代码。void CDrawView:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/代码开始编写 int b;CRect Rect(40,40,600,400);b=Rect.PtInRect(point);if(b):SetCursor(m_HCross);else:SetCursor(m_HArrow);if (m_Dragging&b) /代码编写结束 /删除的代码 /if (m_Dragging)/CClientDC dc(this);dc.SetROP2(R2_NOT);dc.MoveTo(m_PointOrigin);dc.LineTo(m_PointOld);dc.MoveTo(m_PointOrigin);dc.LineTo(point); m_PointOld=point;6 修改消息处理函数OnLButtonUp( )选择ClassView视图,单击CdrawView,找到并双击函数OnLButtonUp (),光标直接停留在CDrawView: OnLButtonUp ()处。在OnLButtonUp ()的函数体中加入如下代码。void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/代码开始编写 int b;CRect Rect(40,40,600,400);b=Rect.PtInRect(point);if(b):SetCursor(m_HCross);else:SetCursor(m_HArrow);if (m_Dragging&b) /代码编写结束 /删除的代码 /if (m_Dragging)m_Dragging=0;CClientDC dc(this);dc.SetROP2(R2_NOT);dc.MoveTo(m_PointOrigin);dc.LineTo(m_PointOld);dc.MoveTo(m_PointOrigin);dc.LineTo(point);CView:OnLButtonUp(nFlags, point);7 编译、运行(四)窗口特性1 修改CdrawView.CPP文件PreCreateWindow()函数BOOL CDrawView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT cs/代码开始编写 cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,(HBRUSH):GetStockObject(WHITE_BRUSH),0); /代码编写结束return CView:PreCreateWindow(cs);2 编译、运行(五)图形重画总的说来,实现图形的重画包括两个步骤:(1)在文档类中将每条直线的数据(直线的两个端点)保存起来。(2)在OnDraw()函数中用这些数据绘制直线。1在文件DrawDoc.h中加入类Cline,存放直线的坐标选择ClassView,双击CdrawDoc,打开头文件DrawDoc.h,在其下列位置,加入以下代码。/ DrawDoc.h : interface of the CDrawDoc class/#if !defined(AFX_DRAWDOC_H_6144CF7A_999E_4B9A_9E8D_9A5314A2DF13_INCLUDED_)#define AFX_DRAWDOC_H_6144CF7A_999E_4B9A_9E8D_9A5314A2DF13_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/代码编写开始class CLine:public Cobject /新加入的类protected:int m_X1,m_X2,m_Y1,m_Y2; /整型数据成员m_X1和m_Y1存放直线一端的X,Y坐标,m_X2和m_Y2存放直线另一端的X,Y坐标public:CLine(int X1,int Y1,int X2,int Y2)/构造函数m_X1=X1;m_Y1=Y1;m_X2=X2;m_Y2=Y2;void Draw(CDC * pDC); /声明成员函数Draw(CDC * pDC),用来直接重画直线;/代码编写结束2定义函数Cline:Draw( ) 用来绘制直线选择FileView,展开SourceFiles,双击DrawDoc.cpp,打开执行文件DrawDoc.cpp,在其末尾,加入以下代码。/代码编写开始void CLine:Draw(CDC *pDC)pDC-MoveTo(m_X1,m_Y1);pDC-LineTo(m_X2,m_Y2);/代码编写结束3修改类CdrawDoc的定义回到Workspace,选择ClassView,双击CDrawDoc,在头文件DrawDoc.h的CdrawDoc类定义开头加入以下代码。class CDrawDoc : public CDocument/代码编写开始protected:CObArray m_LineArray; /m_LineArray是CObArray类的对象,用于存放CLine对象的指针,CObArray是MFC通用集合类之一,它的实例用陈列状的数据结构存放一组CObject对象的指针,用来存放变量或对象组合。public:void AddLine(int X1,int Y1,int X2,int Y2);/成员函数AddLine()向集合类CObArray类的对象m_LineArray加入新的直线数目。CLine *GetLine(int Index); /成员函数GetLine()取得直线数据int GetNumLines();/成员函数GetNumLines()取得存放的直线数目/代码编写结束protected: / create from serialization onlyCDrawDoc();DECLARE_DYNCREATE(CDrawDoc)/ Attributespublic:/ Operationspublic:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CDrawDoc)public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);/AFX_VIRTUAL/ Implementationpublic:virtual CDrawDoc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:/ Generated message map functionsprotected:/AFX_MSG(CDrawDoc)/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();4定义函数CdrawDoc:AddLine()选择FileView,展开SourceFiles,双击DrawDoc.cpp,打开执行文件DrawDoc.cpp,在其末尾,加入以下代码。/代码编写开始/ AddLine()生成新的Cline对象,并调用CObArray成员函数Add()向m_LineArray添加Cline对象指针。void CDrawDoc:AddLine(int X1,int Y1,int X2,int Y2)CLine *pLine=new CLine(X1,Y1,X2,Y2); m_LineArray.Add(pLine);/代码编写结束5定义函数CdrawDoc:GetLine()选择FileView,展开SourceFiles,双击DrawDoc.cpp,打开执行文件DrawDoc.cpp,在其末尾,加入以下代码。/代码编写开始/ CObArray成员函数GetUpperBound( )返回加入的最后一个指针的索引,即最大的有效索引,CObArray成员函数GetAt( ) 返回对应的CLine指针。如果索引号小于0或大于最大的有效索引号,GetLine( ) 返回0;否则,返回对应的CLine指针。CLine *CDrawDoc:GetLine(int Index)if(Indexm_LineArray.GetUpperBound()return 0;return (CLine *)m_LineArray.GetAt(Index);/代码编写结束6定义函数CdrawDoc:GetNumLines()选择FileView,展开SourceFiles,双击DrawDoc.cpp,打开执行文件DrawDoc.cpp,在其末尾,加入以下代码。/代码编写开始/ 通过调用CObArray成员函数GetSize( ),GetNumLines( )返回m_LineArray当前存放的CLine指针的个数。int CDrawDoc:GetNumLines()return m_LineArray.GetSize();/代码编写结束7修改函数视图类消息处理函数OnLButtonUp( )调用GetDocument( )和AddLine( )来存放新直线。回到Workspace,选择ClassView,单击CDrawView,展开CdrawView成员变量和成员函数。双击OnLButtonUp( ),在函数OnLButtonUp()中定义后加入以下代码。void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default int b;CRect Rect(40,40,600,400);b=Rect.PtInRect(point);if(b):SetCursor(m_HCross);else:SetCursor(m_HArrow);if (m_Dragging&b)m_Dragging=0;CClientDC dc(this);dc.SetROP2(R2_NOT);dc.MoveTo(m_PointOrigin);dc.LineTo(m_PointOld);dc.MoveTo(m_PointOrigin);dc.LineTo(point);/代码开始编写 /调用函数GetDocument( )取得文档类的指针,并存入pDoc中。CDrawDoc * pDoc=GetDocument(); /通过指针pDoc调用加入的文档类成员函数AddLine( )向m_LineArray加入 Cline类直线对象。pDoc-AddLine(m_PointOrigin.x,m_PointOrigin.y,point.x,point.y); / 当一条新的直线绘制完成,视图类OnLButtonUp( nFlags, point)函数通过上面的工作将新绘制的直线存入文档类中。/代码编写结束CView:OnLButtonUp(nFlags, point);8修改视图类成员函数OnDraw( )void CDrawView:OnDraw(CDC* pDC)CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here pDC-MoveTo(40,40); pDC-LineTo(600,40); pDC-LineTo(600,400); pDC-LineTo(40,400); pDC-LineTo(40,40);/代码开始编写int Index=pDoc-GetNumLines();while(Index-)pDoc-GetLine(Index)-Draw(pDC); /代码编写结束9编译、运行(六)图形的删除下面向Draw程序加入图形的编辑功能。选择“编辑/撤销”菜单命令就可以删除最近绘制的直线,选择“编辑/全部删除”菜单命令可以清除掉视图窗口中所有的直线。函数DeleteContents专门负责文档数据的删除工作,可以在文档类中加入该函数删除存放的直线。我们的目的是通过菜单命令答道编辑的功能,因此需要加入“编辑/撤销”和 “编辑/全部删除”菜单命令的消息处理函数,在它们的消息处理函数中调用函数DeleteContents( )。1 加入“编辑”菜单命令“全部删除”(1) 选择ResourceView视图,打开Menu项目下的IDR_MAINFRAME标志符,在Edit菜单下面加入菜单命令 “全部删除”。ID标志符为:ID_EDIT_CLEAR_ALL,Caption为:全部删除(&A)tCtrl+A(2) 双击Accelerator项目下面的IDR_MAINFRAME标志符,打开快捷键编辑器。双击快捷键编辑框底部的空框,在ID文本框中输入ID_EDIT_CLEAR_ALL,在Key文本框中输入A,并选择Ctrl。2 加入虚函数DeleteContents( )(1)在“查看”菜单中选择“建立类向导”(ClassWizard)命令,打开MFC ClassWizard窗口。(2)选择 Message Maps。(3)分别选择:Project: DrawClass Name: CDrawDocObjects: CDrawDocMessges: DeleteContents(4)单击Add Function按钮。(5)单击Edit Code按钮。在DeleteContents()函数体中加入以下部分。void CDrawDoc:DeleteContents() / TODO: Add your specialized code here and/or call the base class/代码编写开始int Index=m_LineArray.GetSize();while(Index-)delete m_LineArray.GetAt(Index);m_LineArray.RemoveAll();/代码编写结束CDocument:DeleteContents();3 加入ID_EDIT_CLEAR_ALL的COMMAND消息处理函数OnEditClearAll()(1)在“查看”菜单中选择“建立类向导”(Clas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校级遴选面试题目及答案
- 还记得吗作文800字10篇范文
- 抒情类作文父亲的爱600字8篇
- 时间的脚印公开课件
- 质量控制(QC)检查问题点与改善方案模板
- 项目进度控制与时间管理表
- 时间与生命的节奏
- 城市环境改造工程承包合同
- 元宵节四百字作文怎么写13篇范文
- 早读课课件神器
- 湖北省2025届高三(9月)起点考试 英语试卷(含答案)
- 2024年内蒙古呼伦贝尔农垦拉布大林上库力三河苏沁农牧场招聘115人历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 2024年全国网络安全行业职业技能大赛(数据安全管理员)考试题库-下(多选、判断题)
- DL∕T 1878-2018 燃煤电厂储煤场盘点导则
- 储藏室买卖协议模板
- 知识题库-人社练兵比武竞赛测试题及答案(九)
- 麦冬(浙麦冬)规范化生产技术规程
- 2024-2029年N-甲基吗啉N-氧化物(NMMO)行业市场现状供需分析及市场深度研究发展前景及规划投资研究报告
- 技术交底记录(通风)
- 九年级语文下册3武松打虎省公开课一等奖新名师获奖
- “一带一路”倡议与国际合作课件
评论
0/150
提交评论