对于字符串,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);