⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap7_3.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
📖 第 1 页 / 共 3 页
字号:
    <p>else</p>
    <p>{</p>
    <p>//</font><font SIZE="3">按行号返回字符串链表中位置值</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>pos=pDoc-&gt;lines.FindIndex(pDoc-&gt;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-&gt;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-&gt;lines.GetAt(pos);</p>
    <p>line+=(char)nChar;</p>
    <p>pDoc-&gt;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(&amp;tm);</p>
    <p>dc.TextOut(0,</p>
    <p>(int)pDoc-&gt;nLineNum*tm.tmHeight,</p>
    <p>line,</p>
    <p>line.GetLength());</p>
    <p>}</p>
    <p>pDoc-&gt;SetModifiedFlag();</p>
    <p>SetScrollSizes(MM_TEXT,GetDocument()-&gt;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(&amp;dc);</p>
    <p>CFont* pOldFont=dc.SelectObject(pFont); </p>
    <p>CString line(&quot;&quot;);//</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-&gt;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-&gt;lines.FindIndex(pDoc-&gt;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-&gt;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-&gt;lines.GetAt(pos);</p>
    <p>line+=(char)nChar;</p>
    <p>pDoc-&gt;lines.SetAt(pos,line);</p>
    <p>}</p>
    <p>TEXTMETRIC tm;</p>
    <p>dc.GetTextMetrics(&amp;tm);</p>
    <p>dc.TextOut(0,</p>
    <p>(int)pDoc-&gt;nLineNum*tm.tmHeight,</p>
    <p>line,</p>
    <p>line.GetLength());</p>
    <p>}</p>
    <p>pDoc-&gt;SetModifiedFlag();</p>
    <p>dc.SelectObject(pOldFont);</p>
    <p>SetScrollSizes(MM_TEXT,GetDocument()-&gt;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 + -