对于字符串,Toolkit提供了ProWstringx系列函数如ProWstringCopy、ProStringToWstring、ProWstringConcatenate等,可实现字符串的复制、连接、转换等基本操作。但是以上函数使用起来相较MFC提供的CString类还是麻烦许多,特别是在字符串的替换、连接、分割以及格式化转化等操作体现的尤为明显。本文介绍利用MFC中CString对象简化字符串的操作。
Toolkit里面的字符串操作估计是最迷惑人的地方,各种诸如ProLine、ProPath等类型的字符串相当繁杂。其实这些都是针对char和wchar_t两种数据类型的宏定义,所有相关的字符串都是这两种类型不同长度的数组。从官方帮助文件找出了相关定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #define    PRO_LINE_SIZE         81 #define    PRO_PATH_SIZE         260 #define    PRO_COMMENT_SIZE      256 #define    PRO_VALUE_SIZE        256 #define    PRO_NAME_SIZE         32  #define    PRO_TYPE_SIZE         4   #define    PRO_EXTENSION_SIZE    4   #define    PRO_VERSION_SIZE      4 #define    PRO_MAX_ASSEM_LEVEL   25 #define    PRO_FEATREF_KEY_SIZE  81       #define    PRO_FILE_NAME_SIZE         (PRO_NAME_SIZE + \           PRO_EXTENSION_SIZE + \           PRO_VERSION_SIZE)            #define    PRO_FAMILY_NAME_SIZE  (PRO_NAME_SIZE + PRO_NAME_SIZE + 2) typedef  char  ProCharName[PRO_NAME_SIZE];typedef  char  ProCharPath[PRO_PATH_SIZE];typedef  wchar_t  ProLine[PRO_LINE_SIZE];typedef  wchar_t  ProPath[PRO_PATH_SIZE];typedef  wchar_t  ProName[PRO_NAME_SIZE];typedef  wchar_t  ProFileName[PRO_FILE_NAME_SIZE];typedef  wchar_t  ProFamilyName[PRO_FAMILY_NAME_SIZE];typedef  wchar_t  ProComment[PRO_COMMENT_SIZE];typedef  char  ProMenuName[PRO_NAME_SIZE];typedef  char  ProMenufileName[PRO_NAME_SIZE];typedef  char  ProMenubuttonName[PRO_NAME_SIZE];#define  PRO_MACRO_SIZE 256 typedef  wchar_t  ProMacro[PRO_MACRO_SIZE];typedef  char  ProCharLine[PRO_LINE_SIZE];
 
2.1 wchar_t*与CString的互相转换 2.1.1 wchar_t*转CString wchar_t*转CString其实只需要使用CString的构造函数即可完成:
1 2 wchar_t  *p = L"test" ;CString sz = CString (p); 
 
2.1.2 CString转wchar_t* CString转wchar_t*可使用CString的AllocSysString方法完成。需要注意的是,AllocSysString申请了新的内存空间,但转换的wchar_t*数据不再使用时,需要及时释放内存:
1 2 3 4 CString sz = _T("test" ); wchar_t  *p = sz.AllocSysString ();SysFreeString (p);
 
2.2 char*与CString的互相转换 2.2.1 char*转CString char*转CString与wchar_t一样,使用CString的构造函数即可:
1 2 char  *p = "test" ;CString sz = CString (p); 
 
2.2.2 CString转char* CString转char*可使用CString的GetBuffer方法完成。需要注意的是,GetBuffer申请了新的内存空间,当转换的char*数据不再使用时,需要及时释放内存:
1 2 3 4 5 CString sz = _T("test" ); char  *p;p = sz.GetBuffer (); sz.ReleaseBuffer ();  
 
3.简单实例 用之前CREO Toolkit二次开发-Ribbon界面的操作 一文的代码做实例进行讲解。下面的代码进行了大量的字符串拼接,想想如果使用Toolkit原生的一些函数应该如何处理:
1 2 3 4 5 6 CString macro; macro = "~ Command `ProCmdDwgRegenModel` ; ~Command `ProCmdWinActivate`;" ; macro += _T("~ Activate `main_dlg_cur` `"  + _lastRibbonTab + "_control_btn` 1;" ); wchar_t  *p = macro.AllocSysString ();status = ProMacroLoad (p); SysFreeString (p);