📄 chap7_3.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>7.3 让文档视结构程序支持卷滚</title>
</head>
<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="4"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="4">7.3 </font><font SIZE="4" color="#3973DE">让文档视结构程序支持卷滚</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">但是,编辑器现在还不支持卷滚。当文本行超过窗口大小时,窗口并不自动向上滚动以显示输入的字符。当打开一个文件时,如果文件大小超过窗口大小,也无法通过卷滚视图来看文档的全部内容。现在我们要让编辑器增加卷滚功能。</font><font FACE="Times New Roman" SIZE="3"><b></p>
<p></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">7.3.1</font><font SIZE="3" color="#3973DE">逻辑坐标和设备坐标</font><font FACE="Times New Roman" SIZE="3"></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">Windows</font><font SIZE="3">中,文档坐标系称作逻辑坐标系,视图坐标系称为设备坐标系。它们之间的关系如下图所示:</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="CENTER"></font><font SIZE="3"><img src="T7_11.gif" alt="T7_11.tif (107238 bytes)" WIDTH="341" HEIGHT="201"></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-11</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">8</font><font SIZE="3">种,它们在坐标上的特性如下表所示:</p>
<p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">7-1 </font><font SIZE="3">各种映射模式下的坐标转换方式</font></p>
<div align="center"><center><table BORDER="1" CELLSPACING="2" BORDERCOLOR="#7F7F7F" CELLPADDING="1" WIDTH="400" height="259">
<tr>
<td WIDTH="33%" height="35"><font SIZE="3">映射模式</font></td>
<td WIDTH="28%" height="35"><font SIZE="3">逻辑单位</font></td>
<td WIDTH="19%" height="35"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">x</font><font SIZE="3">递增方向</font></td>
<td WIDTH="19%" height="35"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">y</font><font SIZE="3">递增方向</font></td>
</tr>
<tr>
<td WIDTH="33%" height="19"><font FACE="Times New Roman" SIZE="3">MM_TEXT</font></td>
<td WIDTH="28%" height="19"><font SIZE="3">像素</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向右</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向下</font></td>
</tr>
<tr>
<td WIDTH="33%" height="19"><font FACE="Times New Roman" SIZE="3">MM_LOMETRIC</font></td>
<td WIDTH="28%" height="19"><font FACE="Times New Roman" SIZE="3">0.1mm</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向右</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向上</font></td>
</tr>
<tr>
<td WIDTH="33%" height="19"><font FACE="Times New Roman" SIZE="3">MM_HIMETRIC</font></td>
<td WIDTH="28%" height="19"><font FACE="Times New Roman" SIZE="3">0.01mm</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向右</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向上</font></td>
</tr>
<tr>
<td WIDTH="33%" height="18"><font FACE="Times New Roman" SIZE="3">MM_LOENGLISH</font></td>
<td WIDTH="28%" height="18"><font FACE="Times New Roman" SIZE="3">0.01inch</font></td>
<td WIDTH="19%" height="18"><font SIZE="3"><p ALIGN="CENTER">向右</font></td>
<td WIDTH="19%" height="18"><font SIZE="3"><p ALIGN="CENTER">向上</font></td>
</tr>
<tr>
<td WIDTH="33%" height="19"><font FACE="Times New Roman" SIZE="3">MM_HIENGLISH</font></td>
<td WIDTH="28%" height="19"><font FACE="Times New Roman" SIZE="3">0.001inch</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向右</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向上</font></td>
</tr>
<tr>
<td WIDTH="33%" height="19"><font FACE="Times New Roman" SIZE="3">MM_TWIPS</font></td>
<td WIDTH="28%" height="19"><font FACE="Times New Roman" SIZE="3">1/1440inch</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向右</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">向上</font></td>
</tr>
<tr>
<td WIDTH="33%" height="19"><font FACE="Times New Roman" SIZE="3">MM_ISOTROPIC</font></td>
<td WIDTH="28%" height="19"><font SIZE="3">可调整 </font><font FACE="Times New Roman" SIZE="3">(x=y)</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">可选择</font></td>
<td WIDTH="19%" height="19"><font SIZE="3"><p ALIGN="CENTER">可选择</font></td>
</tr>
<tr>
<td WIDTH="33%" height="38"><font FACE="Times New Roman" SIZE="3">MM_ANISOTROPIC</font></td>
<td WIDTH="28%" height="38"><font SIZE="3">可调整(</font><font FACE="Times New Roman" SIZE="3">x!=y</font><font SIZE="3">)</font></td>
<td WIDTH="19%" height="38"><font SIZE="3"><p ALIGN="CENTER">可选择</font></td>
<td WIDTH="19%" height="38"><font SIZE="3"><p ALIGN="CENTER">可选择</font></td>
</tr>
</table>
</center></div><p><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">MM_TEXT</font><font SIZE="3">,它也是缺省设置。在该模式下,坐标原点在工作区左上角,而</font><font FACE="Times New Roman" SIZE="3">x</font><font SIZE="3">坐标值是向右递增,</font><font FACE="Times New Roman" SIZE="3">y</font><font SIZE="3">坐标值是向下递增,单位值</font><font FACE="Times New Roman" SIZE="3">1</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">CDC::SetMapMode()</font><font SIZE="3">函数。</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CClientDC dc;</p>
<p>nPreMapMode=dc.SetMapMode(nMapMode);</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">它将映射模式设置为</font><font FACE="Times New Roman" SIZE="3">nMapMode</font><font SIZE="3">,并返回前一次的映射模式</font><font FACE="Times New Roman" SIZE="3">nPreMapMode</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">GetMapMode</font><font SIZE="3">可取得当前的映射模式:</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CClientDC dc;</p>
<p>nMapMode=dc.GetMapMode();</p>
<p>MFC</font><font SIZE="3">绘图函数都使用逻辑坐标作为位置参数。比如</font><font FACE="Times New Roman" SIZE="3"></p>
<p>CString str(</font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">Hello,world!</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">);</p>
<p>dc.TextOut(10,10,str,str.GetLength());</p>
<p></font><font SIZE="3">这里的</font><font FACE="Times New Roman" SIZE="3">(10,10)</font><font SIZE="3">是逻辑坐标而不是像素点数(只是在缺省映射模式</font><font FACE="Times New Roman" SIZE="3">MM_TEXT</font><font SIZE="3">下,正好与像素点相对应),在输出时</font><font FACE="Times New Roman" SIZE="3">GDI</font><font SIZE="3">函数会将逻辑坐标</font><font FACE="Times New Roman" SIZE="3">(10,10)</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">x</font><font SIZE="3">轴坐标值向右递增,</font><font FACE="Times New Roman" SIZE="3">y</font><font SIZE="3">轴坐标值向下递增,但原点</font><font FACE="Times New Roman" SIZE="3">(0,0)</font><font SIZE="3">位置却不限定在工作区的左上角。依据设备坐标的原点和用途,可以将</font><font FACE="Times New Roman" SIZE="3">Windows</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">1</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">(0,0)</font><font SIZE="3">,主要用于窗口客户区绘图输出以及处理窗口的一些消息。鼠标消息</font><font FACE="Times New Roman" SIZE="3">WM_LBUTTONDOWN</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">WM_MOUSEMOVE</font><font SIZE="3">传给框架的消息参数以及</font><font FACE="Times New Roman" SIZE="3">CDC</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">2</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">0,0</font><font SIZE="3">)。以</font><font FACE="Times New Roman" SIZE="3">CreateDC(</font><font SIZE="3">“</font><font FACE="Times New Roman" SIZE="3">DISPLAY</font><font SIZE="3">” </font><font FACE="Times New Roman" SIZE="3">, ...)</font><font SIZE="3">或</font><font FACE="Times New Roman" SIZE="3">GetDC(NULL)</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">SetCursorPos()</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">GetCursorPos()</font><font SIZE="3">;由于光标可以在任何一个窗口之间移动,它不属于任何一个单一的窗口,因此使用屏幕坐标。弹出式菜单使用的也是屏幕坐标。另外,</font><font FACE="Times New Roman" SIZE="3">CreateWindow</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">MoveWindow</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">SetWindowPlacement()</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">3</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">,</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 ALIGN="CENTER"></font><font SIZE="3"><img src="T7_12.gif" alt="T7_12.tif (166822 bytes)" WIDTH="415" HEIGHT="277"></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-12.
</font><font SIZE="3">三类设备坐标</font><font FACE="Times New Roman" SIZE="3"></p>
<p>MFC</font><font SIZE="3">提供</font><font FACE="Times New Roman" SIZE="3">ClientToScreen()</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">ScreenToClient()</font><font SIZE="3">两个函数用于完成工作区坐标和屏幕坐标之间的转换工作。</p>
<blockquote>
<blockquote>
</font><font FACE="Times New Roman" SIZE="3"><p></font><font FACE="Arial" SIZE="2"><b>void</b>
<b>ScreenToClient(</b> <b>LPPOINT</b> <i>lpPoint</i> <b>)</b> <b>const;</p>
</b></font><font FACE="Times New Roman" SIZE="3"><p></font><font FACE="Arial" SIZE="2"><b>void</b>
<b>ScreenToClient(</b> <b>LPRECT</b> <i>lpRect</i> <b>)</b> <b>const;</p>
<p>void</b> <b>ClientToScreen(</b> <b>LPPOINT</b> <i>lpPoint</i> <b>)</b> <b>const;</p>
</b></font><p><font FACE="Arial" SIZE="2"><b>void</b> <b>ClientToScreen(</b> <b>LPRECT</b>
<i>lpRect</i> <b>)</b> <b>const;</b></font></p>
</blockquote>
</blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -