zoukankan      html  css  js  c++  java
  • MFC编程入门之二十一(常用控件:编辑框Edit Control)

      上一节讲了静态文本框,本节讲的是编辑框(Edit Control)同样是一种很常用的控件,我们可以在编辑框中输入并编辑文本。在前面加法计算器的例子中已经演示了编辑框的基本应用。下面具体讲解编辑框的使用。

      编辑框的通知消息

      编辑框发生某些事件时会向父窗口发送通知消息。在对话框模板中的编辑框上点击右键,选择“Add Event Handler”,为编辑框添加消息处理函数时,可以在"Message type"列表中看到这些消息。下面简单介绍编辑框的部分通知消息。

      EN_CHANGE:编辑框的内容被用户改变了,与EN_UPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的。

      EN_ERRSPACE:编辑框控件无法申请足够的动态内存来满足需要。

      EN_HSCROLL:用户在水平滚动条上单击鼠标。

      EN_KILLFOCUS:编辑框失去输入焦点。

      EN_MAXTEXT:输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL或

      ES_AUTOVSCROLL:的编辑框中,正文超出了编辑框的边框时也会发出该消息。

      EN_SETFOCUS:编辑框获得输入焦点。

      EN_UPDATE:在编辑框准备显示改变了的正文时发送改消息。

      EN_VSCROLL:用户在垂直滚动条上单击鼠标。

      编辑框的创建

      MFC为编辑框提供了CEdit类。编辑框的所有操作都封装到了CEdit类中。

      与静态文本框的创建类似,除了可以在对话框模板上拖进一个编辑框,然后关联一个变量或通过API函数使用,也可以在程序中动态创建编辑框,即调用CEdit类的成员函数CReate。Create成员函数的原型如下:

      virtual BOOL Create(

        DWORD dwStyle,

        const RECT& rect,

        CWnd* pParentWnd,

        UINT nID

      );

      参数说明:

      dwStyle:指定编辑框的风格。可以是MSDN中"edit styles"包含风格的任意组合。下面是"edit styles"的所有风格说明。

      ES_AUTOHSCROLL:当用户在行尾键入一个字符是,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。

      ES_AUTOVSCROLL:当用户在最后一个可见行按回车键时,正文向上滚动一页。

      ES_CENTER:在多行编辑框中使用正文居中。

      ES_LEFT:左对齐正文。

      ES_LOWERCASE:把用户输入的字母统统转换成小写字母。

      ES_MULTILINE:指定一个多行编辑器。若多行编辑器不指定ES_AUTOHSCROLL风格,则会自动换行,若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。

      ES_NOHIDESEL:默认时,当编辑框失去输入焦点会隐藏所选的正文,当获得输入焦点时又显示出来。设置该风格可禁止这种默认行为。

      ES_NUMBER:编辑框中只允许输入数字。

      ES_OEMCONVERT:使用编辑框中的正文可以在ANSI字符集和OEM字符集之间相互转换。这在编辑框中包含文件名时是很有用的。

      ES_PASSWORD:使所有键入的字符都用"*"来显示。

      ES_READONLY:将编辑框设置成只读的。

      ES_RIGHT:右对齐正文。

      ES_UPPERCASE:把用户输入的字母统统转换成大写字母。

      ES_WANTRETURN:使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择默认的命令按钮,这往往会导致对话框的关闭。

      除了上面的风格外,编辑框一般还会设置WS_CHILD、WS_VISIBLE、WS_BORDER等窗口风格。另外,编辑框可以是多行的,也就是在编辑框中显示多行文字,这就需要设置ES_MULTILINE风格,如果想要多行编辑框支持回车键,则还要设置ES_WANTRETURN。

      对于在对话框模板中创建编辑框,它的属性中包含了上述的风格,例如,Multiline属性对应的就是ES_MULTILINE风格,Want Return属性对应ES_EANTRETURN风格。

      其他三个参数与静态文本框的Create函数的参数类似,就不介绍了。

      CEdit类的主要成员函数

      使用编辑框最重要的莫过于,获取和设置编辑框中的正文,它们对应的成员函数分别是GetWindowText和SetWindowText,这两个函数都是继承自CWnd类的成员函数,另外,还可以使用CWnd类的GetWindowTextLength函数获取编辑框中的正文的长度。

      下面简单介绍CEdit类的其他几个主要的成员函数:

      int LineFromChar(int nIndex = -1) const;

      返回多行编辑框中指定索引的字符所在行的行号(从零开始),只适用用于多行编辑框。nIndex等于-1则返回所选择正文的第一个字符所在行的索引。如果没有选择正文,则返回当前行的行号。

      int LineIndex(int nLine = -1) const;

      返回由nLine指定行的起始字符在编辑框的整个字符串中的索引,只适用于多行编辑框。如果制定行超过编辑框的最大行数,则返回-1,如果nLine为-1,则返回当前插入符所在行的起始字符的索引。

      void GetSel(int& nStartChar, int& nEndChar) const;

      获取选择正文的索引范围。nStartChar返回被选择正文的起始索引,nEndChar返回被选择正文的终止索引(不包括在选择范围内)。如果没有选择正文,则两者均为当前插入符的索引。

      void SetSel(int& nStartChar, int& nEndChar) const;

      选择编辑框中的正文。nStartChar为选择开始处的索引,nEndChar为选择结束处的索引。如果nStartChar为0并且nEndChar为-1,则选择所有正文,而如果nStartChar为-1则取消所有选择。bNoScroll为FALSE时滚动插入符并使之可见,为TRUE时不滚动。

      void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);

      用lpszNewText指向的字符串来替换选择的正文。如果bCanUndo为TRUE则替换可以被取消。

      

      int LineLength(int nLine = -1) const;

      获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内),参数nLine说明了为字符索引。如果nLine的值为-1,则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个行的长度。

      

      int GetLine(int nIndex, LPCTSTR lpszBuffer) const;

      int GetLine(int nIndex, LPCTSTR lpszBuffer, int nMaxLength) const;

      用来获得指定的正文(不包括行尾的回车和换行符),只适用于多行编辑框。参数nIndex是行号,lpszBuffer指向存放正文的缓冲区,nMaxLength规定了拷贝的最大字节数。若指定的行号小于编辑框的实际行数,函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,GetLine函数不会在缓冲区中字符串的末尾添加字符串结束符(NULL)。

      

      UINT GetLimitText() const

      获取编辑框能够接受的正文的最大字节数。

      void LimitText(int nChars = 0);

      设置用户在编辑框中可以输入的正文的最大长度(字节数)。如果nChars为0,则最大长度为UINT_MAX个字节。如果nChars为0,则最大长度为UINT_MAX个字节。

  • 相关阅读:
    Educational Codeforces Round 83 --- F. AND Segments
    Educational Codeforces Round 83 --- G. Autocompletion
    SEERC 2019 A.Max or Min
    2019-2020 ICPC Southwestern European Regional Programming Contest(Gym 102501)
    Educational Codeforces Round 78 --- F. Cards
    今天我学习了一门全新的语言
    codeforces 1323D 题解(数学)
    Educational Codeforces Round 80 (Div. 2) 题解 1288A 1288B 1288C 1288D 1288E
    Educational Codeforces Round 81 (Div. 2) 题解 1295A 1295B 1295C 1295D 1295E 1295F
    Codeforces Round #617 (Div. 3) 题解 1296C 1296D 1296E 1296F
  • 原文地址:https://www.cnblogs.com/mupiaomiao/p/6233513.html
Copyright © 2011-2022 走看看