📄 chap7_3.htm
字号:
<p>else</p>
<p>{</p>
<p>//</font><font SIZE="3">按行号返回字符串链表中位置值</font><font FACE="Times New Roman" SIZE="3"></p>
<p>pos=pDoc->lines.FindIndex(pDoc->nLineNum);</p>
<p>if(!pos)</p>
<p>{</p>
<p>//</font><font SIZE="3">没有找到该行号对应的行,因此它是一个空行,</font><font FACE="Times New Roman" SIZE="3"></p>
<p>//</font><font SIZE="3">我们把它加到字符串链表中。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>line+=(char)nChar;</p>
<p>pDoc->lines.AddTail(CString(line));</p>
<p>}</p>
<p>else{</p>
<p>//there is a line,so add the incoming char to the end of</p>
<p>//the line</p>
<p>line=pDoc->lines.GetAt(pos);</p>
<p>line+=(char)nChar;</p>
<p>pDoc->lines.SetAt(pos,line);</p>
<p>}</p>
<p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>TEXTMETRIC tm;</p>
<p>dc.GetTextMetrics(&tm);</p>
<p>dc.TextOut(0,</p>
<p>(int)pDoc->nLineNum*tm.tmHeight,</p>
<p>line,</p>
<p>line.GetLength());</p>
<p>}</p>
<p>pDoc->SetModifiedFlag();</p>
<p>SetScrollSizes(MM_TEXT,GetDocument()->GetDocSize());</b></p>
<p>CScrollView::OnChar(nChar,nRepCnt,nFlags);</p>
<p>}</p>
<p></font><font SIZE="3">在程序运行开始的时侯,视图坐标原点和文档坐标原点是重合的。但是,当用户拖动滚动条时,视图原点就与文档原点不一致了,如图</font><font FACE="Times New Roman" SIZE="3">7-14</font><font SIZE="3">。由于</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">是按照文档坐标(逻辑坐标)来输出图形的,这样自然就无法正确显示文档内容。</p>
<p ALIGN="CENTER"><img src="T7_14.gif" alt="T7_14.tif (490924 bytes)" WIDTH="462" HEIGHT="542"></font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="CENTER"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">7-14
</font><font SIZE="3">文档滚动前后文档坐标原点和视图坐标原点的变化</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="CENTER"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">这时,要想获得正确输出,就必须调整视图坐标,让视图坐标原点和文档坐标原点重合,如图</font><font FACE="Times New Roman" SIZE="3">7-15</font><font SIZE="3">所示。</font><font FACE="Times New Roman" SIZE="3"></p>
<p align="center"></font><font SIZE="3"><img src="T7_15.gif" alt="T7_15.tif (109159 bytes)" WIDTH="420" HEIGHT="188"></font><font FACE="Times New Roman" SIZE="3"></p>
<p align="center"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">7-15
</font><font SIZE="3">调整视图设备上下文原点后</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CScrollView</font><font SIZE="3">视图类提供了一个</font><font FACE="Times New Roman" SIZE="3">CScrollView::OnPrepareDC()</font><font SIZE="3">成员函数,完成视图设备上下文坐标原点的调整工作。</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">现在修改</font><font FACE="Times New Roman" SIZE="3">OnChar()</font><font SIZE="3">,加入</font><font FACE="Times New Roman" SIZE="3">OnPrepareDC()</font><font SIZE="3">函数,见清单</font><font FACE="Times New Roman" SIZE="3">7.15</font><font SIZE="3">。<b></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">7.15 </font><font SIZE="3">修改后的</font><font FACE="Times New Roman" SIZE="3">OnChar</font><font SIZE="3">成员函数</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>void CEditorView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) </p>
<p>{</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>CEditorDoc* pDoc=GetDocument();</p>
<p>CClientDC dc(this);</p>
<p>OnPrepareDC(&dc);</p>
<p>CFont* pOldFont=dc.SelectObject(pFont); </p>
<p>CString line("");//</font><font SIZE="3">存放编辑器当前行字符串</font><font FACE="Times New Roman" SIZE="3"></p>
<p>POSITION pos=NULL;//</font><font SIZE="3">字符串链表位置指示</font><font FACE="Times New Roman" SIZE="3"></p>
<p>if(nChar=='\r')</p>
<p>{</p>
<p>pDoc->nLineNum++;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>//</font><font SIZE="3">按行号返回字符串链表中位置值</font><font FACE="Times New Roman" SIZE="3"></p>
<p>pos=pDoc->lines.FindIndex(pDoc->nLineNum);</p>
<p>if(!pos)</p>
<p>{</p>
<p>//</font><font SIZE="3">没有找到该行号对应的行,因此它是一个空行,</font><font FACE="Times New Roman" SIZE="3"></p>
<p>//</font><font SIZE="3">我们把它加到字符串链表中。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>line+=(char)nChar;</p>
<p>pDoc->lines.AddTail(CString(line));</p>
<p>}</p>
<p>else{</p>
<p>//there is a line,so add the incoming char to the end of</p>
<p>//the line</p>
<p>line=pDoc->lines.GetAt(pos);</p>
<p>line+=(char)nChar;</p>
<p>pDoc->lines.SetAt(pos,line);</p>
<p>}</p>
<p>TEXTMETRIC tm;</p>
<p>dc.GetTextMetrics(&tm);</p>
<p>dc.TextOut(0,</p>
<p>(int)pDoc->nLineNum*tm.tmHeight,</p>
<p>line,</p>
<p>line.GetLength());</p>
<p>}</p>
<p>pDoc->SetModifiedFlag();</p>
<p>dc.SelectObject(pOldFont);</p>
<p>SetScrollSizes(MM_TEXT,GetDocument()->GetDocSize());</b></p>
<p>CScrollView::OnChar(nChar,nRepCnt,nFlags);</p>
<p>}</p>
<p></font><font SIZE="3">但是,对于视图</font><font FACE="Times New Roman" SIZE="3">OnDraw()</font><font SIZE="3">函数,则不需要作这样的调整。这是因为,框架在调用</font><font FACE="Times New Roman" SIZE="3">OnDraw()</font><font SIZE="3">之前,已经自动调用了</font><font FACE="Times New Roman" SIZE="3">OnPrepareDC()</font><font SIZE="3">成员函数完成设备上下文坐标调整工作了。<b></p>
<div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="100%" bgcolor="#79D3FF">
<tr>
<td width="100%"></b>提示:对于框架传过来的设备上下文,不需要调用</font><font FACE="Times New Roman" SIZE="3">OnPrepareDC(),</font><font SIZE="3">因为框架知道它是用于绘图的,因此事先调用了</font><font FACE="Times New Roman" SIZE="3">OnPrepareDC()</font><font SIZE="3">作好了坐标调整工作。如果是自己构造或用</font><font FACE="Times New Roman" SIZE="3">GetDC()</font><font SIZE="3">取得得设备上下文,则需要调用</font><font FACE="Times New Roman" SIZE="3">OnPrepareDC()</font><font SIZE="3">完成设备上下文坐标调整工作。<b></b></font></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><p></font><font SIZE="3">现在编辑器已经能够支持文档滚动了,如图</font><font FACE="Times New Roman" SIZE="3">7-16</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
<p align="center"></font><font SIZE="3"> <img src="T7_16.gif" alt="T7_16.tif (270924 bytes)" WIDTH="487" HEIGHT="349"></font><font FACE="Times New Roman" SIZE="3"></p>
<p align="center"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">7-16</font><font SIZE="3">支持滚动的文本编辑器</font><font FACE="Times New Roman" SIZE="3"></p>
</font><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><a href="chap7_2.htm">上一页</a></td>
<td><p align="right"><a href="chap7_4.htm">下一页</a></td>
</tr>
</table>
</center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
<p align="center"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
未经许可,请勿以任何形式复制</font></td>
<b>
</tr>
</table>
</center></div>
<p ALIGN="CENTER"></b><font SIZE="5"> </font><font FACE="Times New Roman" SIZE="5"></p>
</font><font FACE="Times New Roman" SIZE="3">
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
</font></b>
<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font> </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -