您的位置:首页 > 其它

vc中edit控件使用总结-控件关联变量方法,语句 ,本质,控件获取,实现滚动换行

2015-09-30 08:54 375 查看
这本来是一个很简单的问题,但是让我搞了很长的时间,总的来说是网上的傻逼太多了。都说不到正点上。都是说让我设置对话框的属性。不知道是不是提的问题,他们都没有看明白反正是无语了!还是自己把找到的资料保存起来把,方便自己以后查询。


下面的内容是新浪中转载过来的, http://blog.sina.com.cn/s/blog_af68a2c201019v53.html 不过已经满足了我的需求了。如果大家有其他的需求可以给我留言,大家共同学习

vc中edit控件使用总结

edit控件通过类向导以生成两种类成员变量(关联变量),一种是cstring类型,一种是cedit类型。
0. 控件 关联 变量
(1) 方法1:用向导关联变量---方法1的本质是方法
方法2:((CEdit*)GetDlgItem(IDC_EDITID))->SetWindowText(str);//注意括号的位置括法
//加红部分得到了控件的指针变量值可以设一个对应的指针变量
方法3:在用Tab控件添加关联变量时发现控件变量那里是灰的,为了关联控件变量,有一种方法:
1.首先为控件添加变量,如CTabCtrl m_TabCtrl.
2.在OnInitDialog函数中,添加 m_TabCtrl.SubclassDlgItem(IDC_TAB1,this);
//IDC_TAB1是控件ID
3.这样m_TabCtrl就是控件IDC_TAB1的关联变量。
SubclassDlgItem:
(2) 子类化概念:
用一个窗口过程替换另一个过程的行为叫SUBCLASSING,这是WINDOWS意义上的派生子类,与面向对象语言的派生子类是完全不同的概念。
(向导添加关联变量)在VC中,DoDataExchange函数中的DDX_Control之类的函数会调用SubClassDlgItem完成窗口子类化,这样控件自己就能处理消息了。
子类化步骤:
(1)窗体上放一个基类控件,如:CEdit—拖放
(2)有基类派生一个派生类,并生成该对象---如果这里用的是基类控件对象而不派生==就相当于变量关联
CEdit->(继承)CMyEdit;//这里是派生类的定义
CMyEdit m_myEdit; //创建派生类对象
(3)将窗体上控件子类化(subclass)为派生类的对象CMyEdit
==等价于==将窗体上拖放的控件改变为派生类的对象—类型变了
BOOL CMyDialog::OnInitDialog() //在窗体初始化函数OnInitDialog中进行子类化

{

CDialog::OnInitDialog();

m_MyEdit派生类对象.SubclassDlgItem(IDC_MYEDIT窗体上拖放的控件,this控件所在窗体,一般为this);

return TRUE;

}
(3) 子类化后的效果以及相关函数:
----简单来就是对象转化和过程替换,拖放对象转化为派生对象,拖放对象的事件过程都有派生对象同名过程替换即由派生对象处理。
1.基类控件对象(拖放控件)变成了(自己派生的对象)派生控件对象 ;
2.该派生对象将接管控件对象的消息处理;
3.
过程替换-对Dialog上面的某个控件SubClass(子类化)后,其原控件对象的WindowProc(事件过程等)
替换成你自己写的新派生控件 CYourCWndClass
的 WindowProc(同名过程),这样你就可以处理这个控件的所有消息了;用ClassWizard
维护自己的 CYourCWndClass
就可以了


SubclassDlgItem把某个空间类派生对象与对窗体中已有的控件动态连接起来,该派生对象将接管控件对象的消息处理,从而使控件变为派生对象的类型,具有新的特性.
SubclassDlgItem函数的声明为
BOOL SubclassDlgItem( UINT nID控件id,
CWnd* pParent 控件的父窗口指针);

参数nID是控件的ID,pParent是指向父窗口的指针.若连接成功则函数返回TRUE,否则返回FALSE.
(4) 实际应用—设计新的控件
要在程序中创建新设计的控件,显然不能用自动创建的办法,因为对话框模板对新控件的特性一无所知.
原始方法:程序可以用手工方法创建控件,在调用派生类的Create函数时,派生类会调用基类的Create函数创建控件.用Create函数创建控件是一件比较麻烦的工作,程序需要为函数指定一大堆的控件风格以及控件的坐标和ID.特别是控件的坐标,没有经验的程序员很难确切地安排控件的位置和大小,往往需要反复调整.
利用子类化方法:利用MFC的CWnd::SubclassDlgItem提供的动态连接功能,可以避免Create函数的许多麻烦,该函数大大简化了在对话框中创建派生控件的过程.  
区别:
1.原始方法的过程:在用手工方法创建控件时,先要构建一个控件对象,然后再用Create函数在屏幕上创建控件窗口,也就是说,控件的创建工作是由控件对象完成的.
2.子类化方法的过程:动态连接的思路则不同,SubclassDlgItem可以把对话框中已有的控件与某个窗口对象动态连接起来,该窗口对象将接管控件的消息处理,从而使控件具有新的特性.

1. edit控件---与---控件ID直接操作
由id—转化—句柄—类指针
((CEdit*)GetDlgItem(IDC_EDITID))->SetWindowText(str);//注意括号的位置括法
2. edit控件---与---Cstring类型
如果只是简单的获取 edit控件内容,或设置简单的内容 建议使用cstring类型成员变量。
UpdateData(TRUE)即:控件的值—>变量
——刷新控件的值到对应的变量。(外部输入值交给内部变量)
-----------------------------------默认的缺省参数为TRUE,
UpdateData(FALSE)即:变量值—>控件显示。
——拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)
例如:我们在对话框窗口中添加了3个editbox,然后将前两个的值相加,然后在第三个editbox中输出。
那么我们可以做如下处理:
1。用类向导在3个editbox下添加3个变量,我们命名为m_num1,m_num2,m_num3。
2。然后我们可以多添加一个button控件,在其的click处理事件中,添加以下代码:
UpdateData();//默认的缺省参数为TRUE,这样,将EditBox控件的内容读入到与其关联的变量
m_num3 = m_num1+m_num2;
UpdateData(FALSE);//将变量的值,输出到与其关联的EditBox中
就可以了

示例:
CString m_strEdit;
//获得edit框内容

UpdateData(true);
此时m_strEdit就是edit框内容的字符串变量。
//要更新edit的话只要对m_strEdit进行赋值然后
UpdataData(false);//即可
3. edit控件---与---Cedit类型

如果是一些对edit框的复杂操作建议用cedit类型。
相关函数:
(1) void SetSel( long nStartChar开始位置索引,
long nEndChar结束为止索引);

--------------------用来选中edit框中的文本,选中后光标位置在结尾处
void SetSel( CHARRANGE& cr );
作用:这个函数的两种形式都用来设置选择的界线,它们可以相互替换
参数:
nStartChar 选择中的第一个字符的从零开始的索引。
nEndChar选择中的最后一个字符的从零开始的索引。
cr一个CHARRANGE结构,包含了当前选择的界线。
CEdit::SetSel
void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE);
void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = False);
参数:
dwSelection 低位字指定起始位置,高位字为结束位置。如果低位为0,高位为-1,则编辑控件中的全部文本被选中;如果低位字为-1,则任何当前选定内容被去掉选定状态。
bNoScroll指示是否显示脱字符是滚动可见的。如果值为FALSE,则显示,TRUE不显示。
nStartChar指出当前选中部分的开始位置。如果nStartChar=0且nEndChar=-1,则编辑控件的文本被全选;如果nStartChar=-1,则任何当前选定内容被去掉选定状态。
nEndChar指出结束位置。

(2) DWORD GetSel( ) const;

void GetSel( int& nStartChar, int& nEndChar ) const;
------------------------用来得到edit框中所选部分的位置。

两个函数都是CEdit的成员函数,用来获得所选正文的位置。
GetSel的第一个版本返回一个DWORD值,其中低位字说明了被选择的正文开始处的字符索引,高位字说明了选择的正文结束处的后面一个字符的字符索引,
如果没有正文被选择,那么返回的低位和高位字节都是当前插入符所在字符的字符索引。
GetSel的第二个版本的两个参数是两个引用,其含义与第一个版本函数返回值的低位和高位字相同。

(3)void ReplaceSel( LPCTSTR
lpszNewText, BOOL bCanUndo = FALSE );
lpszNewText指定的文本替换在编辑控件中当前选择。
lpszNewText指向包含替换文本的一个NULL
终止的字符串。
bCanUndo若要指定此功能可以取消,请将该参数的值设置为 TRUE 。默认值为 FALSE
替换文本的一部分在编辑控件中。
如果您希望替换所有文本,请使用CWnd::SetWindowText
成员函数。
如果没有当前选择,替换文本在当前的光标位置插入。

区别:SetWindowText—光标位置在开始,而replacesel在结尾

示例:
CEdit m_ctrlEdit;m_ctrlEdit.SetSel(0,0); //将光标移到开头=所选部分开头和结尾都在0

m_ctrlEdit.SetSel(-1); //将光标移到末尾=所选部分开头在结尾m_ctrlEdit.SetSel(-1, -1)也可

m_ctrlEdit.SetSel(0,-1); //选中所有内容—如果没有当前选择,替换文本在当前的光标位置插入。
m_ctrlEdit.ReplaceSel("替换内容");//写入值

//得到当前edit框中的所有字符数

int iStart,iCount;//iCount 为字符数

m_ctrlEdit.SetSel(0,-1); //选中所有
m_ctrlEdit.GetSel(iStart,iCount);

4.edit控件---与---H句柄转化为指针类型


还一种可以直接用控件的id值来进行操作
示例:
((CEdit*)GetDlgItem(IDC_EDIT)
他类似于上边的m_ctrlEdit
这样写的好处是可以在消息传递中使用,便于不同窗口间传递edit内容

5 .VC编辑框(EDIT)的自动换行与自动滚屏
这里的自动滚屏指的edit框里边显示的是框体范围内到文字结尾的部分
如果只是换行,那么永远显示的是从第一行开始的部分。

VC编辑框(EDIT)的自动换行与自动滚屏

经过多次测试,总结出VC编辑框(EDIT)的自动换行与自动滚屏的方法。

以下,m_String、m_Edit.分别为给编辑框添加的成员变量;
sNewString 为要显示的字符串
在自动换行设置的时候,要在EDIT控件的属性中选中"multiline"的属性和Auto_HScroll、Vertical
scroll。
我发现修改编辑框的属性:Auto_HScroll等用处不大。

方法一:(当EDIT映射到一CString时)--来新字符串,先全部存入sting,再显示

m_String = m_String + sNewString + "\r\n" //自动换行
UpdateData(false);//
此法只能做到自动换行,不会自动滚屏到最后一行。

方法二:(当EDIT映射到一EDIT时)----来新字符串,先显示,再一起存入edit对象变量,

m_Edit.SetSel(-1, -1); //自动滚屏
m_Edit.ReplaceSel(sNewString+"\r\n"); //自动换行
UpdateData(true);//如果不需要保存数据,这一行不必须
此法可以做到自动换行,并自动滚屏到最后一行。
注意二法中UpdataData参数的区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: