VC编辑框控件的一些用法_第1页
VC编辑框控件的一些用法_第2页
VC编辑框控件的一些用法_第3页
VC编辑框控件的一些用法_第4页
VC编辑框控件的一些用法_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、r表示回车不换行,n表示回车换行mfc中一些使用的方法1 在csatic控件上增加图标及位图cstatic *pstat = null;pstat = (cstatic*)getdlgitem(控件id); pstat-modifystyle(swp_nozorder, ss_icon); 可用两种方法增加图标(1) pstat-seticon(afxgetapp()-loadicon(图标id);(2) pstat-seticon(loadicon(:afxgetinstancehandle(),”图标名称”); /图标名字改为“idi_icon”的形式,因为这里要求的是字符串形式的名称。

2、增加bmp图片的形式同上,将modifystyle中的ss_icon改为ss_bitmap。用相应的位图增加函数即可。 2 cclientdc,cwindowdc这两个类都从cdc类派生,cclientdc类用于获取客户区的dc(不包括标题栏,菜单栏,工具栏),创建了cclientdc类对象后不需用releasedc来释放。如:ccleintdc dc(this);获取本窗口的dc,cclientdc dc(getparent()可获取父窗口dc,此时就可在非客户区进行dc操作。cwindowdc 获取整个窗口的dc,可对整个窗口进行操作,cwindowdc(getparent()注意在这获得

3、的父窗口对于对话框情况下将是windows窗口,最后无需releasedc释放 getdesktopwindow()获取桌面窗口句柄。 :createic(display,null,null,null);获取桌面的hdc 3 获取随机数rand()要获取一定范围内的随机数可用:srand(unsigned) time(null); /意思是每次产生的随机数都不相同.(int)(rand()/(float) rand_max * 10); /返回110之间的随机数 4 获取路径:char pathmax_path = 0; getmodulefilename(null, path, max_pa

4、th); /应用程序路径 getsystemdirectory(); /获取windows系统目录路径 getwindowdirectory() /获取windows目录路径 5 动态加载odbc数据源/mdbname为数据库名称, dsn为数据源名称 void setodbcsource(char * mdbname ,char * dsnname) char path256=; char pathmdb256=; getapppath(path); strcpy(pathmdb,path); strcat(pathmdb, ); strcat(pathmdb, mdbname); char

5、 mdbconfig256= dsn= ;/ pwd strcat(mdbconfig , dsnname); char * pmconfig = mdbconfig + strlen(mdbconfig) + 1 ; strcpy(pmconfig,dbq=); pmconfig += 4; strcat(pmconfig,pathmdb); pmconfig += strlen(pathmdb) + 1 ; strcpy(pmconfig,defaultdir=); strcat(pmconfig,path); strcat(pmconfig,0);if(!sqlconfigdatasou

6、rce(null,odbc_add_sys_dsn,microsoft access driver (*.mdb)0,mdbconfig) /注意driver后的空格 trace(加载数据库失败,请检查数据库是否存在n); return; 6 线程退出线程退出请使用return 或 exitthread()来正常退出线程,尽是避免使用terminatethread来终止线程,因为终止后线程资源将不会被释放。一般情况下在createthread创建了线程后即使用closehandle()来关闭线程句柄,以防止terminatethread得到句柄后,进行线程的强制终止。 7 自定义宏检查错误bo

7、ol错误。#define assert_error(code) if (code) afxmessagebox(“提示1 “); else afxmessagebox(“错误1”);定义以后可在需要使用的地方使用,如:bool bstat = true;assert_error(bstat); /此时将执行“提示1”,bstat = false时执行“错误1” 8 将程序加入注册表启动项:lpctstr lpcapppath = “程序路径”;cstring str = “softwaremicrosoftwindowscurrentversionrun”;hkey hresult;regop

8、enkey(hkey_local_machine, (lpcstr)str.getbuffer(0), &hresult);regsetvalueex(hresult, “程序名称”, 0, reg_sz, (const unsigned char*)lpcapppath, sizeof(char) * strlen(lpcapppath);regclosekey(hresult); 9 程序调试在调试环境下的vlaue窗口中输入” err,hr”可返回当前发生的错误原因 10 获取工具条指针,工具条有一特殊标识(afx_idw_toolbar)ctoolbar *ptool = (ctool

9、bar*)afxgetmainwnd()-getdescendantwindow(特殊标识);获取状态条指针。(cstatusbar*)afxgetmainwnd()-getdescendantwindow(afx_idw_status_bar); 获取主窗口指针:cmainframe *pframe = (cmainframe*)(afxgetapp()-m_pmainwnd); 获取视类指针:cmyview *pview= cmyview*)(cmainframe*)afxgetapp()-m_pmainwnd)-getactiveview(); 或cmyview *pview=(cmyv

10、iew*)getactiveview(); 11显示或隐藏任务栏: :showwindow(:findwindow(“shell_traywnd”, null, sw_show),隐藏用sw_hide 12使用基于对话框的程序在任务栏隐藏。 this-modifystyleex(ws_ex_appwindow, 0); 13只允许程序运行一个实例: handle h_muex = createmutex(null, true, m_pszappname); if (getlasterror() = error_already_exists) return false; ccombobox 使用

11、 1. 清空所有内容mctrl.resetcontent()2. 改变下拉框的大小在编辑资源对话框上,点combobox右边下拉框的箭头,用鼠标就可以改变combobox的高度(拉下面的边),会出来一个矩形框,那就对了. 3. 添加一个字符串mctrl.addstring(hello); vc6中ccombobox的使用 4. 1、初始化列表如果这个ccombobox放在一个对话框类内,则不可在对话框的构造函数内来初始化combobox,可以放在对话框的onshow事件内。2、取得当前选中的内容;得到当前选中项内容: int nindex = getcursel(), getlbtext(ni

12、ndex, str);清除列表内容:resetcontent();combo box控件1.你在编辑状态下点那个控件的向下的三角形,就出冒出来一个可以调高度的东东。将高度调高,否则在执行时会不能显示下拉选项。2.为combo box添加选项,在编辑状态下选combo box控件的属性,选data标签,在编辑框中添加选项,按ctrl-enter来添加下一个选项。3.为combo box添加变量 combo box有两个变量,ccombobox类变量和cstring变量。 ccombobox变量用来设置combo box的属性,一般在cdialog类中的oninitdialog()函数中使用。添加

13、方法是在classwizard中添加变量,添加时category中选control。例如:ccombobox.setcursel(0)用来设置下拉菜单初始值,具体看msdn。 cstring变量用来存储下拉菜单所选的选项值。同样,当选项发生变化时要使用updatedata(true)函数更新该变量的值。编辑框控件的一些用法 二、关于编辑框的赋值和取值向编辑框中赋值和取值时:1、建一个 控制型的变量,如m_edit1,用cwnd的setwindowtext() 和getwindowtext()来赋值和取值。m_edit1.setwindowtext(hello); 或者getdlgitem(id

14、c_edit1)-setwindowtext(str);2、建立一个控制型的变量,如m_edit1,用setdlgitemtext()和getdlgitemtext()来赋值和取值cstring str=hello:m_edit1.setdlgitemtext(idc_edit1,str);2、直接建一个 数值形的变量 如m_stredit;用 updatedata()来控制得到变量,还是更新变量。/取值 updatedata(true); cstring buf = m_edit1; /赋值 m_edit1=ok!; updatedata(false);ddx_text(pdx, idc_e

15、dit1, m_usercode); 将idc_edit1编辑框控件与m_usercode变量做了关联,如果修改m_usercode之后要想对应控件显示更改,则需要调用updatedata(false);反之在idc_edit1的oneditchanged()中需要加入updatedata(true); 编辑框(edit)控件实际上是一个简易的文本编辑器,用户可以在编辑框中输入可添加或插入文本。还有复制、粘贴、剪切、删除等编辑功能。应用程序用 createwindowex 创建编辑框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(style)。常数说明es_multiline多行

16、文本,指定编辑控件可以多行文本编辑,用户每按一次 enter,在当前光标次输入一个回车换行符(0dh,0ah),文本增加一行。es_left文本显示居左。es_center文本显示居中。es_right文本显示居右。es_lowercase把用户输入的字母统统转换成小写字母。es_uppercase把用户输入的字母统统转换成大写字母。es_oemconvert使编辑框中的正文可以在 ansi 字符集和 oem 字符集之间相互转换。这在编辑框中包含文件名时是很有用的。es_autohscroll当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。es_a

17、utovscroll当用户在最后一个可见行按回车键时,正文向上滚动一页。es_number只接收数码输入,其它字符输入一律无效。es_nohidesel当编辑框失去输入焦点,正文中的选择保持不变,缺省时正文中的选择将失效。es_readonly将编辑框设置成只读的。es_password使所有键入的字符都用“*”来显示。es_wantreturn使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。 当用户在编辑控件上进行各种操作时,其父窗口将收到 wm_command 通知消息,同时 wparam 的低16位带控件的 id。lparam

18、带控件句柄(hwnd),wparam 的高16位带有如下表的消息代码。消息代码用户操作en_change编辑框的内容被用户改变了。与 en_update 不同,该消息是在编辑框显示的正文被刷新后才发出的。en_errspace编辑框控件无法申请足够的动态内存来满足需要。en_hscroll用户在水平滚动条上单击鼠标。en_killfocus编辑框失去输入焦点。en_maxtext输入的字符超过了规定的最大字符数。在没有 es_autohscroll 或es_autovscroll 的编辑框中,当正文超出了编辑框的边框时也会发出该消息。en_setfocus编辑框获得输入焦点。en_update

19、在编辑框准备显示改变了的正文时发送该消息。en_vscroll用户在垂直滚动条上单击鼠标。应用程序可以通过调用 sendmessage 向控件发送如下消息来设定和查询控件各种参数。umsgwparamlparam说明em_undo00撤消前一次在控件的编辑操作,当重复发送本消息,控件将在撤消和恢复中来回切换。em_canundo00检测控件撤消缓冲区是否为空,通常控件把最后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回 true 表示上次操作可以撤消,否则返回 false,应用程序可以利用该返回值来禁止或允许菜单或工具条的“撤消”项。em_emptyundobuffer00清除

20、控件的撤消缓冲区,使其不能撤消前一次编辑操作。em_replaceseltrue或false替换文本指针用指定文本替换编辑控件中的当前选定内容,如果 wparam 为 true,则本次操作允许撤消,false 禁止撤消。em_setsel起点终点设置编辑控件中文本选定内容范围,该范围被高亮度显示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围。使用本功能,键盘光标将被移至指定的终点后面,通常使用指定相同起点和终点来移动键盘光标而不选定范围。当指定的起点等于0和终点等于-1时,全文全部被选中,此法常用在清空编辑控件。当指定的起点等于-2和终点等于-1时,全文均不选,键盘光标移至文本未端,此

21、法常用在文本未端追加内容。注意:当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都应调用 setfocus 先取得输入焦点。em_getsel起点缓冲地址或null终点缓冲地址或null取得编辑控件中选定内容的范围,返回值中低16位为起点与高16位为终点,如果 wparam 和 lparam 中指定了地址,则会在该地址填入相应值(dword)。本操作也常用来求取键盘光标位置。em_charfrompos0位置取得指定位置处的字符相对于文本头部的偏移,使用本操作应先在 lparam 的高16位指定行号,低16位指定列号,行列是按编辑控件的客户区左上角为原点(0,0)计算的。如果指定的位置

22、超出控件客户区则返回-1em_fmtlinestrue或false0决定是否在取回的文本宇串中包含软回车字符em_getfirstvisibleline00取得编辑控件中显示的第一行em_gethandle00取得编辑控件文本缓冲区。em_getlimittext00获取一个编辑控件中文本的最大长度em_getline行号缓冲地址从编辑控件取回一行的内容,缓冲区第一个字(word)必须先填写缓冲区的长度,em_getlinecount00取得一个编辑控件的总行数em_getmargins00获取编辑控件的左、右边距,返回值低16位为左边距,高16位为右边距em_getmodify00取编辑控件

23、的修改标志,返回true 则控件文本已被修改,返回 false 则未变。此值可以来决定是否提示用户存盘。em_getpasswordchar00取得编辑控件用来显示密码的字符,返回 null 表示没有字符。em_getrect0rect结构地址获取一个编辑控件的格式化矩形em_getthumb00取得多行文本编辑控件的滚动框的当前位置。em_getwordbreakproc00取得整字换行回调函数editwordbreakproc 指针。em_limittext最大值0限制编辑中文本的最大长度em_linefromchar字符偏移0取得指定的字符偏移处的行号。em_lineindex行号0取得

24、指定行第一个字符偏移em_linelength字符偏移0取得指定字符偏移处对应的一行长度字符数。em_linescroll列字符行数滚动编辑控件em_posfromcharpoint结构地址字符偏移取得指定字符偏移的显示位置行列号,行列是按编辑控件的客户区左上角为原点(0,0)计算的。字符偏移是相对于文本头部的偏移。em_scrollsb_linedownsb_lineupsb_pagedownsb_pageup0编辑框显示文本垂直滚动。滚动方向:sb_linedown 向下滚动一行,sb_lineup 向上滚动一行,sb_pagedown 向下滚动一页,sb_pageup 向上滚动一页。em

25、_scrollcaret00把键盘光标移至可见范围。em_sethandle缓冲区指针0为编辑控件指定新的文本缓冲区。此操作仅适用对话框创建带 ds_localedit 风格的控件。em_setlimittext长度(字节)0限制编辑控件中的文本缓冲区最大长度。em_setmarginsec_leftmarginec_rightmarginec_usefontinfo边距设置编辑控件的左、右边距,当wparam 含 ec_leftmargin 时在 lparam 的低16位指定左边距点数,当 wparam 含ec_rightmargin 时在lparam 的高16位指定右边距点数。当指定 wp

26、aram 为 ec_usefontinfo 时,则用当前字体的字符a的宽度指定右边距和字符c的宽度指定左边距 lparam 被忽略。em_setmodifytrue或false0用于设置或清除一个编辑控件的修改标志em_setpasswordchar字符0指定控件用来显示密码字符,缺省为“*”。当 wparam 为0时,本操作将清除控件的 es_password 风格,并按实际字符显示。em_setreadonlytrue或false0决定是否将编辑控件设为只读,同时决定控件的 es_readonly 风格em_setrect0rect结构地址为一个编辑控件设置格式化矩形em_setrectn

27、p0rect结构地址与 em_setrect 类似,只是控件此时不会重画em_settabstops制表站数站距表地址设置编辑控件中的制表站间距,当制表站数为0时 lparam 被忽略,所有制表站距均为32个对话框单位,当制表站数不为0时 lparam 指向一个由32位(dword)组成的站距表,以对话框单位为宽度计算单位。em_setwordbreak00本操作现已不支持,请使用em_setwordbreakproc。em_setwordbreakproc0函数入口地址设置整字换行回调函数editwordbreakproc 指针。编辑框(edit box)控件实际上是一个简易的正文编辑器,用

28、户可以在编辑框中输入并编辑正文。编辑框既可以是单行的,也可以是多行的,多行编辑框是从零开始编行号的在一个多行编辑框中,除了最后一行外,每一行的结尾处都有一对回车换行符(用rn表示)这对回车换行符是正文换行的标志,在屏幕上是不可见的编辑框控件会向父窗口发出如表6.5所示的控件通知消息.表6.5消息含义en_change编辑框的内容被用户改变了。与en_update不同,该消息是在编辑框显示的正文被刷新后才发出的。en_errspace编辑框控件无法申请足够的动态内存来满足需要。en_hscroll用户在水平滚动条上单击鼠标。en_killfocus编辑框失去输入焦点。en_maxtext输入的字

29、符超过了规定的最大字符数。在没有es_autohscroll或es_autovscroll的编辑框中,当正文超出了编辑框的边框时也会发出该消息。en_setfocus编辑框获得输入焦点。en_update在编辑框准备显示改变了的正文时发送该消息。en_vscroll用户在垂直滚动条上单击鼠标。mfc的cedit类封装了编辑框控件。cedit类的成员函数create负责创建按钮控件,该函数的声明为bool create( dword dwstyle, const rect& rect, cwnd* pparentwnd, uint nid );参数dwstyle指定了编辑框控件风格,如表6.6所

30、示,dwstyle可以是这些风格的组合。rect指定了编辑框的位置和尺寸。pparentwnd指定了父窗口,不能为null。编辑框的id由nid指定。如果创建成功,该函数返回true,否则返回false表6.6 编辑框控件的风格控件风格含义es_autohscroll当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。es_autovscroll当用户在最后一个可见行按回车键时,正文向上滚动一页。es_center在多行编辑框中使正文居中。es_left左对齐正文。es_lowercase把用户输入的字母统统转换成小写字母。es_multiline指定

31、一个多行编辑器。若多行编辑器不指定es_autohscroll风格,则会自动换行,若不指定es_autovscroll,则多行编辑器会在窗口中正文装满时发出警告声响。es_nohidesel缺省时,当编辑框失去输入焦点后会隐藏所选的正文,当获得输入焦点时又显示出来。设置该风格可禁止这种缺省行为。es_oemconvert使编辑框中的正文可以在ansi字符集和oem字符集之间相互转换。这在编辑框中包含文件名时是很有用的。es_password使所有键入的字符都用“*”来显示。es_right右对齐正文。es_uppercase把用户输入的字母统统转换成大写字母。es_readonly将编辑框设置

32、成只读的。es_wantreturn使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。除了上表中的风格外,一般还要为控件指定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_want

33、return|es_autovscroll |ws_hscroll| ws_vscroll风格,这将创建一个可水平和垂直滚动的,带有水平和垂直滚动条的多行编辑器。对于用对话框模板编辑器创建的编辑框控件,可以在控件的属性对话框中指定表6.6中列出的控件风格。例如,在属性对话框中选择multi-line项,相当与指定了es_multiline风格。编辑框支持剪贴板操作。cedit类提供了一些与剪贴板有关的成员函数,如表6.7所示。表6.7 与剪切板有关的cedit成员函数函数声明用途void clear( )清除编辑框中被选择的正文。void copy( )把在编辑框中选择的正文拷贝到剪贴板中。v

34、oid cut( )清除编辑框中被选择的正文并把这些正文拷贝到剪贴板中。void paste( )将剪贴板中的正文插入到编辑框的当前插入符处。bool undo( )撤消上一次键入。对于单行编辑框,该函数总返回true,对于多行编辑框,返回true表明操作成功,否则返回false。可以用下列cedit或cwnd类的成员函数来查询编辑框。在学习下面的函数时,读者会经常遇到术语字符索引字符的字符索引是指从编辑框的开头字符开始的字符编号,它是从零开始编号的也就是说,字符索引实际上是指当把整个编辑正文看作一个字符串数组时,该字符所在的数组元素的下标int getwindowtext( lptstr l

35、pszstringbuf, int nmaxcount ) const;void getwindowtext( cstring& rstring ) const;这两个函数均是cwnd类的成员函数,可用来获得窗口的标题或控件中的正文。第一个版本的函数用lpszstringbuf参数指向的字符串数组作为拷贝正文的缓冲区,参数nmaxcount可以拷贝到缓冲区中的最大字符数,该函数返回以字节为单位的实际拷贝字符数(不包括结尾的空字节)。第二个版本的函数用一个cstring对象作为缓冲区。int getwindowtextlength( ) const;cwnd的成员函数,可用来获得窗口的标题或控件

36、中的正文的长度。dword getsel( ) const;void getsel( int& nstartchar, int& nendchar ) const;两个函数都是cedit的成员函数,用来获得所选正文的位置。getsel的第一个版本返回一个dword值,其中低位字说明了被选择的正文开始处的字符索引,高位字说明了选择的正文结束处的后面一个字符的字符索引,如果没有正文被选择,那么返回的低位和高位字节都是当前插入符所在字符的字符索引。getsel的第二个版本的两个参数是两个引用,其含义与第一个版本函数返回值的低位和高位字相同。int linefromchar( int nindex =

37、 1 ) const;cedit的成员函数,仅用于多行编辑框,用来返回指定字符索引所在行的行索引(从零开始编号)。参数nindex指定了一个字符索引,如果nindex是-1,那么函数将返回选择正文的第一个字符所在行的行号,若没有正文被选择,则该函数会返回当前的插入符所在行的行号。int lineindex( int nline = 1 ) const;cedit的成员函数,仅用于多行编辑框,用来获得指定行的开头字符的字符索引,如果指定行超过了编辑框中的最大行数,该函数将返回-1。参数nline是指定了从零开始的行索引,如果它的值为-1,则函数返回当前的插入符所在行的字符索引。int getli

38、necount( ) const;cedit的成员函数,仅用于多行编辑框,用来获得正文的行数。如果编辑框是空的,那么该函数的返回值是1。int linelength( int nline = 1 ) const;cedit的成员函数,用于获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内)。参数nline说明了字符索引如果nline的值为-1,则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个正文的长度。int getline( int nindex, lptstr lpszbuffe

39、r ) const;int getline( int nindex, lptstr lpszbuffer, int nmaxlength ) const;cedit的成员函数,仅用于多行编辑框,用来获得指定行的正文(不包括行尾的回车和换行符)。参数nindex是行号,lpszbuffer指向存放正文的缓冲区,nmaxlength规定了拷贝的最大字节数,若。函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,getline函数不会在缓冲区中字符串的末尾加字符串结束符(null)下列cwnd或cedit类的成员函数可用来修改编辑框控件。void setwindo

40、wtext( lpctstr lpszstring );cwnd的成员函数,可用来设置窗口的标题或控件中的正文。参数lpszstring可以是一个cstring对象,或是一个指向字符串的指针。void setsel( dword dwselection, bool bnoscroll = false );void setsel( int nstartchar, int nendchar, bool bnoscroll = false );cedit的成员函数,用来选择编辑框中的正文。参数dwselection的低位字说明了选择开始处的字符索引,高位字说明了选择结束处的字符索引。如果低位字为0且

41、高位字节为-1,那么就选择所有的正文,如果低位字节为-1,则取消所有的选择参数bnoscroll的值如果是false,则滚动插入符并使之可见,否则就不滚动参数nstartchar和nendchar的含义与参数dwselection的低位字和高位字相同void replacesel( lpctstr lpsznewtext, bool bcanundo = false );cedit的成员函数,用来将所选正文替换成指定的正文参数lpsznewtext指向用来替换的字符串参数bcanundo的值为true说明替换是否可以被撤消的在调用上述函数时,如果涉及的是一个多行编辑框,那么除了lineleng

42、th和getline函数外,都要把回车和换行符考虑在内例如,假设在编辑框中有如下几行正文:abcdefgij那么字母e的字符索引是6而不是4,因为abcd后面还有一对回车换行符调用linelength(7)会返回第二行的长度3调用lineindex(2)会得到11调用linefromchar(8)会返回1如果没有选择任何正文,并且插入符在字母e上,那么调用getsel返回值的低位和高位字都是6通过分析上述函数,我们可以总结出一些查询和设置编辑框的方法调用cwnd的成员函数getwindowtext和setwindowtext可以查询和设置编辑框的整个正文,在上一章的register程序中,我们

43、就使用过这两个函数如果想对多行编辑框逐行查询,那么应该先调用getlinecount获得总行数,然后再调用getline来获取每一行的正文下面一段代码演示了如何对多行编辑框进行逐行查询char buf40;int total=myedit.getlinecount();int i,length;for(i=0;itotal;i+)length=myedit.getline(i,buf,39);buflength=0; /加字符串结束符. . . . . .可以利用lineindex和linefromchar来在字符索引和字符的行列坐标之间相互转换下列代码演示了在已知字符索引的情况下,如何获得对

44、应的行列坐标:int row,column;row=myedit.linefromchar(charindex);column=charindex-myedit.lineindex(row);下列代码演示了在已知字符的行列坐标的情况下,如何获得对应的字符索引:int charindex;charindex=myedit.lineindex(row)+column;不难看出字符索引与对应的行列坐标的关系是:字符索引=lineindex(行坐标)+列坐标对于选择正文的查询和设置,应该利用函数getsel、setsel和replacesel可以利用getsel和setsel来查询和设置插入符的位置s

45、etsel可以使编辑框滚动到插入符的新位置要获取插入符的行列坐标,可用下面的代码实现:myedit.setsel(-1,0); /取消正文的选择int start,end,row,column;myedit.getsel(start,end); /start或end的值就是插入符的字符索引row=myedit.linefromchar(start); /获取插入符的行坐标column=start-myedit.lineindex(row); /获取插入符的列坐标下面的代码演示了如何把插入符移到指定的行和列:myedit.setsel(-1,0); /取消正文的选择int charindex=m

46、yedit.lineindex(row)+column;myedit.setsel(charindex,charindex);可以利用replacesel函数在 插入符处插入正文,典型的代码如下所示:myedit.setsel(-1,0); /取消正文的选择myedit.replacesel(“.”);可以利用replacesel清除编辑框中的正文,典型的代码如下所示:myedit.setsel(0,-1); /选择全部正文myedit.replacesel(“”);vc编辑框(edit)的自动换行、自动滚屏 、到指定行数自动清空在自动换行设置的时候,要在控件的属性中选中multiline的属

47、性和auto_hscroll、vertical scroll。经过多次测试,总结出vc编辑框(edit)的自动换行与自动滚屏的方法。方法一:(当edit映射到一cstring时) m_string= m_string + snewstring + rn/自动换行(其中m_string是edit筐所关联的cstring对象)updatedata(false);此法只能做到自动换行,不会自动滚屏到最后一行。方法二:(当edit映射到一edit时)m_edit.setsel(-1, -1);/自动滚屏(其中m_edit是edit筐所关联的edit控制对象)m_edit.replacesel(snew

48、string+rn);/自动换行此法可以做到自动换行,并自动滚屏到最后一行。以上,m_string、m_edit.分别为给编辑框添加的成员变量;snewstring 为要显示的字符串方法三:到200行时将所有内容清空int ilinenum=m_editlog.getlinecount();if(ilinenum=200)m_editlog.setsel(-1, -1);m_editlog.replacesel(str+rnrn);elsem_editlog.setsel(0, -1);m_editlog.clear();6.1 传统控件在上一课的表5.1已经列出了windows的传统控件及其

49、对应的控件类。在这些控件中,读者应该重点掌握命令按钮、选择框、单选按钮、编辑框、列表框和组合框。.1.1 传统控件的控件通知消息控件通过向父窗口发送控件通知消息来表明发生了某种事件例如,当用户在按钮上单击鼠标时,按钮控件会向父窗口发送bn_clicked消息传统控件的通知消息实际上是通过wm_command消息发给父窗口的(滚动条除外),在该消息的wparam中含有通知消息码(如bn_clicked)和控件的id,在lparam中则包含了控件的句柄利用classwizard可以很容易地为控件通知消息加入消息映射和消息处理函数,这在上一章中已经演示过了传统控件的消息映射宏是 on_xxxx,其中

50、xxxx表示通知消息码,如bn_clickedon_xxxx消息映射如下所示,该宏有两个参数,一个是控件的id,一个是消息处理函数名on_xxxx(nid, memberfxn)消息处理函数的声明应该有如下形式:afx_msg void memberfxn( );例如,某按钮的bn_clicked消息的消息映射及其处理函数的声明如下所示on_bn_clicked(idc_add,onadd)afx_msg void onadd( );有时,为了处理方便,需要把多个id连续的控件发出的相同消息映射到同一个处理函数上这就要用到on_control_range宏 on_control_range消息

51、映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件id中的头一个和最后一个id,最后一个参数是消息处理函数名。例如,要处理一组单选按钮发出的bn_clicked消息,相应的消息映射如下所示:on_control_range(bn_clicked, idc_first, idc_last, onradioclicked)函数onradioclicked的声明如下,该函数比上面的onadd多了一个参数nid以说明发送通知消息的控件idafx_msg void onradioclicked(uint nid);classwizard不支持on_control_range宏,所以

52、需要手工建立消息映射和消息处理函数提示:事实上,在使用classwizard时只要运用一个小小的技巧,就可以把不同控件的通知消息映射到同一个处理函数上,也可以把一个控件的不同通知消息映射到同一个处理函数上这个技巧就是在用classwizard创建消息处理函数时,指定相同的函数名即可此方法的优点在于控件的id不必是连续的,缺点是处理函数没有nid参数,因而不能确定是哪一个控件发送的消息6.1.2 静态控件静态控件包括静态正文(static text)和图片控件(picture)。静态正文控件用来显示正文。图片控件可以显示位图、图标、方框和图元文件,在图片控件中显示图片的好处是不必操心图片的重绘问

53、题。静态控件不能接收用户的输入。在上一章中,读者已经用过静态正文和组框控件。图片控件的例子可以在appwizard创建的 idd_aboutbox对话框模板中找到,在该模板中有一个图片控件用来显示图标。静态控件的主要起说明和装饰作用。mfc的cstatic类封装了静态控件。cstatic类的成员函数create负责创建静态控件,该函数的声明为bool create( lpctstr lpsztext, dword dwstyle, const rect& rect, cwnd* pparentwnd, uint nid = 0xffff );参数lpsztext指定了控件显示的正文。dwsty

54、le指定了静态控件的风格,表6.1显示了静态控件的各种风格,dwstyle可将这些风格组合起来。rect是一个对rect或crect结构的引用,用来说明控件的位置和尺寸。pparentwnd指向父窗口,该参数不能为null。nid则说明了控件的id。如果创建成功,该函数返回true,否则返回false表6.1 静态控件的风格控件风格含义ss_blackframe指定一个具有与窗口边界同色的框(缺省为黑色)。ss_blackrect指定一个具有与窗口边界同色的实矩形(缺省为黑色)。ss_center使显示的正文居中对齐,正文可以回绕。ss_grayframe指定一个具有与屏幕背景同色的边框。ss

55、_grayrect指定一个具有与屏幕背景同色的实矩形。ss_icon使控件显示一个在资源中定义的图标,图标的名字有create函数的lpsztext参数指定。ss_left左对齐正文,正文能回绕。ss_leftnowordwrap左对齐正文,正文不能回绕。ss_noprefix使静态正文串中的&不是一个热键提示符。ss_notify使控件能向父窗口发送鼠标事件消息。ss_right右对齐正文,可以回绕。ss_simple使静态正文在运行时不能被改变并使正文显示在单行中。ss_useritem指定一个用户定义项。ss_whiteframe指定一个具有与窗口背景同色的框(缺省为白色)。ss_whiterect指定一个具有与窗口背景同色的实心矩形(缺省为白色)。除了上表中的风格外,一般还要为控件指定ws_child和ws_visible窗口风格。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论