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

📄 chap6_1.htm

📁 VC++编程实例。非常详细
💻 HTM
📖 第 1 页 / 共 5 页
字号:
        <td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">ES_READONLY</span></td>
        <td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">将编辑框设置成只读的。</span></td>
      </tr>
      <tr>
        <td WIDTH="31%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">ES_WANTRETURN</span></td>
        <td WIDTH="69%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。</span></td>
      </tr>
    </table>
    <p><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">除了上表中的风格外,一般还要为控件指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_BORDER窗口风格,WS_BORDER使控件带边框。创建一个普通的单行编辑框应指定风格为WS_CHILD|WS_VISIBLE|WS_TABSTOP 
    |WS_BORDER|ES_LEFT|ES_AUTOHSCROLL,这将创建一个带边框、左对齐正文、可水平滚动的单行编辑器。要创建一个普通多行编辑框,还要附加ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL 
    |WS_HSCROLL| WS_VSCROLL风格,这将创建一个可水平和垂直滚动的,带有水平和垂直滚动条的多行编辑器。</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">对于用对话框模板编辑器创建的编辑框控件,可以在控件的属性对话框中指定表6.6中列出的控件风格。例如,在属性对话框中选择Multi-line项,相当与指定了ES_MULTILINE风格。</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">编辑框支持剪贴板操作。CEdit类提供了一些与剪贴板有关的成员函数,如表6.7所示。</span></p>
    <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p>
    <p ALIGN="CENTER"><span style="font-size: 9pt">表6.7 与剪切板有关的CEdit成员函数</span></b></p>
    <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
      <tr>
        <td WIDTH="35%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">函数声明</span></b></td>
        <td WIDTH="65%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用途</span></b></td>
      </tr>
      <tr>
        <td WIDTH="35%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">void Clear( )</span></td>
        <td WIDTH="65%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">清除编辑框中被选择的正文。</span></td>
      </tr>
      <tr>
        <td WIDTH="35%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">void Copy( )</span></td>
        <td WIDTH="65%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">把在编辑框中选择的正文拷贝到剪贴板中。</span></td>
      </tr>
      <tr>
        <td WIDTH="35%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">void Cut( )</span></td>
        <td WIDTH="65%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">清除编辑框中被选择的正文并把这些正文拷贝到剪贴板中。</span></td>
      </tr>
      <tr>
        <td WIDTH="35%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">void Paste( )</span></td>
        <td WIDTH="65%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">将剪贴板中的正文插入到编辑框的当前插入符处。</span></td>
      </tr>
      <tr>
        <td WIDTH="35%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL Undo( )</span></td>
        <td WIDTH="65%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">撤消上一次键入。对于单行编辑框,该函数总返回TRUE,对于多行编辑框,返回TRUE表明操作成功,否则返回FALSE。</span></td>
      </tr>
    </table>
    <p><b><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以用下列CEdit或CWnd类的成员函数来查询编辑框。在学习下面的函数时,读者会经常遇到术语字符索引.字符的字符索引是指从编辑框的开头字符开始的字符编号,它是从零开始编号的.也就是说,字符索引实际上是指当把整个编辑正文看作一个字符串数组时,该字符所在的数组元素的下标.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
    <blockquote>
      <blockquote>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int GetWindowText( LPTSTR lpszStringBuf, 
        int nMaxCount ) const;<br>
        void GetWindowText( CString&amp; rString ) const;<br>
        这两个函数均是CWnd类的成员函数,可用来获得窗口的标题或控件中的正文。第一个版本的函数用lpszStringBuf参数指向的字符串数组作为拷贝正文的缓冲区,参数nMaxCount可以拷贝到缓冲区中的最大字符数,该函数返回以字节为单位的实际拷贝字符数(不包括结尾的空字节)。第二个版本的函数用一个CString对象作为缓冲区。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int GetWindowTextLength( ) const;<br>
        CWnd的成员函数,可用来获得窗口的标题或控件中的正文的长度。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">DWORD GetSel( ) const;<br>
        void GetSel( int&amp; nStartChar, int&amp; nEndChar ) const;<br>
        两个函数都是CEdit的成员函数,用来获得所选正文的位置。GetSel的第一个版本返回一个DWORD值,其中低位字说明了被选择的正文开始处的字符索引,高位字说明了选择的正文结束处的后面一个字符的字符索引,如果没有正文被选择,那么返回的低位和高位字节都是当前插入符所在字符的字符索引。GetSel的第二个版本的两个参数是两个引用,其含义与第一个版本函数返回值的低位和高位字相同。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int LineFromChar( int nIndex = –1 ) 
        const;<br>
        CEdit的成员函数,仅用于多行编辑框,用来返回指定字符索引所在行的行索引(从零开始编号)。参数nIndex指定了一个字符索引,如果nIndex是-1,那么函数将返回选择正文的第一个字符所在行的行号,若没有正文被选择,则该函数会返回当前的插入符所在行的行号。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int LineIndex( int nLine = –1 ) const;<br>
        CEdit的成员函数,仅用于多行编辑框,用来获得指定行的开头字符的字符索引,如果指定行超过了编辑框中的最大行数,该函数将返回-1。参数nLine是指定了从零开始的行索引,如果它的值为-1,则函数返回当前的插入符所在行的字符索引。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int GetLineCount( ) const;<br>
        CEdit的成员函数,仅用于多行编辑框,用来获得正文的行数。如果编辑框是空的,那么该函数的返回值是1。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int LineLength( int nLine = –1 ) const;<br>
        CEdit的成员函数,用于获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内)。参数nLine说明了字符索引.如果nLine的值为-1,则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个正文的长度。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int GetLine( int nIndex, LPTSTR lpszBuffer 
        ) const;<br>
        int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;<br>
        CEdit的成员函数,仅用于多行编辑框,用来获得指定行的正文(不包括行尾的回车和换行符)。参数nIndex是行号,lpszBuffer指向存放正文的缓冲区,nMaxLength规定了拷贝的最大字节数,若。函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,GetLine函数不会在缓冲区中字符串的末尾加字符串结束符(NULL).</span></p>
      </blockquote>
    </blockquote>
    <p><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">下列CWnd或CEdit类的成员函数可用来修改编辑框控件。</span></p>
    <blockquote>
      <blockquote>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void SetWindowText( LPCTSTR lpszString );<br>
        CWnd的成员函数,可用来设置窗口的标题或控件中的正文。参数lpszString可以是一个CString对象,或是一个指向字符串的指针。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void SetSel( DWORD dwSelection, BOOL 
        bNoScroll = FALSE );<br>
        void SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE );<br>
        CEdit的成员函数,用来选择编辑框中的正文。参数dwSelection的低位字说明了选择开始处的字符索引,高位字说明了选择结束处的字符索引。如果低位字为0且高位字节为-1,那么就选择所有的正文,如果低位字节为-1,则取消所有的选择.参数bNoScroll的值如果是FALSE,则滚动插入符并使之可见,否则就不滚动.参数nStartChar和nEndChar的含义与参数dwSelection的低位字和高位字相同.</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void ReplaceSel( LPCTSTR lpszNewText, BOOL 
        bCanUndo = FALSE );<br>
        CEdit的成员函数,用来将所选正文替换成指定的正文.参数lpszNewText指向用来替换的字符串.参数bCanUndo的值为TRUE说明替换是否可以被撤消的.</span></p>
      </blockquote>
    </blockquote>
    <p><span style="font-size: 9pt"> </span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">在调用上述函数时,如果涉及的是一个多行编辑框,那么除了LineLength和GetLine函数外,都要把回车和换行符考虑在内.例如,假设在编辑框中有如下几行正文:</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">abcd</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">efg</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ij</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">那么字母"e"的字符索引是6而不是4,因为"abcd"后面还有一对回车换行符.调用LineLength(7)会返回第二行的长度3.调用LineIndex(2)会得到11.调用LineFromChar(8)会返回1.如果没有选择任何正文,并且插入符在字母"e"上,那么调用GetSel返回值的低位和高位字都是6.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">通过分析上述函数,我们可以总结出一些查询和设置编辑框的方法.</span></p>
    <blockquote>
      <blockquote>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">调用CWnd的成员函数GetWindowText和SetWindowText可以查询和设置编辑框的整个正文,在上一章的Register程序中,我们就使用过这两个函数.</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">如果想对多行编辑框逐行查询,那么应该先调用GetLineCount获得总行数,然后再调用GetLine来获取每一行的正文.下面一段代码演示了如何对多行编辑框进行逐行查询.</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">char buf[40];</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int total=MyEdit.GetLineCount();</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int i,length;</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">for(i=0;i&lt;total;i++)</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">length=MyEdit.GetLine(i,buf,39);</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">buf[length]=0; //加字符串结束符</span></p>
        <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt">. . . . . .</span></p>
        </b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以利用LineIndex和LineFromChar来在字符索引和字符的行列坐标之间相互转换.下列代码演示了在已知字符索引的情况下,如何获得对应的行列坐标:<br>
        int row,column;<br>
        row=MyEdit.LineFromChar(charIndex);<br>
        column=charIndex-MyEdit.LineIndex(row);<br>
        下列代码演示了在已知字符的行列坐标的情况下,如何获得对应的字符索引:<br>
        int charIndex;<br>
        charIndex=MyEdit.LineIndex(row)+column;<br>
        不难看出字符索引与对应的行列坐标的关系是:字符索引=LineIndex(行坐标)+列坐标.</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">对于选择正文的查询和设置,应该利用函数GetSel、SetSel和ReplaceSel.</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以利用GetSel和SetSel来查询和设置插入符的位置.SetSel可以使编辑框滚动到插入符的新位置.<br>
        要获取插入符的行列坐标,可用下面的代码实现:<br>
        MyEdit.SetSel(-1,0); //取消正文的选择<br>
        int start,end,row,column;<br>
        MyEdit.GetSel(start,end); //start或end的值就是插入符的字符索引<br>
        row=MyEdit.LineFromChar(start); //获取插入符的行坐标<br>
        column=start-MyEdit.LineIndex(row); //获取插入符的列坐标<br>
        下面的代码演示了如何把插入符移到指定的行和列:<br>
        MyEdit.SetSel(-1,0); //取消正文的选择<br>
        int charIndex=MyEdit.LineIndex(row)+column;<br>
        MyEdit.SetSel(charIndex,charIndex);</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以利用ReplaceSel函数在 
        插入符处插入正文,典型的代码如下所示:<br>
        MyEdit.SetSel(-1,0); //取消正文的选择<br>
        MyEdit.ReplaceSel(“......”);</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以利用ReplaceSel清除编辑框中的正文,典型的代码如下所示:<br>
        MyEdit.SetSel(0,-1); //选择全部正文<br>
        MyEdit.ReplaceSel(“”);</span></p>
      </blockquote>
    </blockquote>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">在后面的小节中,读者将会看到使用编辑框的例子.</span></p>
    <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">.1.5 
    滚动条控件</font></span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">滚动条(Scroll Bar)主要用来从某一预定义值范围内快速有效地进行选择.滚动条分垂直滚动条和水平滚动条两种.在滚动条内有一个滚动框,用来表示当前的值.用鼠标单击滚动条,可以使滚动框移动一页或一行,也可以直接拖动滚动框.滚动条既可以作为一个独立控件存在,也可以作为窗口、列表框和组合框的一部分.Windows 
    95的滚动条支持比例滚动框,即用滚动框的大小来反映页相对于整个范围的大小.Windows 
    3.x使用单独的滚动条控件来调整调色板、键盘速度以及鼠标灵敏度,在Windows 
    95中,滚动条控件被轨道条取代(参见6.2.3)不提倡使用单独的滚动条控件.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">需要指出的是,从性质上划分,滚动条可分为标准滚动条和滚动条控件两种.标准滚动条是由WS_HSCROLL或WS_VSCROLL风格指定的,它不是一个实际的窗口,而是窗口的一个组成部分(例如列表框中的滚动条),只能位于窗口的右侧(垂直滚动条)或底端(水平滚动条).标准滚动条是在窗口的非客户区中创建的.与之相反,滚动条控件并不是窗口的一个零件,而是一个实际的窗口,可以放置在窗口客户区的任意地方,它既可以独立存在,也可以与某一个窗口组合,行使滚动窗口的职能.由于滚动条控件是一个独立窗口,因此可以拥有输入焦点,可以响应光标控制键,如PgUp、PgDown、Home和End.</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC的CScrollBar类封装了滚动条控件.CScrollBar类的Create成员函数负责创建控件,该函数的声明为</span></p>
    <blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -