第一篇:MFC控件关联变量小结
MFC控件关联变量总结
通常在要绑定变量的编辑框控件上右键添加变量就可以。
绑定变量分value和control两种,value是赋值用的,control是控制用的。对于编辑框的赋值,共分几种方法 1.不用绑定变量的方法
GetDlgItem(IDC_EDIT1)->GetWindowText(变量); 如果是数组->GetWindowText(数组名,长度)GetDlgItem(IDC_EDIT1)->SetWindowText(变量); 2.绑的是value型变量 一共3处
<1处>project1Dlg.h : 头文件 class Cproject1Dlg : public CDialog { // 构造 public: Cproject1Dlg(CWnd* pParent = NULL);// 标准构造函数
// 对话框数据
enum { IDD = IDD_PROJECT1_DIALOG };protected: virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持
// 实现 protected: HICON m_hIcon;// 生成的消息映射函数 virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public: afx_msg void OnBnClickedOk();CString edit1;//定义了该变量 CString edit2;CEdit edit3;CEdit edit4;CString edit5;};<2处> project1Dlg.cpp : 实现文件
Cproject1Dlg::Cproject1Dlg(CWnd* pParent): CDialog(Cproject1Dlg::IDD, pParent), edit1(_T(“")), edit2(_T(”“)), edit5(_T(”")){ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}
参数列表跟了edit1 <3处> project1Dlg.cpp : 实现文件
void Cproject1Dlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, edit1);DDX_Text(pDX, IDC_EDIT2, edit2);DDX_Control(pDX, IDC_EDIT3, edit3);DDX_Control(pDX, IDC_EDIT4, edit4);DDX_Text(pDX, IDC_EDIT5, edit5);}
DDX_Text(pDX, IDC_EDIT1, edit1);变量与控件关联
通过调用 UpdateData(TRUE)UpdateData(FALSE)将控件数据取到变量或将变量数据显到控件 如果 变量赋值语句写在对话框构造函数里,则UpdateData(FALSE)可省略,会被自动调用
3.绑的是control型变量 代码与上方一样,看edit3 但只有两处涉及 CEdit edit3;DDX_Control(pDX, IDC_EDIT3, edit3);程序里只需要 edit3.GetWindowText(变量);edit3.SetWindowText(变量);就可以用了
除了赋值,还能干很多事情.
第二篇:Visual C++ 2010 MFC ActiveX 控件小结[推荐]
一、ActiveX控件
ActiveX控件是基于组件对象模型COM--Components Object Modem的可重用软件组件,旨在用于普通的ActiveX控件容器和Internet上的网页,这里介绍用MFC创建ActiveX控件。一个典型的ActiveX控件,具有方法、属性、事件这三种特性。
二、ActiveX控件的测试与注册
1、使用ActiveX控件测试容器对控件进行测试
对于VC6.0,安装CommonTools目录下的TSTCON32.EXE即可使用。
而vs2010中的TSTCON(ActiveX Control Test Container)工具非自动安装,而是作为一个例程提供。所以应找到该例程,并编译: 如vs2010安装在默认路径则
1, 进入:C:Program FilesMicrosoft Visual Studio 10.0Samples1033,可找到VC2010Samples.zip文件,2, 将其解决到同一个文件夹,解压后将出现一个C++子文件夹。
3, TstCon例程在:C:Program FilesMicrosoft Visual Studio 10.0Samples1033C++MFColeTstCon,双击其中的.sln文件启动工程,直接编译,4, 编译后在Debug子文件夹中将出现一个TstCon.exe文件,将其复制到:C:Program FilesMicrosoft Visual Studio 10.0Common7Tools文件夹。
5, 在vs2010中的Tools菜单点击“External Tools...”,出现如下对话框,点击“Add”添加一项工具。6, 新工具项的“Title”为:ActiveX Control Test Container,“Command” 为:C:Program FilesMicrosoft Visual Studio 10.0Common7Tools TstCon.exe。
7, 确认退出对话框,Tools菜单将出现“ActiveX Control Test Container”菜单项。Visual C++ 2010 MFC ActiveX 控件小结Captain栋蝈 打开控件测试容器初始界面如下图
Visual C++ 2010 MFC ActiveX 控件小结Captain栋蝈 Edit→Insert New Control→选择要测试的控件→OK
2、ActiveX控件的注册与删除
所有的ActiveX控件必须在注册之后才能使用,实际上在VS2010开发环境中生成控件程序时,就已经通过regsvr32程序注册了该控件;如果要删除ActiveX控件的注册信息,利用regsvr32程序的/u选项来完成。通常可以选择“开始”→“运行”命令,然后输入“regsvr32/u”,再在其后输入要删除的ActiveX控件的完整路径。Tips:在“运行”中先输入regsvr32/u,然后拖动要删除的控件到“regsvr32/u”之后,即可获取其完整路径。
将xxx.ocx文件拷贝至Windowssystem下,然后regsvr xxx.ocx即注册;regsvr32/u xxx.ocx即删除。
三、ActiveX控件开发完整过程 经典Clock控件案例~~
1、创建工程
创建MFC ActiveX Control类项目,命名为Clock,MFC ActiveX Control Wizard全选默认,Finish。
2、时钟控件的实现
获取当前系统时间,CClockCtrl类的OnDraw函数中 CTime time=CTime::GetCurrentTime();CString str=time.Format(“%H:%M:%S”);pdc->TextOut(0,0,str);动态显示时间,CClockCtrl类添加WM_CREATE和WM_TIMER消息及处理函数 设置定时器SetTimer(1,1000.NULL);定时器相应函数InvalidateControl();//其实就是调用OnDraw函数
编译并运行ActiveX控件,然后打开ActiveX控件容器中插入该控件,可以看到动态显示的时间
3、属性 3.1标准属性
以背景色和前景色为例,类视图中展开Lib结尾的选项,右键“_DClock”→“添加”→“属性”,然后添加标准属性,及选中“Stock”,在PropertyName中选则BackColor,其余选中默认,单击完成。同理添加前景色ForeColor。
为属性对话框添加“颜色”选项卡,修改类CClockCtrl.cpp中的属性页映射宏PROPPAGEID(CLSID_CColorPropPage);切记计数参数要增加1: // 属性页
// TODO: 按需要添加更多属性页。请记住增加计数!BEGIN_PROPPAGEIDS(CClockCtrl, 2)
PROPPAGEID(CTimePropPage::guid)
PROPPAGEID(CLSID_CColorPropPage);END_PROPPAGEIDS(CClockCtrl)然后在修改OnDraw函数使控件颜色根据颜色选项卡的选则而变化:
CBrush brush(TranslateColor(GetBackColor()));
pdc->FillRect(rcBounds,&brush);
pdc->SetBkMode(TRANSPARENT);
pdc->SetTextColor(TranslateColor(GetForeColor()));3.2自定义属性
添加一个自定义属性:时间间隔(UpdateInterval),用于设置更新时间的间隔。
与标准属性添加相同,在添加属性向导中,在PropertyName中输入UpdateInterval,类型设置为SHORT。可以看到向导自动添加了通知函数OnUpdateIntervalChange(),单击Finish完成添加。void CClockCtrl::OnUpdateIntervalChanged(void){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加属性处理程序代码
if(m_UpdateInterval<1000 || m_UpdateInterval>6000)
{
//解决输入值不合要求的问题
m_UpdateInterval=1000;
}
else
{
//解决输入值不是整数的问题
m_UpdateInterval=m_UpdateInterval/1000*1000;
}
KillTimer(1);
SetTimer(1,m_UpdateInterval,NULL);
SetModifiedFlag();} 关联某控件变量,需要手动添加:
DDP_Text(pDX, IDC_EDIT1, m_updateInterval,_T(“Interval”));DDX_Text(pDX, IDC_EDIT1, m_updateInterval);DDP_PostProcessing(pDX);DDP、DDX、PostProcessing,顺序不可以调整
为测试自定义属性,在Edit→Insert New Control→选择要测试的控件后,选择Control→Invoke Methods,如果想要获取,某个属性值,则选择PropGet;如果设置,则选PropPut。这里选择后者,然后输入2000,单击SetValue,在单击【Invoke】按钮,发现控件时间每个2S更新一次。
4、方法
与添加属性一样,_DClock右键......选择“方法”,这里添加一个简单的“Hello” 代码:
void CClockCtrl::Hello(void){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
MessageBox(_T(“Hello world”));} 测试时Control→Invoke Methods,选择“Hello”
5、事件
5.1添加标准事件
右键CClockCtrl类(类视图CxxxCtrl上点击右键才能添加事件,而在_DxxxEvents接口上点击右键则没有添加事件),添加“事件”,显示添加事件向导对话框,“Event Name”下拉列表框中选择”Click“,单击Finish。5.2添加自定义事件
添加一个NewMinute事件,实现新的一分钟时有提示 Event Name中输入NewMinute,然后Finish。在InDraw函数中获取系统时间代码后添加 if(time.GetSecond()==0)
{
NewMinute();//判断是否过了一分钟,是则触发NewMinute事件
}
6、调用ActiveX控件
新建一个名为ClockTest的对话框,在对话框上右键,选择”Insert ActiveX Control“,找到Clock控件添加即可。
或者是,”工具“→”选择工具箱选项“→”COM Components“,选择要插入的控件,单击OK。
第三篇:MFC动态添加控件及响应函数
MFC动态添加控件及响应函数
应该注意:控件也是一个窗口。在添加控件的时候空间变量最好是全部变量或者是局部指针变量,这样即使函数结束也不会造成变量被销毁。下面以动态添加按钮为例的代码: CButton *pButton = new CButton;//一定要New CButton,否则程序会运行出错 pButton->Create(“New Button”, WS_CHILD|BS_DEFPUSHBUTTON, CRect(0, 0, 100,50), this, 123);
pButton->ShowWindow(SW_SHOW);
或者是如下代码:
CButton *pButton = new CButton;//一定要New CButton,否则程序会运行出错 pButton->Create(“New Button”, WS_CHILD|BS_DEFPUSHBUTTON|WS_VISIBLE, CRect(0, 0, 100, 50), this, 123);
根据MFC的消息映射机制,应该更改三处代码。
(1)在头文件中修改代码
在protected的注释宏中间添加函数声明:
protected:
//{{AFX_MSG(CDemoMDIView)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnNewButton(void);
//}}AFX_MSG
(2)在cpp文件中添加消息声明
BEGIN_MESSAGE_MAP(CDemoMDIView, CView)
//{{AFX_MSG_MAP(CDemoMDIView)
ON_WM_CREATE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) //参数依次为控件ID、响应函数名称
ON_BN_CLICKED(123, OnNewButton)
END_MESSAGE_MAP()
(3)在cpp文件中添加函数代码
voidCDemoMDIView::OnNewButton(void)
{
MessageBox(“This is a new button!nThis Function Handler was added manually!”); }
第四篇:GridControl控件小结
由于近期要使用gridcontrol控件,整理出来,以便以后参考:
1.DevExpress控件组中的GridControl控件不能使横向滚动条有效。现象:控件中的好多列都挤在一起,列宽都变的很小,根本无法正常浏览控件单元格中的内容。
解决:
gridView1.OptionsView.ColumnAutoWidth属性是true,即各列的宽度自动调整,你把它设成false,就会出现了。
2.使单元格不可编辑。
gridcontrol-->gridview-->OptionsBehavior-->Editable=false
3.没有下拉滚动条事件怎么办?现象:因为需要加载大数据量数据,所以不能一次把所有数据读入datatable进行绑定,所以决定在用户进一步浏览数据时进行数据的实时加载工作,就是每当用户拉动滚动条时,多加载一些数据进入datatable.没有找到合适的滚动条事件,于是用这个事件代替了,非常合适我的需求.TopRowChanged事件.4.获取选定行,指定列单元格的内容
private string GetSelectOID()
{
int[] pRows = this.gridView1.GetSelectedRows();
if(pRows.GetLength(0)> 0)
return gridView1.GetRowCellValue(pRows[0], mOIDFiledName).ToString();
else
return null;
}
//mOIDFiledName为要获取列的列名
5.去除“Drag a Column Header Here To Group by that Column”
属性Gridview->Option View->Show Group Panel=false,就好了
6.在gridcontrol中添加checkbox复选框
gridview->run designer->columns->选择要变成复选框的那一列->column edit->new(在这里可以选择很多类型)
加载checkbox数据时,费了一点时间,checkbox的复选框怎么点击,一失去焦点是,选择的操作就无效了,问题就出在datatable的绑定上了,一定要绑定一个布尔的类型.代码是这样滴!
private void FrmCreateLegend_Load(object sender, EventArgs e)
{
IFeatureLayer pFeatureLayer;
IDataset pDataset;
string pName;
DataTable pDatatable = new DataTable();
pDatatable.Columns.Add(“图层名称”, System.Type.GetType(“System.String”));pDatatable.Columns.Add(“选择”, System.Type.GetType(“System.Boolean”));
DataRow pDataRow;
object[] rowArray = new object[2];
for(int i = 0;i < mFeatureLayers.Count;i++)
{
pDataRow = pDatatable.NewRow();
pFeatureLayer = mFeatureLayers[i] as IFeatureLayer;
rowArray[0] = pFeatureLayer.Name;
rowArray[1] = false;
pDataRow.ItemArray = rowArray;
pDatatable.Rows.Add(pDataRow);
}
this.gridMark.DataSource = pDatatable;
this.gridMark.Refresh();
}
注意:创建的datatable的列名一定要和gridview中的列的fieldname属性值是一个名字,不然,你会发现添加了和你绑定的datatalbe一样多的行,可是行里面却没有内容的.7.多选
GridControl->GridView->属性->OptinosSelecttion->MultiSelect
8.不显示子表信息
当我们对DataTable建立父子关系后,将父表绑定在Grid上,会造成关系列上有加号显示,并且可以展开.如果你觉得展开的信息对你没有意义的话,是可以关掉的.这是需要修改属性 属性Gridview->Option View->ShowDetailButtons=false
bandedGridView1.Columns[1].Width =
bandedGridView1.CalcColumnBestWidth(bandedGridView1.Columns[1])+ 5;
bandedGridView1.Columns[2].Width =
bandedGridView1.CalcColumnBestWidth(bandedGridView1.Columns[2])+ 5;
bandedGridView1.Columns[3].Width =
bandedGridView1.CalcColumnBestWidth(bandedGridView1.Columns[3])+ 5;
bandedGridView1.Columns[0].Width
bandedGridView1.CalcColumnBestWidth(bandedGridView1.Columns[0])+ 5;=
第五篇:MFC CString 用法小结[定稿]
MFC CString 用法小结
1.初始化方法:
(1)直接复制,如Cstring=”mingrisoft”;
(2)通过构造函数初始化,如 CString str(„ ‟,100)//与分配100个字节,填充空格 char* p=”feiqiang”;Cstring(p);delete p.(3)加载工程中的字符串资源,如CString str;str.LoadString(IDS_STR);(4)使用CString类的成员函数Format初始化,如CString str;int i=0;str.Format(“value:%d”,i);
2.将CString转化为char*,如
CString str=”feqiang”;
char *p;p=str.GetBuffer();delete p;将char*转化为CString,如:
char* p=”feiqiang”;
p[len(p)]=‟ ‟;
Cstring str(p);char* 和char数组的转化:
char buf[5] ={„a‟,‟b‟,‟c‟};
char *p;p=new char[5];p=buf;将字符串转化为数字:
CString str=”12”;
int i=atoi(str);long j=atoll(str);float f=atof(str);将数字转化为字符串:
CString str;int i=12;str.Format(“%d”,i);
long j=12;str,Format(“%ld”,j);
同理其他类型。
3.字符串的相关操作即方法的使用:
(1)提取字符串中的中文,如
CString strtext,temp,strres;GetLlgItem(IDC_TEXT)->GetWindowText(strtext);//通过ID获取编辑框中的文本
for(int = ;i if(IsDBCSLeadByte(ch)){ //判断字符是否是双字节编码的前一个字节 tmp=strtext.Mid(i,2);//截取索引index1到index2的字符[)i++;stress+=tmp;} GetLlgItem(IDC_RESULT)->SetWindowText(strtes);//设置文本框中的文本 }(2)英文字符串首字母大写,如 将以空格符分隔的英文单词的第一个字母大写(小写)str.GetAt(i);//提取字符串索引为i个字母 str.MakeLower();//转化为小写 tmp.MakeUpper();//转化为大写 (2)按制定符号分割字符: int pos=str.Find(strchar);//查找字符,如果没找到,则返回0,找到则返回字符的位置,参数可以是字符也可以是字符串 while(pos>0){ str1=str.Left(pos);//取左,参数为字符串的个数 str=str.Right(str.GetLength-pos-1);//取右,参数同上 tmp.Format(“%srn”,str1);//字符串中rn代表回车化行符 strres+=tmp;pos=str.Find(strchar);}(3)删除指定的中文: m_text.GetWindowText(strtxt);m_text.GetSel(istart,iend);//得到文本框中选中的文本,并且得到文本的头索引和尾索引 if(istart==iend){ return;} str1=strtxt.Left(istart);if(iend>=strtxt.GetLength()){ str2=””;}else{ str2=strtxt.Right(strtxt.GetLength()-iend);} strres+=str1;strres+=str2;(4)替换字符串: strtxt.Replace(strchar,strnew);//用新串替换旧串 (5)根据CPoint查找位置: CPoint pt;//获取字符串时获取鼠标所在字符串的位置 int pos=m_text.CharFromPos(pt);//根据pt获取字符串中的位置,即其左侧字符的位置 if(str.IsEmpty()){//判断字符串是否为空 m_num.AddString(strres);//文本框追加字符串 } 将字符转化为大写:ch=ch-32;(6)字符串忽略大小写的比较: CString str=”feiqiang”; int com=str.CompareNoCase(“mingri”);//如果相等返回0,否则返回-1; (7)连接换行符:CString str=”feiqiang t”; (8)字符反转:str.MakeReverse();(9)取出首位空格:str.TrimLeft();str.TrimRight();取出字符串中的所有空格,str.Replace(“ ”,””); (10)在ListBox中查找字符串 int index=::SendMessage(m_stringlist.GetSafeHwnd(),LB_FINDSTRINGEXACT,-1,(LPARAM)(LPCTSTR)strtext));//通过SendMessage函数向列表控件发送LB_FINDSTRINGEXACT消息来查找指定字符串是否在列表空间中,如果存在则返回索引位置。 (11)字符串数组: CString str[5] array;CString str[5]={“feiqiang”,”mingri”,”mr”}; for(int i=0;i<5;i++){ array.Add(str[i]);//添加元素 } for(int j=0;j if(array.Get(j)==”mr”){ MessageBox(“存在”);} }(12)设置编码方式:Project/SettingsàPreprocessor,如果要使用DBCS,则添加_MBCS(多个字节编码),如果要使用Unicode,则添加_Unicode,不添加则使用ASCII.二 字符串指针类型 (1)LPCSTR:32位静态字符串指针,可以直接赋值使用,如LPCSTR str=”mingrisofg”;(2)LPSTR:32位字符串指针,如LPSTR str;str=new char[256];(3)LPCTSTR:32位UNICODE型静态字符串指针,如 LPCTSTR str=_T(“mingrisoft”);(4)LPTSTR: 32位UNICODE型字符串指针,如LPTSTR str=new TCHAR[256];三 BSTR(进行COM编程时使用的字符串类型)与CString之间的转化: 1.对BSTR变量赋值时: BSTR bstr=NULL;bstr=SysAllocString(L”feiqang”);//从LPCWSTR构造 SysFreeString(bstr);//释放 将BSTR强制转化为CString,如: CString str=(CString)bstr;或CString str;BSTR bstr=str.AllocSysString();2._bstr_(对BSTR的包装类),包含的头文件为:”COMDEF.H” 用法: 直接赋值:_bstr_t tbstr=”feqiang”; 给CString对象赋值:CString str=(LPCSTR)tbstr;//LPCSTR str=tbstr;将_bsr_转化为BSTR,使用copy函数:BSTR bstr=tbstr.copy();SysFreeString(bstr);BSTR之间赋值给_bstr_对象,如BSTR bstr=SysAllocString(L”mingri”);_bstr_t tbstr=bstr;四 格式化类型 如:获取并且格式化系统时间 CTime t=CTime::GetCurrentTime();CSTring strtime=t.Format(“%H:%M:%S”); MessageBox(strtime;1.CString::IsEmpty BOOL IsEmpty()const;返回值:如果CString 对象的长度为0,则返回非零值;否则返回0。说明:此成员函数用来测试一个CString 对象是否是空的。示例: 下面的例子说明了如何使用CString::IsEmpty。// CString::IsEmpty 示例 CString s;ASSERT(s.IsEmpty());请参阅 CString::GetLength 2.CString::Left CString Left(int nCount)const;throw(CMemoryException);返回值:返回的字符串是前nCount个字符。示例: CString s(_T(“abcdef”));ASSERT(s.Left(2)== _T(“ab”)); 3.CString::LoadString BOOL LoadString(UINT nID);throw(CMemoryException);返回值:如果加载资源成功则返回非零值;否则返回0。nID 一个Windows 字符串资源ID。 说明: 此成员函数用来读取一个由nID 标识的Windows 字符串资源,并放入一个已有CString 对象中。示例: 下面的例子说明了如何使用CString::LoadString。// CString::LoadString 示例 #define IDS_FILENOTFOUND 1 CString s;if(!s.LoadString(IDS_FILENOTFOUND)) 4.CString::MakeLower void MakeLower();//改变字符的小写 5.CString::MakeReverse void MakeReverse();//字符倒置 6.CString::MakeUpper void MakeUpper();//改变字符的大写 7.CString::Mid CString Mid(int nFirst)const;CString Mid(int nFirst, int nCount)const;nCount代表要提取的字符数, nFirst代表要提取的开始索引位置 示例: CString s(_T(“abcdef”));ASSERT(s.Mid(2, 3)== _T(“cde”)); 8.CString::ReleaseBuffer void ReleaseBuffer(int nNewLength =-1);参数:nNewLength 此字符串的以字符数表示的新长度,不计算结尾的空字符。如果这个字 符串是以空字符结尾的,则参数的缺省值-1 将把CString 的大小设置为 字符串的当前长度。说明: 使用ReleaseBuffer 来结束对由GetBuffer 分配的缓冲区的使用。如果你知道缓 冲区中的字符串是以空字符结尾的,则可以省略nNewLength 参数。如果字符 串不是以空字符结尾的,则可以使用nNewLength 指定字符串的长度。在调用 ReleaseBuffer 或其它CString 操作之后,由GetBuffer 返回的地址是无效的。示例: 下面的例子说明了如何使用CString::ReleaseBuffer。// CString::ReleaseBuffer 示例 CString s;s = “abc”;LPTSTR p = s.GetBuffer(1024);strcpy(p, “abc”);// 直接使用该缓冲区 ASSERT(s.GetLength()== 3);// 字符串长度 = 3 s.ReleaseBuffer();// 释放多余的内存,现在p 无效。ASSERT(s.GetLength()== 3);// 长度仍然是3 9.CString::Remove int CString::Remove(TCHAR ch);返回值:返回从字符串中移走的字符数。如果字符串没有改变则返回零。参数:ch 要从一个字符串中移走的字符。 说明:此成员函数用来将ch 实例从字符串中移走。与这个字符的比较是区分大小写 的。示例: // 从一个句子中移走小写字母'c': CString str(“This is a test.”);int n = str.Remove('t');ASSERT(n == 2);ASSERT(str ==“This is a es.”);10.CString::Replace int Replace(TCHAR chOld, TCHAR chNew);int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew);返回值:返回被替换的字符数。如果这个字符串没有改变则返回零。参数:chOld 要被chNew 替换的字符。chNew 要用来替换chOld 的字符。 lpszOld 一个指向字符串的指针,该字符串包含了要被lpszNew 替换的字符。LpszNew 一个指向字符串的指针,该字符串包含了要用来替换lpszOld 的字符。说明:此成员函数用一个字符替换另一个字符。函数的第一个原形在字符串中用chNew 现场替换chOld。函数的第二个原形用lpszNew 指定的字符串替换lpszOld 指定 的子串。 在替换之后,该字符串有可能增长或缩短;那是因为lpszNew 和lpszOld 的长度 不需要是相等的。两种版本形式都进行区分大小写的匹配。示例: // 第一个例子,old 和new 具有相同的长度。CString strZap(“CnIndex)时会出错,当nCount过大,没有足够的字符删除时,此函数不执行。示例: CString str1,str2,str3;char a;str1 = “nihao”;str2 = “nIhao”;int x;// int i=(str1 == str2);str1.Delete(2,3);如果nCount(3)> GetCount()– nIndex(5-2)就会执行错误 22.CString::Empty Void Empty();返回值:没有返回值 清空操作;示例: CString s(“abc”);s.Empty();ASSERT(s.GetLength()== 0); 23.CString::Find int Find(TCHAR ch)const;int Find(LPCTSTR lpszSub)const;int Find(TCHAR ch, int nStart)const;int Find(LPCTSTR lpszSub, int nStart)const;返回值: 不匹配的话返回-1;索引以0 开始;nStar 代表以索引值nStart 的字符开始搜索 , 即为包含以索引nStart字符后的字符串.示例: CString s(“abcdef”);ASSERT(s.Find('c')== 2);ASSERT(s.Find(“de”)== 3);Cstring str(“The stars are aligned”);Ing n = str.Find('e',5);ASSERT(n == 12) 24.CString::FindOneOf int FindOneOf(LPCTSTR lpszCharSet)const;返回值: 不匹配的话返回-1;索引以0 开始 注意::返回此字符串中第一个在lpszCharSet中也包括字符并且从零开始的索引值 示例: CString s(“abcdef”);ASSERT(s.FindOneOf(“xd”)== 3);// 'd' is first match.25.CString::Format void Format(LPCTSTR lpszFormat,...);void Format(UINT nFormatID,...);参数:lpszFormat 一个格式控制字符串 nFormatID 字符串标识符 示例: CString str;Str.Format(“%d”,13);此时Str为13 26.CString::GetAt TCHAR GetAt(int nIndex)const;返回值:返回标号为nIndex的字符,你可以把字符串理解为一个数组,GetAt类似于[].注意nIndex的范围,如果不合适会有调试错误。 27.CString::GetBuffer LPTSTR GetBuffer(int nMinBufLength);返回值:一个指向对象的(以空字符结尾的)字符缓冲区的LPTSTR 指针。参数:nMinBufLength 字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间。说明:此成员函数返回一个指向CString 对象的内部字符缓冲区的指针。返回的LPTSTR 不是const,因此可以允许直接修改CString 的内容。如果你使用由GetBuffer 返回的指针来改变字符串的内容,你必须在使用其它的CString 成员函数之前调用ReleaseBuffer 函数。在调用ReleaseBuffer 之后,由GetBuffer 返回的地址也许就无效了,因为其它的CString 操作可能会导致CString 缓冲区被重新分配。如果你没有改变此CString 的长度,则缓冲区不会被重新分配。当此CString 对象被销毁时,其缓冲区内存将被自动释放。 注意:如果你自己知道字符串的长度,则你不应该添加结尾的空字符。但是,当你用ReleaseBuffer 来释放该缓冲区时,你必须指定最后的字符串长度。如果你添加了结尾的空字符,你应该给ReleaseBuffer 的长度参数传递-1,ReleaseBuffer 将对该缓冲区执行strlen 来确定它的长度。示例: // CString::GetBuffer 例子 CString s(“abcd”);#ifdef _DEBUG afxDump << “CString s ” << s << “n”;#endif LPTSTR p = s.GetBuffer(10);strcpy(p, “Hello”);// 直接访问CString 对象。s.ReleaseBuffer();#ifdef _DEBUG afxDump << “CString s ” << s << “n”;#endif 28.CString::GetLength int GetLength()const;返回值:返回字符串中的字节计数。 说明:此成员函数用来获取这个CString 对象中的字节计数。这个计数不包括结尾的空字符。对于多字节字符集(MBCS),GetLength 按每一个8 位字符计数;即,在一个多字节字符中的开始和结尾字节被算作两个字节。示例 下面的例子说明了如何使用CString::GetLength。// CString::GetLength 示例 CString s(“abcdef”);ASSERT(s.GetLength()== 6); 29.CString::Insert int Insert(int nIndex, TCHAR ch);int Insert(int nIndex, LPCTSTR pstr);返回值:返回修改后的长度,nIndex是字符(或字符串)插入后的索引号例子 示例: CString str(“HockeyBest”); int n = str.Insert(6, “is”); ASSERT(n == str.GetLength());printf(“1: %sn”,(LPCTSTR)str);n = str.Insert(6, ' ');ASSERT(n == str.GetLength());printf(“2: %sn”,(LPCTSTR)STR); n = str.Insert(555, „1‟); ASSERT(n == str.GetLength());printf(“3: %sn”,(LPCTSTR)str);输出 1.Hockeyis Best 2.Hockey is Best 3.Hockey is Best!