第2章文档和视 内容摘要: 1.通过视类与用户交互 2.通过视类与用户交互
第2章 文档和视 内容摘要: 1. 通过视类与用户交互 2. 通过视类与用户交互 返回目录
2.1 21通过视类与用户交互 学习目标 1.在程序中响应鼠标消息 2.在程序中响应键盘消息
2.1 通过视类与用户交互 学习目标 1. 在程序中响应鼠标消息 2. 在程序中响应键盘消息 2.1 返回第2章
程序的实现步骤 2.1 1.利用 App wizard生成单文档程序框架( Doc View) 2.为视类添加数据成员 BOOL m bOuse Dowrη;∥标识鼠标左键是否按下 CuRsor m cross;∥片十字型鼠标句柄 HCURSoR m hArrow;∥标准型鼠标句柄 CPoint m told ∥临时点 CPoint m ptstart; 线的起始点 3.在构造函数中初始化成员变量 CDocViewView C DocViewViewo m bOuse Down false m cRoss Afx GetAppo->LoadStandardCursor(IDC_ CROSS m hArrow Afx GetAppo->LoadStandardCursor(IDC_ ARROW)
程序的实现步骤 1. 利用AppWizard生成单文档程序框架(DocView ) 2. 为视类添加数据成员 2.1 BOOL m_bMouseDown; //标识鼠标左键是否按下 HCURSOR m_hCross; //十字型鼠标句柄 HCURSOR m_hArrow; //标准型鼠标句柄 CPoint m_ptOld; //临时点 CPoint m_ptStart; //画线的起始点 3. 在构造函数中初始化成员变量 CDocViewView::CDocViewView() { m_bMouseDown = false; m_hCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS); m_hArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW); }
4.为视类添加鼠标动作响应函数 2.1 void CDocViewView:: OnLButtonDown (UINT nFlags, CPoint point) //TODO: Add your message handler code here and/or call default m bOuse down=true;∥鼠标左键按下 m_ ptstart point ∥画线的起点 m told point ∥临时点 SetCaptureo ∥将鼠标消息发送到视窗口 CRect rect GetclientRect(&rect) ∥得到客户窗口的大小 ClientToScreen(&rect);∥将当前窗口坐标转换成屏幕坐标 Clip Cursor(&rect) ∥把鼠标限定在其参数指定的矩形区域内 Setcursor(m cRoss) ∥设置鼠标形状为十字形 CView: OnLButton Down(nF lags, point)
2.1 void CDocViewView:: OnLButtonDown (UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_bMouseDown = true; // 鼠标左键按下 m_ptStart = point; // 画线的起点 m_ptOld = point; // 临时点 SetCapture(); // 将鼠标消息发送到视窗口 CRect rect; GetClientRect(&rect); // 得到客户窗口的大小 ClientToScreen(&rect); // 将当前窗口坐标转换成屏幕坐标 ClipCursor(&rect); // 把鼠标限定在其参数指定的矩形区域内 SetCursor(m_hCross); // 设置鼠标形状为十字形 CView::OnLButtonDown(nFlags, point); } 4.为视类添加鼠标动作响应函数
2.1 4.为视类添加鼠标动作响应函数 void CMy DrawView On Move(UINT nFlags, CPoint point) // TODO: Add your message handler code here and/or call default if( m bOuse Down CClientDC dc(this) dc. SetROP2( R2 NOT); dc. Move to( m pt start);∥这两行代码擦除从起点(鼠标按下点)到 dc Line To( m_told ) ∥上次鼠标移动到的位置之间的临时线 dc. Move to( m pt start);∥这两行代码从起点到鼠标当前位置画线 dc Line To( point m told= point;∥/鼠标当前位置在下一次鼠标移动事件看来就是"旧位置 CView On MouseMove (nFlags, point)
2.1 void CMyDrawView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if( m_bMouseDown ) { CClientDC dc(this); dc.SetROP2( R2_NOT ); dc.MoveTo( m_ptStart ); //这两行代码擦除从起点(鼠标按下点)到 dc.LineTo( m_ptOld ); //上次鼠标移动到的位置之间的临时线 dc.MoveTo( m_ptStart ); //这两行代码从起点到鼠标当前位置画线 dc.LineTo( point ); // m_ptOld = point; //鼠标当前位置在下一次鼠标移动事件看来就是"旧位置" } CView::OnMouseMove(nFlags, point); } 4.为视类添加鼠标动作响应函数
void CMy DrawView OnLButtonUp(UINT nFlags, CPoint point) if( m bLouse Down m bouse down false Release Captured ClipCursor( NULL) CClientDC dc(this) dc. SetROP2( R2 NOT) dc. Move To(m_ pt Start);∥这两行代码擦除从起点(鼠标按下点)到 dc Line to( m told);∥上次鼠标移动到的位置之间的临时线 dc. SetROP2( R2 COPYPEN dc. Move to( m pt start);∥这两行代码从起点到鼠标当前位置画线 dc Line To( point ) ∥ Set Cursor(m hArrow) ∥设置鼠标形状为标准箭头形 CView: OnLButtonUpnF lags, point)
void CMyDrawView::OnLButtonUp(UINT nFlags, CPoint point) { if( m_bMouseDown ) { m_bMouseDown = false; ReleaseCapture(); ClipCursor( NULL ); CClientDC dc(this); dc.SetROP2( R2_NOT ); dc.MoveTo( m_ptStart ); //这两行代码擦除从起点(鼠标按下点)到 dc.LineTo( m_ptOld ); //上次鼠标移动到的位置之间的临时线 dc.SetROP2( R2_COPYPEN ); dc.MoveTo( m_ptStart ); //这两行代码从起点到鼠标当前位置画线 dc.LineTo( point ); // SetCursor(m_hArrow); //设置鼠标形状为标准箭头形 } CView::OnLButtonUp(nFlags, point); } 2.1
程序的实现步骤2 2.1 为视类添加数据成员为视类添加数据成员 int m nline ∥记录已输入字符行数 CString m strDisplay: ∥.存当前字符串的变量 2.在构造函数中初始化成员变量 CDocViewView: CDocViewViewO M/ TODO: add construction code here m nLine =0 m bOuse Down false m cRoss= Afx GetAppo->LoadStandardCursor(IDC CROSS) m hArrow AfX GetAppo->LoadStandardCursor(IDC ARROW
程序的实现步骤_2 1.为视类添加数据成员为视类添加数据成员 2.1 int m_nLine; //记录已输入字符行数 CString m_strDisplay; //保存当前字符串的变量 2. 在构造函数中初始化成员变量 CDocViewView::CDocViewView() { // TODO: add construction code here m_nLine = 0; m_bMouseDown = false; m_hCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS); m_hArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW); }
3.为视类添加键盘消息响应函数 2.1 void CDocView View: OnChar(UINT nChar, UINT nRepCnt, UINT nFlags if(nChar== RETURN)∥如果按下回车键 m strDisplay Empty 0: m nline++ else if(( m strDisplay. GetLength0<64)∥当前行字符数小于64 m strDisplay + nchar; CClientDC dc(this) TEⅩ TMETRIC tm; dc. Get TextMetrics(&tm) int nLineheight =tm. tmHeight tm tmEXternaILeading dc Textout(O, m nLine * nLine Height, m strDisplay) CView: OnChar(nChar, nRepCnt, nF lags)
3.为视类添加键盘消息响应函数 2.1 void CDocViewView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if(nChar == VK_RETURN) //如果按下回车键 { m_strDisplay.Empty(); m_nLine++; } else if(m_strDisplay.GetLength() < 64) //当前行字符数小于64 m_strDisplay += nChar; CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); int nLineHeight = tm.tmHeight + tm.tmExternalLeading; dc.TextOut(0, m_nLine * nLineHeight, m_strDisplay); CView::OnChar(nChar, nRepCnt, nFlags); }
2.1 基本知识 1. AfxGetApp( LoadStandardCursor (IDC Cross) 2 Getclientrect(&rect);∥得到客户窗口的大小 3 ClientToScreen(&rect);∥将当前窗口坐标转换成屏幕坐标 4 ClipCursor(▭∥把鼠标限定在其参数指定的矩形区域 内 5 Setcursor( m aCross;∥设置鼠标形状为十字形
基本知识 1. AfxGetApp() LoadStandardCursor(IDC_CROSS); 2.GetClientRect(&rect); // 得到客户窗口的大小 3.ClientToScreen(&rect); // 将当前窗口坐标转换成屏幕坐标 4.ClipCursor(&rect); // 把鼠标限定在其参数指定的矩形区域 内 5.SetCursor(m_hCross); // 设置鼠标形状为十字形 2.1
2.2 22利用文档类处理数据 学习目标 1.在文档类中保存数据
2.2 利用文档类处理数据 学习目标 1. 在文档类中保存数据 2.2 返回第2章