一、VC6.0操作步驟:
1.將下面XML代碼復制并保存名為XPStyle.manifest的文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.WorkSapceName"
type="win32"
/>
<description>Your app description here</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
2.將該文件復制到工程文件夾中的rec文件夾中。
3.工程->添加到工程->將rec文件夾中的XPStyle.manifest文件添加到工程中。
4.打開resource.h文件,將下面兩行代碼復制并粘貼
#define IDR_MANIFEST 1
#define RT_MANIFEST 24
5.打開工程中的.rc文件,將下面一行代碼加入到該文件中
IDR_MANIFEST RT_MANIFEST MOVEABLE PURE "res\\XPStyle.manifest"
6.重新編譯鏈接,OK成功。
二、VS2005環(huán)境下操作方法與步驟
VS 2005中,如果Project->Property -- General -- Character Set 為Use Unicode Character Set,那么程序的界面自然就是XP風格,不需要手動添加任何東西。但是如果這里是Use Multi-Byte Character Set,那么就要自己動手加東西了,和上面操作差不多。
1.將下面XML代碼復制并保存名為XPStyle.manifest的文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.WorkSapceName"
type="win32"
/>
<description>Your app description here</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
2.將該文件復制到工程文件夾中的rec文件夾中。
3.工程->添加到工程->將rec文件夾中的XPStyle.manifest文件添加到工程中。
4.Rebuild.....就可以了。
編譯頭文件:STDAFX.CPP,STDAFX.H
這兩個文件用于建立一個預編譯的頭文件.PCH和一個預定義的類型文件STDAFX.OBJ。由于MFC體系結構非常大,包含許多頭文件,如果每次都編譯的話比較費時。因此,我們把常用的MFC頭文件都放在stdafx.h中,如afxwin.h、afxext.h、afxdisp.h、afxcmn.h等,然后讓stdafx.cpp包含這個stdafx.h文件。這樣,由于編譯器可以識別哪些文件已經(jīng)編譯過,所以stdafx.cpp就只編譯一次,并生成所謂的預編譯頭文件(因為它存放的是頭文件編譯后的信息,故名)。如果讀者以后在編程時不想讓有些MFC頭文件每次都被編譯,也可以將它加入到stdafx.h中。采用預編譯頭文件可以加速編譯過程。
工作中碰到這樣一個問題,
程序報錯:
Error 3 error C2668: 'wvsprintfW' : ambiguous call to overloaded function
這個錯誤的意思是:wvsprintfW有重載函數(shù),根據(jù)目前的參數(shù)編譯器無法確定調(diào)用哪個。
wvsprintfW屬于系統(tǒng)函數(shù),自己也沒有重載過,理應不該有這樣的問題,
可能是包含的頭文件太多,有的文件對此函數(shù)重載過。
網(wǎng)上有人舉例說:
int fun(int,int);
float fun(int,int); //編譯器就會出現(xiàn)錯誤 不知道到底調(diào)用哪個函數(shù)
這里的錯誤可能不是上述類型的,但這個例子可以幫助理解。
最終解決方法是:在調(diào)用的wvsprintfW前加”
:: “符號,指明采用全局函數(shù),這樣編譯器就不需做選擇了。
法2
函數(shù)調(diào)用有二義行。
在參數(shù)前加類型轉換
一、找到一個方法:
VC6---選項Project | Configuration Properties | C/C++ | Preprocessor | Preprocessor Definitions
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE
VS2005 項目屬性---C/++ --->預處理定義下-》配置 -》下面添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE兩個宏
或調(diào)用VS2005鼓吹的那些帶“_s”后綴的非標準函數(shù),即在其后加上"_S",如sprintf_s
或文件最開始:
#define _CRT_SECURE_NO_DEPRECATE
或者干粹在工程屬性中設置。
二、
在vs2003, vs2005中 用sprintf 會出現(xiàn) warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf' 的警告 消除方法
1: 文件最開始: #define _CRT_SECURE_NO_DEPRECATE 或者干粹在工程屬性中設置如一中所說。
2: 不屏蔽的話就只能調(diào)用VS鼓吹的那些帶“_s”后綴的非標準函數(shù)。例如sprintf_s在函數(shù)后面加_s
3: 用StringCchPrintf
三、關鍵詞: Security Enhancements in the CRT
將過去的工程用VS2005打開的時候。你有可能會遇到一大堆的警告:warning C4996。
比如:warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
原因是Visual C++ 2005使用了更加安全的run-time library routines。
新的Security CRT functions(就是那些帶有“_s”后綴的函數(shù)):
http://msdn2.microsoft.com/en-us/library/wd3wzwts(VS.80).aspx
那么如何搞定這些警告呢:
方法一:手工將原來的舊函數(shù)替換成新的Security CRT functions。
方法二:屏蔽這個警告。
在預編譯頭文件stdafx.h里(注意:一定要在沒有include任何頭文件之前)定義下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
或者#param warning(disable:4996)
方法二沒有使用新的更安全的CRT函數(shù),顯然不是一個值得推薦的方法,可是你又不想一個一個地改。
那么還有一個更方便的方法:
在預編譯頭文件stdafx.h里(同樣要在沒有include任何頭文件之前)定義下面的宏:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
在鏈接的時候便會自動將舊函數(shù)替換成
Security CRT functions。
注意:這個方法雖然使用了新的函數(shù),但是不能消除警告(原因見紅字),你還得同時使用方法二。。。
在網(wǎng)上搜索到的最常用的解決方案,那就是定義 _CRT_SECURE_NO_DEPRECATE 和 _SCL_SECURE_NO_DEPRECATE 來禁止vc2005對此產(chǎn)生警告(依然使用的是非安全庫!0顯然并不是一個好的解決方案)。而且如果使用了ATL,則還需要定義 _ATL_SECURE_NO_DEPRECATE, 使用了MFC則需要定義 _AFX_SECURE_NO_DEPRECATE。
然而盡管如此,更好的解決方案只需要定義一個宏 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么vc將會自動替換使用他們的Safe Library來代替C/C++標準庫(如strcat將被strcat_f來取代)。
即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代碼將依舊不夠安全:(, 對此,ms提出了如下10點建議:
1. 不要認為 strcpy_s 和 strncpy_s( 以及其他的字符串函數(shù))(在空間不夠的時候)會自動終止拷貝(truncate截斷,不截斷則意味著溢出).如果需要自動截斷,請使用strncpy_s (同時使用_TRUNCATE作為長度參數(shù))。
2. 記住fopen_s缺省是獨占模式。如需共享使用文件,應該使用_sopen。
3. 別忘了_dupenv_s, 它將比_getenv_s更容易使用,因為它能自動分配一個正確長度的內(nèi)存(buffer)。
4. 在scanf_s中小心參數(shù)順序。
5. 確定printf_s中格式字符串的正確。
6. 使用_countof(x)來取代sizeof(x)/sizeof(element). _countof將會正確的計算元素個數(shù),而且如果x是一個指針,編譯器將會發(fā)出一個警告(來提醒程序員,僅針對C++編譯)
7. 記住所有的sizes(大小,非長度)都是使用characters(字符,unicode下一個字符占2個byte)作為單位,而不是bytes(字節(jié)).
8. 記住所有的sizes(大小,非長度,緣由同上)包含了字符串結束符'\0'(即別忘了很多情況下size需要+1)。
9. 調(diào)試的時候監(jiān)視數(shù)據(jù)0xfd。 (在調(diào)試版本下)0xfd將會被填充在數(shù)據(jù)(buffer,通常是字符串)的結尾處。如果運行非你所愿,可能會得到一個長度錯誤。
10. 檢查所有的錯誤。 許多新函數(shù)相比舊函數(shù),能返回(表示)錯誤信息(的數(shù)值)。
查閱各種資料的標準做法似乎為
CString a;
int b;
a.Format( "%d ",b);
TEXTOUT(a);
但我使用這種方法總是提示編譯錯誤
c:\documents and settings\administrator\my documents\visual studio 2005\projects\imageprocess\imageprocess\imageprocessview.cpp(137) : error C2664: 'void ATL::CStringT <BaseType,StringTraits> ::Format(const wchar_t *,...) ' : cannot convert parameter 1 from 'const char [3] ' to 'const wchar_t * '
with
[
BaseType=wchar_t,
StringTraits=StrTraitMFC_DLL <wchar_t>
]
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
/////////////////////////////////////////
解決方法:
cannot convert parameter 1 from 'const char [3] ' to 'const wchar_t * '
從這個看你可能采用了UNICODE編碼,
可以用
a.Format(L "%d ", b);
或者
a.Format(_T( "%d "), b);
貼子來源Diy部落(http://bbs.diybl.com) 詳細出處參考:http://bbs.diybl.com/dview61t13393.html
法1.for(int nIndex=0;nIndex<m_List.GetHeaderCtrl()->GetItemCount();nIndex++)
m_List.DeleteColumn(0);
法2.Example
// The pointer to my list view control.
extern CListCtrl* pmyListCtrl;
int nColumnCount = pmyListCtrl->GetHeaderCtrl()->GetItemCount();
// Delete all of the columns.
for (int i=0;i < nColumnCount;i++)
{
pmyListCtrl->DeleteColumn(0);
}
還有一個:
while (pmyListCtrl->DeleteColumn(0));
CString 轉 wchar_t
CString path = "asdf";
wchar_t wstr[256] = path.AllocSysString();
或者:
wchar_t wcstring[256];
MultiByteToWideChar(CP_ACP,0,path,-1,wcstring,256);
wchar_t轉CString
WideCharToMultiByte(CP_ACP,0,wcstring,256,
path.GetBuffer(0),256,NULL,NULL);
path.ReleaseBuffer(0);
string 轉 CString
CString.format("%s", string.c_str());
char 轉 CString
CString.format("%s", char*);
char 轉 string
string s(char *);
string 轉 char *
char *p = string.c_str();
CString 轉 string
string s(CString.GetBuffer());
CString str = "fdjfdas";
string s = (LPCTSTR)str;
1,string -> CString
CString.format("%s", string.c_str());
用c_str()確實比data()要好.
2,char -> string
string s(char *);
你的只能初始化,在不是初始化的地方最好還是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否則就沒有釋放緩沖區(qū)所占的空間.
《C++標準函數(shù)庫》中說的
有三個函數(shù)可以將字符串的內(nèi)容轉換為字符數(shù)組和C—string
1.data(),返回沒有”\0“的字符串數(shù)組
2,c_str(),返回有”\0“的字符串數(shù)組
3,copy()
---------------------------------------------------------------
CString與int、char*、char[100]之間的轉換- -
CString與int、char*、char[100]之間的轉換- -
CString互轉int
將字符轉換為整數(shù),可以使用atoi、_atoi64或atol。
而將數(shù)字轉換為CString變量,可以使用CString的Format函數(shù)。如
CString s;
int i = 64;
s.Format("%d", i)
Format函數(shù)的功能很強,值得你研究一下。
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString ss="1212.12";
int temp=atoi((char*)LPCTSTR(ss));
CString aa;
aa.Format("%d",temp);
AfxMessageBox("var is " + aa);
}
sart.Format("%s",buf);
CString互轉char*
///char * TO cstring
CString strtest;
char * charpoint;
charpoint="give string a value";
strtest=charpoint;
///CString TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
標準C里沒有string,char *==char []==string
char *轉成CString
可以用CString.Format("%s",char *)這個方法來將char *轉成CString。
CString轉成char *
用操作符(LPCSTR)strtest 或者 (char*)(LPCSTR)strtest 就可以了。
CString轉換 char[100]
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1570001
(一) 概述
string和CString均是字符串模板類,string為標準模板類(STL)定義的字符串類,已經(jīng)納入C++標準之中;
CString(typedef CStringT > CString)為Visual C++中最常用的字符串類,繼承自CSimpleStringT類,主要應用在MFC和ATL編程中,主要數(shù)據(jù)類型有char(應用于ANSI),wchar_t(unicode),TCHAR(ANSI與unicode均可);
char*為C編程中最常用的字符串指針,一般以'\0'為結束標志;
(二) 構造
string是方便的,可以從幾乎所有的字符串構造而來,包括CString和char*;
CString次之,可以從基本的一些字符串變量構造而來,包括char*等;
char*沒有構造函數(shù),僅可以賦值;
舉例:
char* psz = “joise”;
CString cstr( psz );
string str( cstr );
(三) 運算符重載
a) operator=
string是最方便的,幾乎可以直接用所有的字符串賦值,包括CString和char*;
CString次之,可以直接用些基本的字符串賦值,包括char*等;
char*只能由指針賦值,并且是極危險的操作,建議使用strcpy或者memcpy,而且char*在聲明的時候如未賦初值建議先設為NULL,以避免野指針,令你抓狂;
舉例:
char *psz = NULL;
psz = new char[10]; //當然,以上的直接寫成char *psz = new char[10];也是一樣
memset( psz, 0, 10 );
strcpy( psz, “joise” );
CString cstr;
cstr = psz;
string str;
str = psz;
str = cstr;
delete []psz;
b) operator+
string與CString差不多,可以直接與char*進行加法,但不可以相互使用+運算符,即string str = str + cstr是非法的,須轉換成char*;
char*沒有+運算,只能使用strcat把兩個指針連在一起;
舉例:
char* psz = “joise”;
CString cstr = psz;
cstr = cstr + psz;
string str = psz;
str = str + str + psz;
strcat( psz, psz );
strcat( psz, cstr );//合法
strcat( psz, str );//非法,由此可見,CString可自動轉換為const char*,而string不行
c) operator +=
string是最強大的,幾乎可以與所有的字符串變量+=,包括CString和char*;
CString次之,可以與基本的一些字符串變量進行+=而來,包括char*等;
char*沒有+=運算符,只能使用strcat把兩個指針連在一起;
d) operator[]
CString最好,當越界時會拋出斷言異常;
string與char*下標越界結果未定義;
舉例:
char* psz = “joise”;
CString cstr = psz;
cout << cstr[8];
string str = psz;
cout << str[8];
cout << psz[8];
e) operator== 、operator!=、operator> 、operator< 、operator>= 、perator<=
CString與string之間不可以進行比較,但均可以與char*進行比較,并且比較的是值,而不是地址;
cout << ( psz == cstr );
cout << ( psz == str );
cout << ( str == psz );
cout << ( cstr == psz );//以上代碼返回均為1
(四) 常用算法
a) 查找
作用 char* string CString
查找指定值 strchr
strstr
strrstr
strspn find Find
第一個匹配的值 fild_first_of FindOneOf 從后面開始查找 ReserveFind 指定匹配方式 find_if
注:find_if中是把范圍內(nèi)的值挨個代入匹配函數(shù)直至返回true
b) 比較
作用 char* string CString 查找指定值(區(qū)分大小寫) strcmp
strncmp
strcoll
_strncoll operator<
operator>
operator<=
operator>=
operator==
operator!= Collate
Compare 查找指定值(不區(qū)分大小寫) _stricmp
_strnicmp
_stricoll
_strnicoll CollateNoCase
CompareNoCas
注:返回值如果<0則前面的值小于后面的值,反之亦然
c) 替換
作用 char* string CString 查找指定值 _strset
_strnset
replace
replace_copy
replace_copy_if
replace_if Replace
d) 插入
作用 char* string CString 查找指定值 insert Insert
e) 增加 作用 char* string CString 動態(tài)增加值 strcat push
append Append
AppendChar
AppendFormat
f) 截取
作用 char* string CString 得到部分值 用下標操作 substr Left
Mid
Right
Truncate
g) 移除
作用 char* string CString 移除部份值 remove Remove 移除空白值 RemoveBlanks
注:此為ATL提供,非C函數(shù) remove_if Trim
TrimLeft
TrimRig
h) 轉換大小寫
作用 char* string CString 轉換大小寫 _strlwr
_strupr MakeLower
MakeUpper
i) 與其他類型轉換
作用 char* string CString 轉化為數(shù)字 atoi
atod
atof Format 轉化為char* c_str
GetBuffer
GetBufferSetLen
j) 格式化
作用 char* string CString 格式化 sprintf Format
k) 得到長度
作用 char* string CString
得到長度 strlen length GetLength 得到大小 size GetAllocLength
l) 判斷為空
作用 char* string CString 判斷是否為空判斷是否==NULL或者第一個字符是否是'\0' empty IsEmpty
m) 重定義大小
作用 char* string CString 重定義大小 realloc
new resize GetBufferSetLength
n) 釋放資源
作用 char* string CString 釋放 free
delete (delete[]) ReleaseBuffer
ReleaseBufferSetLength
(五) 安全性>
CString > string > char*;
(六) 靈活性
CString > string >char*;
(七) 可移植性
char* = string > CString
在VC中使用控件一直是件讓我頭痛的事件,從控件的創(chuàng)建到控件的操作管理,都得寫一大堆代碼,相比于Delphi/VB,實在是麻煩多了。其實在之前學習SDK的時候,就有想過專門花點兒時間來學習VC中控件的使用,但一直沒空。最近準備寫一個小工具,要用到ListCtrl控件,所以又不得不好好的惡補一翻。
我是在MFC的對話框模式下使用CListCtrl控件的,其實不管在SDK或文檔/視圖模式下,VC控件的使用都差不多,下面來好好的寫寫CListCtrl控件的使用筆記。
一、CListCtrl控件的創(chuàng)建
由于我是在MFC的對話框模式下使用CListCtrl控件的,所以只需要在控件欄上選擇CListCtrl的圖形按鈕,接著添加到對話框中就行了。
二、CListCtrl控件樣式的設置
第一步:在使用CListCtrl控件之前,首先需要為該控件關聯(lián)一個變量(只針對于對話框模式):
CListCtrl m_BlogAccountList;
第二步:由于CListCtrl控件要做一些初始化操作,比如設置控件樣式,設置控件的行列并填入一些數(shù)據(jù)。初始化操作的代碼是在對話框的OnInitDialog事件中寫入的。
默認情況下,CListCtrl控件的樣式是非常簡陋的,大多情況下我們都需要對CListCtrl控件的樣式進行修改,比如設置為報表樣式,可以進行整行選擇等,如有需要還有調(diào)整CListCtrl控件的行高。諸如這些設置都需要用到CListCtrl控件的擴展樣式,所以首先得了解這些擴展樣式。
我在MSDN中沒有找到CListCtrl控件的擴展樣式資料,只好上百度百科找了找。
CListCtrl控件的擴展樣式
LVS_EX_GRIDLINES //繪制表格線
LVS_EX_SUBITEMIMAGES//子項目圖標列表
LVS_EX_CHECKBOXES //帶復選框
LVS_EX_TRACKSELECT //自動換行
LVS_EX_HEADERDRAGDROP//報表頭可以拖拽
LVS_EX_FULLROWSELECT //選擇整行
LVS_EX_ONECLICKACTIVATE//單擊激活
LVS_EX_TWOCLICKACTIVATE//雙擊激活
LVS_EX_FLATSB//扁平滾動條
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作區(qū)
對話框模式下創(chuàng)建的CListCtrl控件樣式只有一個,就是WS_BORDER,而我需要為CListCtrl設置為報表樣式,并能選擇整行,下面就可以開始寫代碼了:
//通過GetWindowLong來獲取CListCtrl已有的樣式
DWORD dwStyle = GetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE);
//在原有樣式的基本上,添加LVS_REPORT擴展樣式
SetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT);
//獲取已有的擴展樣式
DWORD dwStyles = m_BlogAccountList.GetExStyle();
//取消復選框樣式
dwStyles &= ~LVS_EX_CHECKBOXES;
//添加整行選擇和表格線擴展樣式
m_BlogAccountList.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
通過以上四句代碼,就已經(jīng)能滿足我的需求了。
三、為CListCtrl控件添加列
列的添加只需要用到LVCOLUMN結構體,所以需要先行了解了解。在MSDN中查到的LVCOLUMN結構體的定義如下:
typedef struct _LVCOLUMN {
UINT mask;
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
#if (_WIN32_IE >= 0x0300)
int iImage;
int iOrder;
#endif
} LVCOLUMN, FAR *LPLVCOLUMN;
該結構體共有8個成員。
mask是用來設置LVCOLUMN結構體中哪些成員有效,其值可以為0。mask可設置的值如下:
LVCF_FMT fmt成員有效
LVCF_IMAGE iImage成員有效
LVCF_ORDER //以下略
LVCF_SUBITEM
LVCF_TEXT
LVCF_WIDTH
fmt成員是對CListCtrl控件列標題進行設置,比如列標題中文字的對齊方式,是否在列標題中顯示圖標等。
cx成員是設置列寬。
pszText成員是設置列標題文字
cchTextMax成員是設置標題文字的緩沖區(qū)大小
iSubItem成員是設置列索引
iImage成員是設置ImageList中的圖像索引。
iOrder成員的作用未知。
下面進行添加列操作:
char *szColUmn[] = {"帳號", "密碼"};
int nColWidth[] = {100, 100};
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
lvc.fmt = LVCFMT_LEFT; //左對齊
for (int i = 0; i < 2; i++)
{
lvc.pszText = szColUmn[i];
lvc.iSubItem = i;
lvc.iOrder = i;
lvc.cx = nColWidth[i];
m_BlogAccountList.InsertColumn(i, &lvc);
}
四、為CListCtrl控件添加行
添加行的操作需要用到InsertItem和SetItemText屬性,這個簡單,就不詳述了,看代碼:
m_BlogAccountList.InsertItem(0, "abc");
m_BlogAccountList.SetItemText(0, 1, "abc");
m_BlogAccountList.SetItemText(1, 1, "123");
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/tg2003/archive/2009/04/09/4060322.aspx
CString的構造函數(shù) CString( ); 例:CString csStr;
CString( const CString& stringSrc ); 例:CString csStr("ABCDEF中文123456"); CString csStr2(csStr);
CString( TCHAR ch, int nRepeat = 1 ); 例:CString csStr('a',5); //csStr="aaaaa"
CString( LPCTSTR lpch, int nLength ); 例:CString csStr("abcdef",3); //csStr="abc"
CString( LPCWSTR lpsz ); 例:wchar_t s[]=L"abcdef"; CString csStr(s); //csStr=L"abcdef"
CString( const unsigned char* psz ); 例:const unsigned char s[]="abcdef"; const unsigned char* sp=s; CString csStr(sp); //csStr="abcdef"
CString( LPCSTR lpsz ); 例:CString csStr("abcdef"); //csStr="abcdef"
int GetLength( ) const; 返回字符串的長度,不包含結尾的空字符。 例:csStr="ABCDEF中文123456"; printf("%d",csStr.GetLength()); //16
void MakeReverse( ); 顛倒字符串的順序 例:csStr="ABCDEF中文123456"; csStr.MakeReverse(); cout<<csStr; //654321文中FEDCBA
void MakeUpper( ); 將小寫字母轉換為大寫字母 例:csStr="abcdef中文123456"; csStr.MakeUpper(); cout<<csStr; //ABCDEF中文123456
void MakeLower( ); 將大寫字母轉換為小寫字母 例:csStr="ABCDEF中文123456"; csStr.MakeLower(); cout<<csStr; //abcdef中文123456
int Compare( LPCTSTR lpsz ) const; 區(qū)分大小寫比較兩個字符串,相等時返回0,大于時返回1,小于時返回-1 例:csStr="abcdef中文123456"; csStr2="ABCDEF中文123456"; cout<<csStr.CompareNoCase(csStr2); //0
int CompareNoCase( LPCTSTR lpsz ) const; 不區(qū)分大小寫比較兩個字符串,相等時返回0,大于時返回1,小于時返回-1 例:csStr="abcdef中文123456"; csStr2="ABCDEF中文123456"; cout<<csStr.CompareNoCase(csStr2); //-1
int Delete( int nIndex, int nCount = 1 ) 刪除字符,刪除從下標nIndex開始的nCount個字符 例:csStr="ABCDEF"; csStr.Delete(2,3); cout<<csStr; // ABF //當nIndex過大,超出對像所在內(nèi)存區(qū)域時,函數(shù)沒有任何操作。 //當nIndex為負數(shù)時,從第一個字符開始刪除。 //當nCount過大,導致刪除字符超出對像所在內(nèi)存區(qū)域時,會發(fā)生無法預料的結果。 //當nCount為負數(shù)時,函數(shù)沒有任何操作。
int Insert( int nIndex, TCHAR ch ) int Insert( int nIndex, LPCTSTR pstr ) 在下標為nIndex的位置,插入字符或字符串。返回插入后對象的長度 例:csStr="abc"; csStr.Insert(2,'x'); cout<<csStr; //abxc csStr="abc"; csStr.Insert(2,"xyz"); cout<<csStr; //abxyzc //當nIndex為負數(shù)時,插入在對象開頭 //當nIndex超出對象末尾時,插入在對象末尾
int Remove( TCHAR ch ); 移除對象內(nèi)的指定字符。返回移除的數(shù)目 例:csStr="aabbaacc"; csStr.Remove('a'); cout<<csStr; //bbcc
int Replace( TCHAR chOld, TCHAR chNew ); int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew ); 替換字串 例:csStr="abcdef"; csStr.Replace('a','x'); cout<<csStr; //xbcdef csStr="abcdef"; csStr.Replace("abc","xyz"); cout<<csStr; //xyzdef
void TrimLeft( ); void TrimLeft( TCHAR chTarget ); void TrimLeft( LPCTSTR lpszTargets ); 從左刪除字符,被刪的字符與chTarget或lpszTargets匹配,一直刪到第一個不匹配的字符為止 例:csStr="aaabaacdef"; csStr.TrimLeft('a'); cout<<csStr; //baacdef csStr="aaabaacdef"; csStr.TrimLeft("ab"); cout<<csStr; //cdef //無參數(shù)時刪除空格
void TrimRight( ); void TrimRight( TCHAR chTarget ); void TrimRight( LPCTSTR lpszTargets ); 從右刪除字符,被刪的字符與chTarget或lpszTargets匹配,一直刪到第一個不匹配的字符為止 例:csStr="abcdeaafaaa"; csStr.TrimRight('a'); cout<<csStr; //abcdeaaf csStr="abcdeaafaaa"; csStr.TrimRight("fa"); cout<<csStr; //abcde //無參數(shù)時刪除空格
void Empty( ); 清空 例:csStr="abcdef"; csStr.Empty(); printf("%d",csStr.GetLength()); //0
BOOL IsEmpty( ) const; 測試對象是否為空,為空時返回零,不為空時返回非零 例:csStr="abc"; cout<<csStr.IsEmpty(); //0; csStr.Empty(); cout<<csStr.IsEmpty(); //1;
int Find( TCHAR ch ) const; int Find( LPCTSTR lpszSub ) const; int Find( TCHAR ch, int nStart ) const; int Find( LPCTSTR pstr, int nStart ) const; 查找字串,nStart為開始查找的位置。未找到匹配時返回-1,否則返回字串的開始位置 例:csStr="abcdef"; cout<<csStr.Find('b'); //1 cout<<csStr.Find("de"); //3 cout<<csStr.Find('b',3); //-1 cout<<csStr.Find('b',0); //1 cout<<csStr.Find("de",4); //-1 cout<<csStr.Find("de",0); //3 //當nStart超出對象末尾時,返回-1。 //當nStart為負數(shù)時,返回-1。
int FindOneOf( LPCTSTR lpszCharSet ) const; 查找lpszCharSet中任意一個字符在CString對象中的匹配位置。未找到時返回-1,否則返回字串的開始位置 例:csStr="abcdef"; cout<<csStr.FindOneOf("cxy"); //2
CString SpanExcluding( LPCTSTR lpszCharSet ) const; 返回對象中與lpszCharSet中任意匹配的第一個字符之前的子串 例:csStr="abcdef"; cout<<csStr.SpanExcluding("cf"); //ab
CString SpanIncluding( LPCTSTR lpszCharSet ) const; 從對象中查找與lpszCharSe中任意字符不匹配的字符,并返回第一個不匹配字符之前的字串 例:csStr="abcdef"; cout<<csStr.SpanIncluding("fdcba"); //abcd
int ReverseFind( TCHAR ch ) const; 從后向前查找第一個匹配,找到時返回下標。沒找到時返回-1 例:csStr="abba"; cout<<csStr.ReverseFind('a'); //3
void Format( LPCTSTR lpszFormat, ... ); void Format( UINT nFormatID, ... ); 格式化對象,與C語言的sprintf函數(shù)用法相同 例:csStr.Format("%d",13); cout<<csStr; //13
TCHAR GetAt( int nIndex ) const; 返回下標為nIndex的字符,與字符串的[]用法相同 例:csStr="abcdef"; cout<<csStr.GetAt(2); //c //當nIndex為負數(shù)或超出對象末尾時,會發(fā)生無法預料的結果。
void SetAt( int nIndex, TCHAR ch ); 給下標為nIndex的字符重新賦值 例:csStr="abcdef"; csStr.SetAt(2,'x'); cout<<csStr; //abxdef //當nIndex為負數(shù)或超出對象末尾時,會發(fā)生無法預料的結果。
CString Left( int nCount ) const; 從左取字串 例:csStr="abcdef"; cout<<csStr.Left(3); //abc //當nCount等于0時,返回空。 //當nCount為負數(shù)時,返回空。 //當nCount大于對象長度時,返回值與對象相同。
CString Right( int nCount ) const; 從右取字串 例:csStr="abcdef"; cout<<csStr.Right(3); //def //當nCount等于0時,返回空。 //當nCount為負數(shù)時,返回空。 //當nCount大于對象長度時,返回值與對象相同。
CString Mid( int nFirst ) const; CString Mid( int nFirst, int nCount ) const; 從中間開始取字串 例:csStr="abcdef"; cout<<csStr.Mid(2); //cdef csStr="abcdef"; cout<<csStr.Mid(2,3); //cde //當nFirst為0和為負數(shù)時,從第一個字符開始取。 //當nFirst等于對象末尾時,返回空字串。 //當nFirst超出對象末尾時,會發(fā)生無法預料的結果。 //當nCount超出對象末尾時,返回從nFirst開始一直到對象末尾的字串 //當nCount為0和為負數(shù)時,返回空字串。
LPTSTR GetBuffer( int nMinBufLength ); 申請新的空間,并返回指針 例:csStr="abcde"; LPTSTR pStr=csStr.GetBuffer(10); strcpy(pStr,"12345"); csStr.ReleaseBuffer(); pStr=NULL; cout<<csStr //12345 //使用完GetBuffer后,必須使用ReleaseBuffer以更新對象內(nèi)部數(shù)據(jù),否則會發(fā)生無法預料的結果。
void ReleaseBuffer( int nNewLength = -1 ); 使用GetBuffer后,必須使用ReleaseBuffer以更新對象內(nèi)部數(shù)據(jù) 例:csStr="abc"; LPTSTR pStr=csStr.GetBuffer(10); strcpy(pStr,"12345"); cout<<csStr.GetLength(); //3(錯誤的用法) csStr.ReleaseBuffer(); cout<<csStr.GetLength(); //5(正確) pStr=NULL; //CString對象的任何方法都應在ReleaseBuffer之后調(diào)用
LPTSTR GetBufferSetLength( int nNewLength ); 申請新的空間,并返回指針 例:csStr="abc"; csStr.GetBufferSetLength(20); cout<<csStr; //abc count<<csStr.GetLength(); //20; csStr.ReleaseBuffer(); count<<csStr.GetLength(); //3; //使用GetBufferSetLength后可以不必使用ReleaseBuffer。
|
VS2005快捷鍵大全
快捷鍵 功能
CTRL + SHIFT + B生成解決方案
CTRL + F7 生成編譯
CTRL + O 打開文件
CTRL + SHIFT + O打開項目
CTRL + SHIFT + C顯示類視圖窗口
F4 顯示屬性窗口
SHIFT + F4顯示項目屬性窗口
CTRL + SHIFT + E顯示資源視圖
F12 轉到定義
CTRL + F12轉到聲明
CTRL + ALT + J對象瀏覽
CTRL + ALT + F1幫助目錄
CTRL + F1 動態(tài)幫助
F1 幫助
SHIFT + F1當前窗口幫助
CTRL + ALT + F3幫助-搜索
SHIFT + ALT + ENTER全屏顯示
CTRL + -向后定位
CTRL + SHIFT + -向前定位
CTRL + F4關閉文檔窗口
CTRL + PAGE DOWN光標定位到窗口上方
CTRL + PAGE UP光標定位到窗口下方
CTRL + F6
CTRL + TAB下一個文檔窗口
CTRL + SHIFT + F6
CTRL + SHIFT + TAB上一個文檔窗口
ALT + F6下一個面板窗口
CTRL + K, CTRL + L取消remark
CTRL + K, CTRL + C注釋選擇的代碼
CTRL + K, CTRL + U取消對選擇代碼的注釋
CTRL + M, CTRL + O折疊代碼定義
CTRL + M, CTRL + L展開代碼定義
CTRL + DELETE刪除至詞尾
CTRL + BACKSPACE刪除至詞頭
SHIFT + TAB取消制表符
CTRL + U轉小寫
CTRL + SHIFT + U轉大寫
CTRL + SHIFT + END選擇至文檔末尾
CTRL + SHIFT + HOME選擇至文檔末尾開始
SHIFT + END選擇至行尾
SHIFT + HOME選擇至行開始處
SHIFT + ALT + END垂直選擇到最后尾
SHIFT + ALT + HOME垂直選擇到最前面
CTRL + A全選
CTRL + W選擇當前單詞
CTRL + SHIFT + PAGE UP選擇至本頁前面
CTRL + SHIFT + PAGE DOWN選擇至本頁后面
CTRL + END文檔定位到最后
CTRL + HOME文檔定位到最前
CTRL + G轉到…
CTRL + K, CTRL + P上一個標簽
CTRL + K, CTRL + N下一個標簽
ALT + F10調(diào)試-ApplyCodeChanges
CTRL + ALT+ Break停止調(diào)試
CTRL + SHIFT + F9 取消所有斷點
CTRL + F9允許中斷
CTRL + SHIFT + F5調(diào)試-重新開始
F5運行調(diào)試
CTRL + F5運行不調(diào)試
F10跨過程序執(zhí)行
F11單步逐句執(zhí)行
CTRL + J列出成員
CTRL + PAGE DOWN下一個視圖
CTRL + B格式-粗體
CTRL + SHIFT + T格式-文字縮進
調(diào)試快捷鍵
F6: 生成解決方案
Ctrl+F6: 生成當前項目
F7: 查看代碼
Shift+F7: 查看窗體設計器
F5: 啟動調(diào)試
Ctrl+F5: 開始執(zhí)行(不調(diào)試)
Shift+F5: 停止調(diào)試
Ctrl+Shift+F5: 重啟調(diào)試
F9: 切換斷點
Ctrl+F9: 啟用/停止斷點
Ctrl+Shift+F9: 刪除全部斷點
F10: 逐過程
Ctrl+F10: 運行到光標處
F11: 逐語句
編輯快捷鍵
Shift+Alt+Enter: 切換全屏編輯
Ctrl+B,T / Ctrl+K,K: 切換書簽開關
Ctrl+B,N / Ctrl+K,N: 移動到下一書簽
Ctrl+B,P: 移動到上一書簽
Ctrl+B,C: 清除全部標簽
Ctrl+I: 漸進式搜索
Ctrl+Shift+I: 反向漸進式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一個
Shift+F3: 查找上一個
Ctrl+H: 替換
Ctrl+Shift+H: 在文件中替換
Alt+F12: 查找符號(列出所有查找結果)
Ctrl+Shift+V: 剪貼板循環(huán)
Ctrl+左右箭頭鍵: 一次可以移動一個單詞
Ctrl+上下箭頭鍵: 滾動代碼屏幕,但不移動光標位置。
Ctrl+Shift+L: 刪除當前行
Ctrl+M,M: 隱藏或展開當前嵌套的折疊狀態(tài)
Ctrl+M,L: 將所有過程設置為相同的隱藏或展開狀態(tài)
Ctrl+M,P: 停止大綱顯示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自動換行
Ctrl+G: 轉到指定行
Shift+Alt+箭頭鍵: 選擇矩形文本
Alt+鼠標左按鈕: 選擇矩形文本
Ctrl+Shift+U: 全部變?yōu)榇髮?br>Ctrl+U: 全部變?yōu)樾?br>代碼快捷鍵
Ctrl+J / Ctrl+K,L: 列出成員
Ctrl+Shift+空格鍵 / Ctrl+K,P: 參數(shù)信息
Ctrl+K,I: 快速信息
Ctrl+E,C / Ctrl+K,C: 注釋選定內(nèi)容
Ctrl+E,U / Ctrl+K,U: 取消選定注釋內(nèi)容
Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代碼段
Ctrl+K,S: 插入外側代碼
F12: 轉到所調(diào)用過程或變量的定義
窗口快捷鍵
Ctrl+W,W: 瀏覽器窗口
Ctrl+W,S: 解決方案管理器
Ctrl+W,C: 類視圖
Ctrl+W,E: 錯誤列表
Ctrl+W,O: 輸出視圖
Ctrl+W,P: 屬性窗口
Ctrl+W,T: 任務列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 書簽窗口
Ctrl+W,U: 文檔大綱
Ctrl+D,B: 斷點窗口
Ctrl+D,I: 即時窗口
Ctrl+Tab: 活動窗體切換
Ctrl+Shift+N: 新建項目
Ctrl+Shift+O: 打開項目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建類
Ctrl+Shift+A: 新建項
VS2005的隱藏快捷鍵
這里我將會把一些無意中發(fā)現(xiàn)的VS2005中沒有明確指出的快捷鍵共享出來,并不是所有的快捷鍵,或者常見的一些快捷鍵。
1、Ctrl+Space直接完成類或函數(shù)(本來這個并不算隱藏的快捷鍵,但是因為中文輸入法搶占這個快捷鍵,所以。。。,替代的快捷鍵是Alt+Right)
2、Shift+Delete整行刪除,并且將這一行放到剪貼板(這時候不能選中一段內(nèi)容)
3、Shift+Insert粘貼,有點匪夷所思,Ctrl+V就可以了,大概是為了和Shift+Delete對應吧
4、Ctrl+Up,Ctrl+Down滾動編輯器,但盡量不移動光標,光標保證在可見范圍內(nèi)
5、Ctrl+BackSpace,Ctrl+Delete整詞刪除,有的時候很有用
6、Ctrl+Left,Ctrl+Right按整詞移動光標(不算隱藏,和前面幾條加起來就是Ctrl光標控制套件了)
7、Alt+Shift+F10打開執(zhí)行改名,實現(xiàn)接口和抽象類的小窗口(還可以用Ctrl+.,不過有的中文輸入法用到這個)
8、Shift+F9調(diào)試是打開QuickWatch,內(nèi)容是當前光標所在處的內(nèi)容
9、F12轉跳到定義,很有用的快捷鍵
10、Shift+F12查找所有引用
11、Ctrl+F10=F5,開始Debug
12、Ctrl+F6循環(huán)察看代碼窗口,有點Ctrl+Tab的感覺
13、Ctrl+F3查找當前光標選中的內(nèi)容,可以和F3配合使用
14、Ctrl+F2將焦點轉移到類的下拉框上
15、Alt+F7=Ctrl+Tab
16、Alt+F11新開VS2005并編輯宏
17、Alt+F12查找=Ctrl+F