锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="紼嬩僵鍚?;
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;
涓銆佸叾瀹冩暟鎹被鍨嬭漿鎹負瀛楃涓?/strong>
char buffer[200];char c = '1';int i = 35;long j = 1000;float f = 1.7320534f;sprintf( buffer, "%c",c);sprintf( buffer, "%d",i);sprintf( buffer, "%d",j);sprintf( buffer, "%f",f);
浜屻佸瓧絎︿覆杞崲涓哄叾瀹冩暟鎹被鍨?/font>
strcpy(temp,"123");
涓夈佸叾瀹冩暟鎹被鍨嬭漿鎹㈠埌CString
浣跨敤CString鐨勬垚鍛樺嚱鏁癋ormat鏉ヨ漿鎹?渚嬪:
鍥涖丅STR銆乢bstr_t涓嶤ComBSTR
浜斻乂ARIANT 銆乢variant_t 涓?COleVariant
| Byte bVal; | // VT_UI1. |
| Short iVal; | // VT_I2. |
| long lVal; | // VT_I4. |
| float fltVal; | // VT_R4. |
| double dblVal; | // VT_R8. |
| VARIANT_BOOL boolVal; | // VT_BOOL. |
| SCODE scode; | // VT_ERROR. |
| CY cyVal; | // VT_CY. |
| DATE date; | // VT_DATE. |
| BSTR bstrVal; | // VT_BSTR. |
| DECIMAL FAR* pdecVal | // VT_BYREF|VT_DECIMAL. |
| IUnknown FAR* punkVal; | // VT_UNKNOWN. |
| IDispatch FAR* pdispVal; | // VT_DISPATCH. |
| SAFEARRAY FAR* parray; | // VT_ARRAY|*. |
| Byte FAR* pbVal; | // VT_BYREF|VT_UI1. |
| short FAR* piVal; | // VT_BYREF|VT_I2. |
| long FAR* plVal; | // VT_BYREF|VT_I4. |
| float FAR* pfltVal; | // VT_BYREF|VT_R4. |
| double FAR* pdblVal; | // VT_BYREF|VT_R8. |
| VARIANT_BOOL FAR* pboolVal; | // VT_BYREF|VT_BOOL. |
| SCODE FAR* pscode; | // VT_BYREF|VT_ERROR. |
| CY FAR* pcyVal; | // VT_BYREF|VT_CY. |
| DATE FAR* pdate; | // VT_BYREF|VT_DATE. |
| BSTR FAR* pbstrVal; | // VT_BYREF|VT_BSTR. |
| IUnknown FAR* FAR* ppunkVal; | // VT_BYREF|VT_UNKNOWN. |
| IDispatch FAR* FAR* ppdispVal; | // VT_BYREF|VT_DISPATCH. |
| SAFEARRAY FAR* FAR* pparray; | // VT_ARRAY|*. |
| VARIANT FAR* pvarVal; | // VT_BYREF|VT_VARIANT. |
| void FAR* byref; | // Generic ByRef. |
| char cVal; | // VT_I1. |
| unsigned short uiVal; | // VT_UI2. |
| unsigned long ulVal; | // VT_UI4. |
| int intVal; | // VT_INT. |
| unsigned int uintVal; | // VT_UINT. |
| char FAR * pcVal; | // VT_BYREF|VT_I1. |
| unsigned short FAR * puiVal; | // VT_BYREF|VT_UI2. |
| unsigned long FAR * pulVal; | // VT_BYREF|VT_UI4. |
| int FAR * pintVal; | // VT_BYREF|VT_INT. |
| unsigned int FAR * puintVal; | //VT_BYREF|VT_UINT. |
鍏佸叾瀹冧竴浜汣OM鏁版嵁綾誨瀷
涓冦丄NSI涓嶶nicode
Unicode縐頒負瀹藉瓧絎﹀瀷瀛椾覆,COM閲屼嬌鐢ㄧ殑閮芥槸Unicode瀛楃涓層?/font>
鍏佸叾瀹?/strong>
涔濄佹敞鎰忎簨欏?/strong>
鍋囧闇瑕佷嬌鐢ㄥ埌ConvertBSTRToString姝ょ被鍑芥暟,闇瑕佸姞涓婂ご鏂囦歡comutil.h,騫跺湪setting涓姞鍏omsupp.lib鎴栬呯洿鎺ュ姞涓?pragma comment( lib, "comsupp.lib" )
榪欑瘒鏂囩珷鍖呮嫭浠ヤ笅鍐呭錛? 1銆丆String 瀵硅薄鐨勮繛鎺?/p>
銆銆鑳戒綋鐜板嚭 CString 綾誨瀷鏂逛究鎬х壒鐐圭殑涓涓柟闈㈠氨瀛楃涓茬殑榪炴帴錛屼嬌鐢?CString 綾誨瀷錛屼綘鑳藉緢鏂逛究鍦拌繛鎺ヤ袱涓瓧絎︿覆錛屾濡備笅闈㈢殑渚嬪瓙錛?/p>
CString gray("Gray");CString cat("Cat");CString graycat = gray + cat; char gray[] = "Gray";char cat[] = "Cat";char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat, gray);strcat(graycat, cat); 銆銆涓庡叾鐢?sprintf() 鍑芥暟鎴?wsprintf() 鍑芥暟鏉ユ牸寮忓寲涓涓瓧絎︿覆錛岃繕涓嶅鐢?CString 瀵硅薄鐨凢ormat()鏂規硶錛?/p>
CString s;s.Format(_T("The total is %d"), total); CString s;s.Format(_T("%d"), total); #define _T(x) x // 闈濽nicode鐗堟湰錛坣on-Unicode version錛?br>鑰屽湪Unicode鐜涓嬫槸濡備笅瀹氫箟鐨勶細 #define _T(x) L##x // Unicode鐗堟湰錛圲nicode version錛?br>鎵浠ュ湪Unicode鐜涓嬶紝瀹冪殑鏁堟灉灝辯浉褰撲簬錛?/p>
s.Format(L"%d", total); #define DIM(x) ( sizeof((x)) / sizeof((x)[0]) ) class Whatever { ... };Whatever data[] = { { ... }, ... { ... },};for(int i = 0; i < DIM(data); i++) // 鎵弿琛ㄦ牸瀵繪壘鍖歸厤欏廣?br>銆銆榪欓噷瑕佹彁閱掍綘鐨勫氨鏄竴瀹氳娉ㄦ剰閭d簺鍦ㄥ弬鏁頒腑闇瑕佺湡瀹炲瓧鑺傛暟鐨凙PI鍑芥暟璋冪敤錛屽鏋滀綘浼犻掑瓧絎︿釜鏁扮粰瀹冿紝瀹冨皢涓嶈兘姝e父宸ヤ綔銆傚涓嬶細 WriteFile(f, data, lstrlen(data), &bytesWritten, NULL); // WRONG WriteFile(f, data, lstrlen(data) * sizeof(TCHAR), &bytesWritten, NULL); // RIGHT 3銆丆String 鍨嬭漿鍖栨垚 int 鍨?/p>
銆銆鎶?CString 綾誨瀷鐨勬暟鎹漿鍖栨垚鏁存暟綾誨瀷鏈綆鍗曠殑鏂規硶灝辨槸浣跨敤鏍囧噯鐨勫瓧絎︿覆鍒版暣鏁拌漿鎹緥紼嬨?br>銆銆铏界劧閫氬父浣犳鐤戜嬌鐢╛atoi()鍑芥暟鏄竴涓ソ鐨勯夋嫨錛屽畠涔熷緢灝戜細鏄竴涓紜殑閫夋嫨銆傚鏋滀綘鍑嗗浣跨敤 Unicode 瀛楃錛屼綘搴旇鐢╛ttoi()錛屽畠鍦?ANSI 緙栫爜緋葷粺涓緙栬瘧鎴恄atoi()錛岃屽湪 Unicode 緙栫爜緋葷粺涓紪璇戞垚_wtoi()銆備綘涔熷彲浠ヨ冭檻浣跨敤_tcstoul()鎴栬卂tcstol()錛屽畠浠兘鑳芥妸瀛楃涓茶漿鍖栨垚浠繪剰榪涘埗鐨勯暱鏁存暟錛堝浜岃繘鍒躲佸叓榪涘埗銆佸崄榪涘埗鎴栧崄鍏繘鍒訛級錛屼笉鍚岀偣鍦ㄤ簬鍓嶈呰漿鍖栧悗鐨勬暟鎹槸鏃犵鍙風殑錛坲nsigned錛夛紝鑰屽悗鑰呯浉鍙嶃傜湅涓嬮潰鐨勪緥瀛愶細 CString hex = _T("FAB");CString decimal = _T("4011");ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal)); 銆銆榪欐槸鍒濆鑰呬嬌鐢?CString 鏃舵渶甯歌鐨勯棶棰樸傛湁浜?C++ 鐨勫府鍔╋紝寰堝闂浣犱笉闇瑕佹繁鍏ョ殑鍘昏冭檻瀹冿紝鐩存帴鎷挎潵鐢ㄥ氨琛屼簡錛屼絾鏄鏋滀綘涓嶈兘娣卞叆浜嗚В瀹冪殑榪愯鏈哄埗錛屽張浼氭湁寰堝闂璁╀綘榪鋒儜錛岀壒鍒槸鏈変簺鐪嬭搗鏉ユ病鏈夐棶棰樼殑浠g爜錛屽嵈鍋忓亸涓嶈兘姝e父宸ヤ綔銆?br>姣斿錛屼綘浼氬鎬負浠涔堜笉鑳藉啓鍚戜笅闈㈣繖鏍風殑浠g爜鍛細 CString graycat = "Gray" + "Cat"; CString graycat("Gray" + "Cat"); CString graycat = CString("Gray") + CString("Cat"); CString graycat = CString("Gray") + "Cat"; 娉ㄦ剰錛岀紪鍐欐湁 Unicode 鎰忚瘑鐨勪唬鐮佹繪槸涓浠跺ソ浜嬶紝姣斿錛?/p>
CString graycat = CString(_T("Gray")) + _T("Cat"); char* 杞寲涓?CString 銆銆鐜板湪浣犳湁涓涓?char* 綾誨瀷鐨勬暟鎹紝鎴栬呰涓涓瓧絎︿覆銆傛庝箞鏍峰垱寤?CString 瀵硅薄鍛紵榪欓噷鏈変竴浜涗緥瀛愶細 char * p = "This is a test"; TCHAR * p = _T("This is a test") LPTSTR p = _T("This is a test"); CString s = "This is a test"; // 8-bit onlyCString s = _T("This is a test"); // Unicode-awareCString s("This is a test"); // 8-bit onlyCString s(_T("This is a test")); // Unicode-awareCString s = p;CString s(p); TCHAR * p = _T("Gray");CString s(p);p = _T("Cat");s += p; CString 綾昏繕鏈夊嚑涓叾瀹冪殑鏋勯犲嚱鏁幫紝浣嗘槸榪欓噷鎴戜滑涓嶈冭檻瀹冿紝濡傛灉浣犳湁鍏磋叮鍙互鑷繁鏌ョ湅鐩稿叧鏂囨。銆?/p>
浜嬪疄涓婏紝CString 綾葷殑鏋勯犲嚱鏁版瘮鎴戝睍紺虹殑瑕佸鏉傦紝姣斿錛?/p>
CString s = "This is a test"; CString 杞寲鎴?char* 涔嬩竴錛氬己鍒剁被鍨嬭漿鎹負 LPCTSTR錛?/p>
銆銆榪欐槸涓縐嶇暐寰‖鎬х殑杞崲錛屾湁鍏?#8220;姝g‘”鐨勫仛娉曪紝浜轟滑鍦ㄨ璇嗕笂榪樺瓨鍦ㄨ澶氭販涔憋紝姝g‘鐨勪嬌鐢ㄦ柟娉曟湁寰堝錛屼絾閿欒鐨勪嬌鐢ㄦ柟娉曞彲鑳戒笌姝g‘鐨勪嬌鐢ㄦ柟娉曚竴鏍峰銆?br>銆銆鎴戜滑棣栧厛瑕佷簡瑙?CString 鏄竴縐嶅緢鐗規畩鐨?C++ 瀵硅薄錛屽畠閲岄潰鍖呭惈浜嗕笁涓鹼細涓涓寚鍚戞煇涓暟鎹紦鍐插尯鐨勬寚閽堛佷竴涓槸璇ョ紦鍐蹭腑鏈夋晥鐨勫瓧絎﹁鏁頒互鍙婁竴涓紦鍐插尯闀垮害銆?鏈夋晥瀛楃鏁扮殑澶у皬鍙互鏄粠0鍒拌緙撳啿鏈澶ч暱搴﹀煎噺1涔嬮棿鐨勪換浣曟暟錛堝洜涓哄瓧絎︿覆緇撳熬鏈変竴涓狽ULL瀛楃錛夈傚瓧絎﹁鏁板拰緙撳啿鍖洪暱搴﹁宸у闅愯棌銆?br>銆銆闄ら潪浣犲仛涓浜涚壒孌婄殑鎿嶄綔錛屽惁鍒欎綘涓嶅彲鑳界煡閬撶粰CString瀵硅薄鍒嗛厤鐨勭紦鍐插尯鐨勯暱搴︺傝繖鏍鳳紝鍗充嬌浣犺幏寰椾簡璇?緙撳啿鐨勫湴鍧錛屼綘涔熸棤娉曟洿鏀瑰叾涓殑鍐呭錛屼笉鑳芥埅鐭瓧絎︿覆錛屼篃 緇濆娌℃湁鍔炴硶鍔犻暱瀹冪殑鍐呭錛屽惁鍒欑涓鏃墮棿灝變細鐪嬪埌婧㈠嚭銆?br>銆銆LPCTSTR 鎿嶄綔絎︼紙鎴栬呮洿鏄庣‘鍦拌灝辨槸 TCHAR * 鎿嶄綔絎︼級鍦?CString 綾諱腑琚噸杞戒簡錛岃鎿嶄綔絎︾殑瀹氫箟鏄繑鍥炵紦鍐插尯鐨勫湴鍧錛屽洜姝わ紝濡傛灉浣犻渶瑕佷竴涓寚鍚?CString 鐨?瀛楃涓叉寚閽堢殑璇濓紝鍙互榪欐牱鍋氾細 Complex c(1.2f, 4.8f);float realpart = c; BOOL DoSomethingCool(LPCTSTR s); CString file("c:\\myfiles\\coolstuff")BOOL result = DoSomethingCool(file); 濡傛灉浣犺鏍煎紡鍖栧瓧絎︿覆鎬庝箞鍔炲憿錛?/p>
CString graycat("GrayCat");CString s;s.Format("Mew! I love %s", graycat); "Mew! I love GrayCat"銆?br>銆銆鍥犱負 MFC 鐨勮璁¤呬滑鍦ㄨ璁?CString 鏁版嵁綾誨瀷鏃墮潪甯稿皬蹇冿紝 CString 綾誨瀷琛ㄨ揪寮忔眰鍊煎悗鎸囧悜浜嗗瓧絎︿覆錛屾墍浠ヨ繖閲岀湅涓嶅埌浠諱綍璞?Format 鎴?sprintf 涓殑寮哄埗綾誨瀷杞崲錛屼綘浠嶇劧鍙互寰楀埌姝g‘鐨勮涓恒傛弿榪?CString 鐨勯檮鍔犳暟鎹疄闄呬笂鍦?CString 鍚嶄箟鍦板潃涔嬪悗銆?br>銆銆鏈変竴浠朵簨鎯呬綘鏄笉鑳藉仛鐨勶紝閭e氨鏄慨鏀瑰瓧絎︿覆銆傛瘮濡傦紝浣犲彲鑳戒細灝濊瘯鐢?#8220;,”浠f浛“.”錛堜笉瑕佸仛榪欐牱鐨勶紝濡傛灉浣犲湪涔庡浗闄呭寲闂錛屼綘搴旇浣跨敤鍗佽繘鍒惰漿鎹㈢殑 National Language Support 鐗規э紝錛夛紝涓嬮潰鏄釜綆鍗曠殑渚嬪瓙錛?/p>
CString v("1.00"); // 璐у竵閲戦錛屼袱浣嶅皬鏁癓PCTSTR p = v;p[lstrlen(p) - 3] = '',''; strcat(p, "each"); 銆銆涓嶈璇曞浘閽昏繖涓敊璇秷鎭殑鐗涜灝栵紝榪欏彧浼氫嬌浣犺嚜宸遍櫡鍏ラ夯鐑︼紒 銆銆鍘熷洜鏄紦鍐叉湁涓涓鏁幫紝瀹冩槸涓嶅彲瀛樺彇鐨勶紙瀹冧綅浜?CString 鍦板潃涔嬩笅鐨勪竴涓殣钘忓尯鍩燂級錛屽鏋滀綘鏀瑰彉榪欎釜涓詫紝緙撳啿涓殑瀛楃璁℃暟涓嶄細鍙嶆槧鎵鍋氱殑淇敼銆傛澶栵紝濡傛灉瀛楃涓查暱搴︽伆濂芥槸璇ュ瓧絎︿覆鐗╃悊闄愬埗鐨勯暱搴︼紙姊㈠悗榪樹細璁插埌榪欎釜闂錛夛紝閭d箞鎵╁睍璇ュ瓧絎︿覆灝嗘敼鍐欑紦鍐蹭互澶栫殑浠諱綍鏁版嵁錛岄偅鏄綘鏃犳潈榪涜鍐欐搷浣滅殑鍐呭瓨錛堜笉瀵瑰悧錛燂級錛屼綘浼氭瘉鎹㈠潖涓嶅睘浜庝綘鐨勫唴瀛樸傝繖鏄簲鐢ㄧ▼搴忕湡姝g殑姝諱骸澶勬柟銆?/p>
CString杞寲鎴恈har* 涔嬩簩錛氫嬌鐢?CString 瀵硅薄鐨?GetBuffer 鏂規硶錛?/p>
銆銆濡傛灉浣犻渶瑕佷慨鏀?CString 涓殑鍐呭錛屽畠鏈変竴涓壒孌婄殑鏂規硶鍙互浣跨敤錛岄偅灝辨槸 GetBuffer錛屽畠鐨勪綔鐢ㄦ槸榪斿洖涓涓彲鍐欑殑緙撳啿鎸囬拡銆?濡傛灉浣犲彧鏄墦綆椾慨鏀瑰瓧絎︽垨鑰呮埅鐭瓧絎︿覆錛屼綘瀹屽叏鍙互榪欐牱鍋氾細 CString s(_T("File.ext"));LPTSTR p = s.GetBuffer();LPTSTR dot = strchr(p, ''.''); // OK, should have used s.Find...if(p != NULL)*p = _T(''\0'');s.ReleaseBuffer(); CString s(...);LPTSTR p = s.GetBuffer();//... 榪欎釜鎸囬拡 p 鍙戠敓浜嗗緢澶氫簨鎯卛nt n = s.GetLength(); // 寰堢碂D!!!!! 鏈夊彲鑳界粰鍑洪敊璇殑絳旀!!!s.TrimRight(); // 寰堢碂!!!!! 涓嶈兘淇濊瘉鑳芥甯稿伐浣?!!!s.ReleaseBuffer(); // 鐜板湪搴旇 OKint m = s.GetLength(); // 榪欎釜緇撴灉鍙互淇濊瘉鏄紜殑銆俿.TrimRight(); // 灝嗘甯稿伐浣溿?br>銆銆鍋囪浣犳兂澧炲姞瀛楃涓茬殑闀垮害錛屼綘棣栧厛瑕佺煡閬撹繖涓瓧絎︿覆鍙兘浼氭湁澶氶暱錛屽ソ姣旀槸澹版槑瀛楃涓叉暟緇勭殑鏃跺欑敤錛?/p>
char buffer[1024]; LPTSTR p = s.GetBuffer(1024); char buffer[256];sprintf(buffer, "%......", args, ...); // ... 閮ㄥ垎鐪佺暐璁稿緇嗚妭CString s = buffer; CString s;s.Format(_T("%...."), args, ...); 銆銆鍙﹀涓涓父瑙佺殑閿欒鏄細鏃㈢劧鍥哄畾澶у皬鐨勫唴瀛樹笉宸ヤ綔錛岄偅涔堝氨閲囩敤鍔ㄦ佸垎閰嶅瓧鑺傦紝榪欑鍋氭硶寮婄鏇村ぇ錛?/p>
int len = lstrlen(parm1) + 13 lstrlen(parm2) + 10 + 100;char * buffer = new char[len];sprintf(buffer, "%s is equal to %s, valid data", parm1, parm2);CString s = buffer;......delete [] buffer; CString s;s.Format(_T("%s is equal to %s, valid data"), parm1, parm2); CString to char * 涔嬩笁錛氬拰鎺т歡鐨勬帴鍙o紱 銆銆鎴戜滑緇忓父闇瑕佹妸涓涓?CString 鐨勫間紶閫掔粰涓涓帶浠訛紝姣斿錛孋TreeCtrl銆侻FC涓烘垜浠彁渚涗簡寰堝渚垮埄鏉ラ噸杞借繖涓搷浣滐紝浣嗘槸 鍦ㄥぇ澶氭暟鎯呭喌涓嬶紝浣犱嬌鐢?#8220;鍘熷”褰㈠紡鐨勬洿鏂幫紝鍥犳闇瑕佸皢澧ㄦ煇涓覆鎸囬拡瀛樺偍鍒?TVINSERTITEMSTRUCT 緇撴瀯鐨?TVITEM 鎴愬憳涓傚涓嬶細 TVINSERTITEMSTRUCT tvi;CString s;// ... 涓簊璧嬩竴浜涘箋倀vi.item.pszText = s; // Compiler yells at you here// ... 濉啓tvi鐨勫叾浠栧煙HTREEITEM ti = c_MyTree.InsertItem(&tvi); LPTSTR pszText;int cchTextMax; tvi.item.pszText = (LPCTSTR)s; //緙栬瘧鍣ㄤ緷鐒朵細鎶ラ敊銆?br>銆銆緙栬瘧鍣ㄤ箣鎵浠ヤ緷鐒舵姤閿欐槸鍥犱負浣犺瘯鍥炬妸涓涓?LPCTSTR 綾誨瀷鐨勫彉閲忚祴鍊肩粰涓涓?LPTSTR 綾誨瀷鐨勫彉閲忥紝榪欑鎿嶄綔鍦–鎴朇++涓槸琚姝㈢殑銆備綘涓嶈兘鐢ㄨ繖縐嶆柟娉?鏉ユ互鐢ㄥ父閲忔寚閽堜笌闈炲父閲忔寚閽堟蹇碉紝鍚﹀垯錛屼細鎵頒貢緙栬瘧鍣ㄧ殑浼樺寲鏈哄埗錛屼嬌涔嬩笉鐭ュ浣曚紭鍖栦綘鐨勭▼搴忋傛瘮濡傦紝濡傛灉浣犺繖涔堝仛錛?/p>
const int i = ...;//... do lots of stuff... = a[i]; // usage 1// ... lots more stuff... = a[i]; // usage 2 const int i = ...;int * p = &i;//... do lots of stuff... = a[i]; // usage 1// ... lots more stuff(*p)++; // mess over compiler''s assumption// ... and other stuff... = a[i]; // usage 2 鍥犳錛屼綘浼氬父甯稿湪鎴戠殑浠g爜涓湅鍒板涓嬬殑鐢ㄦ硶錛?/p>
tvi.item.pszText = (LPTSTR)(LPCTSTR)s; TVITEM tvi;// ... assorted initialization of other fields of tvitvi.pszText = s.GetBuffer(MY_LIMIT);tvi.cchTextMax = MY_LIMIT;c_MyTree.GetItem(&tvi);s.ReleaseBuffer(); 5銆丆String 鍨嬭漿鍖栨垚 BSTR 鍨?/p>
銆銆褰撴垜浠嬌鐢?ActiveX 鎺т歡緙栫▼鏃訛紝緇忓父闇瑕佺敤鍒板皢鏌愪釜鍊艱〃紺烘垚 BSTR 綾誨瀷銆侭STR 鏄竴縐嶈鏁板瓧絎︿覆錛孖ntel騫沖彴涓婄殑瀹藉瓧絎︿覆錛圲nicode錛夛紝騫朵笖 鍙互鍖呭惈宓屽叆鐨?NULL 瀛楃銆?/p>
浣犲彲浠ヨ皟鐢?CString 瀵硅薄鐨?AllocSysString 鏂規硶灝?CString 杞寲鎴?BSTR錛?/p>
CString s;s = ... ; // whateverBSTR b = s.AllocSysString(); ::SysFreeString(b); 6銆丅STR 鍨嬭漿鍖栨垚 CString 鍨?/p>
銆銆鐢變簬 BSTR 鏄鏁?Unicode 瀛楃涓詫紝浣犲彲浠ョ敤鏍囧噯杞崲鏂規硶鏉ュ垱寤?8 浣嶇殑 CString銆傚疄闄呬笂錛岃繖鏄?CString 鍐呭緩鐨勫姛鑳姐傚湪 CString 涓?鏈夌壒孌婄殑鏋勯犲嚱鏁板彲浠ユ妸 ANSI 杞寲鎴?Unicode錛屼篃鍙互鎶奤nicode 杞寲鎴?ANSI銆備綘鍚屾牱鍙互浠?VARIANT 綾誨瀷鐨勫彉閲忎腑鑾峰緱 BSTR 綾誨瀷鐨勫瓧絎︿覆錛孷ARIANT 綾誨瀷鏄?鐢卞悇縐?COM 鍜?Automation (鑷姩鍖?璋冪敤榪斿洖鐨勭被鍨嬨?/p>
渚嬪錛屽湪涓涓狝NSI紼嬪簭涓細 BSTR b;b = ...; // whateverCString s(b == NULL ? L"" : b) 鍦?Unicode 妯″紡涓嬶紝瀹冪殑鏋勯犲嚱鏁版槸錛?/p>
CString::CString(LPCTSTR); CString::CString(LPCWSTR); 7銆乂ARIANT 鍨嬭漿鍖栨垚 CString 鍨?/p>
銆銆浜嬪疄涓婏紝鎴戜粠鏉ユ病鏈夎繖涔堝仛榪囷紝鍥犱負鎴戞病鏈夌敤 COM/OLE/ActiveX 緙栧啓榪囩▼搴忋備絾鏄垜鍦╩icrosoft.public.vc.mfc 鏂伴椈緇勪笂鐪嬪埌浜?Robert Quirk 鐨勪竴綃囧笘瀛愯皥鍒頒簡榪欑杞寲錛屾垜瑙夊緱鎶婁粬鐨勬枃绔犲寘鍚湪鎴戠殑鏂囩珷閲屾槸涓嶅お濂界殑鍋氭硶錛屾墍浠ュ湪榪欓噷澶氬仛涓浜涜В閲婂拰婕旂ず銆傚鏋滃拰浠栫殑鏂囩珷鏈夌浉瀛涚殑鍦版柟鍙兘鏄垜鐨勭枏蹇姐?br>銆銆VARIANT 綾誨瀷緇忓父鐢ㄦ潵緇?COM 瀵硅薄浼犻掑弬鏁幫紝鎴栬呮帴鏀朵粠 COM 瀵硅薄榪斿洖鐨勫箋備綘涔熻兘鑷繁緙栧啓榪斿洖 VARIANT 綾誨瀷鐨勬柟娉曪紝鍑芥暟榪斿洖浠涔堢被鍨?渚濊禆鍙兘錛堝茍涓斿父甯革級鏂規硶鐨勮緭鍏ュ弬鏁幫紙姣斿錛屽湪鑷姩鍖栨搷浣滀腑錛屼緷璧栦笌浣犺皟鐢ㄥ摢涓柟娉曘侷Dispatch::Invoke 鍙兘榪斿洖錛堥氳繃鍏朵竴涓弬鏁幫級涓涓?鍖呭惈鏈塀YTE銆乄ORD銆乫loat銆乨ouble銆乨ate銆丅STR 絳夌瓑 VARIANT 綾誨瀷鐨勭粨鏋滐紝錛堣瑙?MSDN 涓婄殑 VARIANT 緇撴瀯鐨勫畾涔夛級銆傚湪涓嬮潰鐨勪緥瀛愪腑錛屽亣璁?綾誨瀷鏄竴涓狟STR鐨勫彉浣擄紝涔熷氨鏄鍦ㄤ覆涓殑鍊兼槸閫氳繃 bsrtVal 鏉ュ紩鐢紝鍏朵紭鐐規槸鍦?ANSI 搴旂敤涓紝鏈変竴涓瀯閫犲嚱鏁頒細鎶?LPCWCHAR 寮曠敤鐨勫艱漿鎹負涓涓?CString錛堣 BSTR-to-CString 閮ㄥ垎錛夈傚湪 Unicode 妯″紡涓紝灝嗘垚涓烘爣鍑嗙殑 CString 鏋勯犲嚱鏁幫紝鍙傝瀵圭己鐪?:WideCharToMultiByte 杞崲鐨勫憡璇紝浠ュ強浣犺寰楁槸鍚﹀彲浠ユ帴鍙楋紙澶у鏁版儏鍐典笅錛屼綘浼氭弧鎰忕殑錛夈?br>VARIANT vaData;vaData = m_com.YourMethodHere();ASSERT(vaData.vt == VT_BSTR);CString strData(vaData.bstrVal); 銆銆濡傛灉浣犳兂鍒涘緩涓涓鏄撹繘琛岃璦鐗堟湰縐繪鐨勫簲鐢ㄧ▼搴忥紝浣犲氨涓嶈兘鍦ㄤ綘鐨勬簮浠g爜涓洿鎺ュ寘鍚湰鍦熻璦瀛楃涓?錛堜笅闈㈣繖浜涗緥瀛愭垜鐢ㄧ殑璇█閮芥槸鑻辮錛屽洜涓烘垜鐨勬湰鍦熻鏄嫳璇級錛屾瘮濡備笅闈㈣繖縐嶅啓娉曞氨寰堢碂錛?br>CString s = "There is an error"; s.Format(_T("%d - %s"), code, text); // fmt is "Error in %s file %s"http:// readorwrite is "reading" or "writing"s.Format(fmt, readorwrite, filename); // fmt is "Error in reading file %s"http:// "Error in writing file %s"s.Format(fmt, filename); STRINGTABLEIDS_READING_FILE "Reading file %s"IDS_WRITING_FILE "Writing file %s"END CString s;s.LoadString(IDS_WHATEVER);CString t( MAKEINTRESOURCE(IDS_WHATEVER));ASSERT(s == t); 9銆丆String 鍜屼復鏃跺璞?/p>
銆銆榪欐槸鍑虹幇鍦?microsoft.public.vc.mfc 鏂伴椈緇勪腑鐨勪竴涓皬闂錛屾垜綆鍗曠殑鎻愪竴涓嬶紝榪欎釜闂鏄湁涓▼搴忓憳闇瑕佸線娉ㄥ唽琛ㄤ腑鍐欏叆涓涓瓧絎︿覆錛屼粬鍐欓亾錛?br>銆銆鎴戣瘯鐫鐢?RegSetValueEx() 璁劇疆涓涓敞鍐岃〃閿殑鍊鹼紝浣嗘槸瀹冪殑緇撴灉鎬繪槸浠ゆ垜鍥版儜銆傚綋鎴戠敤char[]澹版槑涓涓彉閲忔椂瀹冭兘姝e父宸ヤ綔錛屼絾鏄綋鎴戠敤 CString 鐨勬椂鍊欙紝鎬繪槸寰楀埌涓浜涘瀮鍦撅細"ÝÝÝÝ...ÝÝÝÝÝÝ"涓轟簡紜鏄笉鏄垜鐨?CString 鏁版嵁鍑轟簡闂錛屾垜璇曠潃鐢?GetBuffer錛岀劧鍚庡己鍒惰漿鍖栨垚 char*錛孡PCSTR銆侴etBuffer 榪斿洖鐨勫兼槸姝g‘鐨勶紝浣嗘槸褰撴垜鎶婂畠璧嬪肩粰 char* 鏃訛紝瀹冨氨鍙樻垚鍨冨溇浜嗐備互涓嬫槸鎴戠殑紼嬪簭孌碉細 char* szName = GetName().GetBuffer(20);RegSetValueEx(hKey, "Name", 0, REG_SZ, (CONST BYTE *) szName, strlen (szName + 1)); 鐪熻浜哄洶鎯戯紝璇峰府甯垜銆?/p>
浜茬埍鐨?Frustrated錛?/p>
浣犵姱浜嗕竴涓浉褰撳井濡欑殑閿欒錛岃仾鏄庡弽琚仾鏄庤錛屾紜殑浠g爜搴旇璞′笅闈㈣繖鏍鳳細 10銆丆String 鐨勬晥鐜?/p>
銆銆CString 鐨勪竴涓棶棰樻槸瀹冪‘瀹炴帺钘忎簡涓浜涗綆鏁堢巼鐨勪笢瑗褲備粠鍙﹀涓涓柟闈㈣錛屽畠涔熺‘瀹炲彲浠ヨ瀹炵幇寰楁洿鍔犻珮鏁堬紝浣犲彲鑳戒細璇翠笅闈㈢殑浠g爜錛?br>CString s = SomeCString1;s += SomeCString2;s += SomeCString3;s += ",";s += SomeCString4; char s[1024];lstrcpy(s, SomeString1);lstrcat(s, SomeString2);lstrcat(s, SomeString 3);lstrcat(s, ",");lstrcat(s, SomeString4); 鍟婂搱錛侀毦閬?CString 鐪熺殑榪欎箞"楂樻晥"鍚楋紵姣斿錛屽鏋滄垜鍒涘緩 CString cat("Mew!"); CString s = SomeCString1 + SomeCString2 + SomeCString3 + "," + SomeCString4; 鎬葷粨 銆銆浠ヤ笂鏄嬌鐢?CString 鐨勪竴浜涙妧宸с傛垜姣忓ぉ鍐欑▼搴忕殑鏃跺欓兘浼氱敤鍒拌繖浜涖侰String 騫朵笉鏄竴縐嶅緢闅句嬌鐢ㄧ殑綾伙紝浣嗘槸 MFC 娌℃湁寰堟槑鏄劇殑鎸囧嚭榪欎簺鐗瑰緛錛岄渶瑕佷綘鑷繁鍘繪帰绱€佸幓鍙戠幇銆?
CString 瀵硅薄鐨勮繛鎺?/span>
鏍煎紡鍖栧瓧絎︿覆錛堝寘鎷?int 鍨嬭漿鍖栦負 CString 錛?/span>
CString 鍨嬭漿鍖栨垚 int 鍨?/span>
CString 鍨嬪拰 char* 綾誨瀷鐨勭浉浜掕漿鍖?/span>
1.char* 杞寲鎴?CString
2.CString 杞寲鎴?char* 涔嬩竴錛氫嬌鐢↙PCTSTR寮哄埗杞寲
3.CString 杞寲鎴?char* 涔嬩簩錛氫嬌鐢–String瀵硅薄鐨凣etBuffer鏂規硶
4.CString 杞寲鎴?char* 涔嬩笁: 鍜屾帶浠剁殑鎺ュ彛
5.CString 鍨嬭漿鍖栨垚 BSTR 鍨嬶紱
BSTR 鍨嬭漿鍖栨垚 CString 鍨嬶紱
VARIANT 鍨嬭漿鍖栨垚 CString 鍨嬶紱
杞藉叆瀛楃涓茶〃璧勬簮錛?
CString 鍜屼復鏃跺璞★紱
CString 鐨勬晥鐜囷紱
鎬葷粨
涓嬮潰鎴戝垎鍒璁恒?/p>
瑕佹瘮鐢ㄤ笅闈㈢殑鏂規硶濂藉緱澶氾細
2銆佹牸寮忓寲瀛楃涓?/p>
銆銆鐢ㄨ繖縐嶆柟娉曠殑濂藉鏄綘涓嶇敤鎷呭績鐢ㄦ潵瀛樻斁鏍煎紡鍖栧悗鏁版嵁鐨勭紦鍐插尯鏄惁瓚沖澶э紝榪欎簺宸ヤ綔鐢盋String綾繪浛浣犲畬鎴愩?br>銆銆鏍煎紡鍖栨槸涓縐嶆妸鍏跺畠涓嶆槸瀛楃涓茬被鍨嬬殑鏁版嵁杞寲涓篊String綾誨瀷鐨勬渶甯哥敤鎶宸э紝姣斿錛屾妸涓涓暣鏁拌漿鍖栨垚CString綾誨瀷錛屽彲鐢ㄥ涓嬫柟娉曪細
銆銆鎴戞繪槸瀵規垜鐨勫瓧絎︿覆浣跨敤_T()瀹忥紝榪欐槸涓轟簡璁╂垜鐨勪唬鐮佽嚦灝戞湁Unicode鐨勬剰璇嗭紝褰撶劧錛屽叧浜嶶nicode鐨勮瘽棰樹笉鍦ㄨ繖綃囨枃绔犵殑璁ㄨ鑼冨洿銆俖T()瀹忓湪8浣嶅瓧絎︾幆澧冧笅鏄涓嬪畾涔夌殑錛?/p>
銆銆濡傛灉浣犺涓轟綘鐨勭▼搴忓彲鑳藉湪Unicode鐨勭幆澧冧笅榪愯錛岄偅涔堝紑濮嬪湪鎰忕敤 Unicode 緙栫爜銆傛瘮濡傝錛屼笉瑕佺敤 sizeof() 鎿嶄綔絎︽潵鑾峰緱瀛楃涓茬殑闀垮害錛屽洜涓哄湪Unicode鐜涓嬪氨浼氭湁2鍊嶇殑璇樊銆傛垜浠彲浠ョ敤涓浜涙柟娉曟潵闅愯棌Unicode鐨勪竴浜涚粏鑺傦紝姣斿鍦ㄦ垜闇瑕佽幏寰楀瓧絎﹂暱搴︾殑鏃跺欙紝鎴戜細鐢ㄤ竴涓彨鍋欴IM鐨勫畯錛岃繖涓畯鏄湪鎴戠殑dim.h鏂囦歡涓畾涔夌殑錛屾垜浼氬湪鎴戝啓鐨勬墍鏈夌▼搴忎腑閮藉寘鍚繖涓枃浠訛細
銆銆榪欎釜瀹忎笉浠呭彲浠ョ敤鏉ヨВ鍐砋nicode鐨勫瓧絎︿覆闀垮害鐨勯棶棰橈紝涔熷彲浠ョ敤鍦ㄧ紪璇戞椂瀹氫箟鐨勮〃鏍間笂錛屽畠鍙互鑾峰緱琛ㄦ牸鐨勯」鏁幫紝濡備笅錛?/p>
TCHAR data[20];lstrcpyn(data, longstring, sizeof(data) - 1); // WRONG!lstrcpyn(data, longstring, DIM(data) - 1); // RIGHTWriteFile(f, data, DIM(data), &bytesWritten, NULL); // WRONG!WriteFile(f, data, sizeof(data), &bytesWritten, NULL); // RIGHT
閫犳垚浠ヤ笂鍘熷洜鏄洜涓簂strcpyn闇瑕佷竴涓瓧絎︿釜鏁頒綔涓哄弬鏁幫紝浣嗘槸WriteFile鍗撮渶瑕佸瓧鑺傛暟浣滀負鍙傛暟銆?br>鍚屾牱闇瑕佹敞鎰忕殑鏄湁鏃跺欓渶瑕佸啓鍑烘暟鎹殑鎵鏈夊唴瀹廣傚鏋滀綘浠呬粎鍙兂鍐欏嚭鏁版嵁鐨勭湡瀹為暱搴︼紝浣犲彲鑳戒細璁や負浣犲簲璇ヨ繖鏍峰仛錛?/p>
浣嗘槸鍦║nicode鐜涓嬶紝瀹冧笉浼氭甯稿伐浣溿傛紜殑鍋氭硶搴旇鏄繖鏍鳳細
銆銆鍥犱負WriteFile闇瑕佺殑鏄竴涓互瀛楄妭涓哄崟浣嶇殑闀垮害銆傦紙鍙兘鏈変簺浜轟細鎯?#8220;鍦ㄩ潪Unicode鐨勭幆澧冧笅榪愯榪欒浠g爜錛屽氨鎰忓懗鐫鎬繪槸鍦ㄥ仛涓涓浣欑殑涔?鎿嶄綔錛岃繖鏍蜂笉浼氶檷浣庣▼搴忕殑鏁堢巼鍚楋紵”榪欑鎯蟲硶鏄浣欑殑錛屼綘蹇呴』瑕佷簡瑙g紪璇戝櫒瀹為檯涓婂仛浜嗕粈涔堬紝娌℃湁鍝竴涓狢鎴朇++緙栬瘧鍣ㄤ細鎶婅繖縐嶆棤鑱婄殑涔?鎿嶄綔鐣欏湪浠g爜涓傚湪Unicode鐜涓嬭繍琛岀殑鏃跺欙紝浣犱篃涓嶅繀鎷呭績閭d釜涔?鎿嶄綔浼氶檷浣庣▼搴忕殑鏁堢巼錛岃浣忥紝榪欏彧鏄竴涓乏縐諱竴浣嶇殑鎿嶄綔鑰屽凡錛岀紪璇戝櫒涔熷緢涔愭剰涓轟綘鍋氳繖縐嶆浛鎹€傦級
銆銆浣跨敤_T瀹忓茍涓嶆槸鎰忓懗鐫浣犲凡緇忓垱寤轟簡涓涓猆nicode鐨勭▼搴忥紝浣犲彧鏄垱寤轟簡涓涓湁Unicode鎰忚瘑鐨勭▼搴忚屽凡銆傚鏋滀綘鍦ㄩ粯璁ょ殑8-bit妯″紡涓嬬紪璇戜綘鐨勭▼搴忕殑璇濓紝寰楀埌鐨勫皢鏄竴涓櫘閫氱殑8-bit鐨勫簲鐢ㄧ▼搴忥紙榪欓噷鐨?-bit鎸囩殑鍙槸8浣嶇殑瀛楃緙栫爜錛屽茍涓嶆槸鎸?浣嶇殑璁$畻鏈虹郴緇燂級錛涘綋浣犲湪Unicode鐜涓嬬紪璇戜綘鐨勭▼搴忔椂錛屼綘鎵嶄細寰楀埌涓涓猆nicode鐨勭▼搴忋傝浣忥紝CString 鍦?Unicode 鐜涓嬶紝閲岄潰鍖呭惈鐨勫彲閮芥槸16浣嶇殑瀛楃鍝︺?/p>
4銆丆String 鍨嬪拰 char* 綾誨瀷鐨勭浉浜掕漿鍖?/p>
鎴栬呰繖鏍鳳細
銆銆浜嬪疄涓婏紝緙栬瘧鍣ㄥ皢鎶辨ㄤ笂闈㈢殑榪欎簺灝濊瘯銆備負浠涔堝憿錛熷洜涓洪拡瀵笴String 鍜?LPCTSTR鏁版嵁綾誨瀷鐨勫悇縐嶅悇鏍風殑緇勫悎錛?#8220; +” 榪愮畻絎?琚畾涔夋垚涓涓噸杞芥搷浣滅銆傝屼笉鏄袱涓?LPCTSTR 鏁版嵁綾誨瀷錛屽畠鏄簳灞傛暟鎹被鍨嬨備綘涓嶈兘瀵瑰熀鏈暟鎹紙濡?int銆乧har 鎴栬?char*錛夌被鍨嬮噸杞?C++ 鐨勮繍綆楃銆備綘鍙互璞′笅闈㈣繖鏍峰仛錛?/p>
鎴栬呰繖鏍鳳細
鐮旂┒涓鐣氨浼氬彂鐜幫細“ +”鎬繪槸浣跨敤鍦ㄨ嚦灝戞湁涓涓?CString 瀵硅薄鍜屼竴涓?LPCSTR 鐨勫満鍚堛?/p>
榪欏皢浣垮緱浣犵殑浠g爜鍙互鐩存帴縐繪銆?/p>
鎴栬呰薄涓嬮潰榪欐牱鏇村叿鏈?Unicode 鎰忚瘑錛?/p>
鎴?/p>
浣犲彲浠ヤ嬌鐢ㄤ笅闈換鎰忎竴縐嶅啓娉曪細
銆銆鐢ㄨ繖浜涙柟娉曞彲浠ヨ交鏉懼皢甯擱噺瀛楃涓叉垨鎸囬拡杞崲鎴?CString銆傞渶瑕佹敞鎰忕殑鏄紝瀛楃鐨勮祴鍊兼繪槸琚嫹璐濆埌 CString 瀵硅薄涓幓鐨勶紝鎵浠ヤ綘鍙互璞′笅闈㈣繖鏍鋒搷浣滐細
緇撴灉瀛楃涓茶偗瀹氭槸“GrayCat”銆?/p>
銆銆榪欐槸寰堣崏鐜囩殑緙栫爜錛屼絾鏄疄闄呬笂瀹冨湪 Unicode 鐜涓嬭兘緙栬瘧閫氳繃銆傚畠鍦ㄨ繍琛屾椂璋冪敤鏋勯犲嚱鏁扮殑 MultiByteToWideChar 鎿嶄綔灝?8 浣嶅瓧絎︿覆杞崲鎴?16 浣嶅瓧絎︿覆銆備笉綆℃庢牱錛屽鏋?char * 鎸囬拡鏄綉緇滀笂浼犺緭鐨?8 浣嶆暟鎹紝榪欑杞崲鏄緢鏈夌敤鐨勩?/p>
CString s("GrayCat");LPCTSTR p = s;
銆銆瀹冨彲浠ユ紜湴榪愯銆傝繖鏄敱C璇█鐨勫己鍒剁被鍨嬭漿鍖栬鍒欏疄鐜扮殑銆傚綋闇瑕佸己鍒剁被鍨嬭漿鍖栨椂錛孋++瑙勬祴瀹硅榪欑閫夋嫨銆傛瘮濡傦紝浣犲彲浠ュ皢錛堟誕鐐規暟錛夊畾涔変負灝嗘煇涓鏁?錛堟湁涓瀵規誕鐐規暟錛夎繘琛屽己鍒剁被鍨嬭漿鎹㈠悗鍙繑鍥炶澶嶆暟鐨勭涓涓誕鐐規暟錛堜篃灝辨槸鍏跺疄閮級銆傚彲浠ヨ薄涓嬮潰榪欐牱錛?/p>
濡傛灉(float)鎿嶄綔絎﹀畾涔夋紜殑璇濓紝閭d箞瀹為儴鐨勭殑鍊煎簲璇ユ槸1.2銆?br>銆銆榪欑寮哄埗杞寲閫傚悎鎵鏈夎繖縐嶆儏鍐碉紝渚嬪錛屼換浣曞甫鏈?LPCTSTR 綾誨瀷鍙傛暟鐨勫嚱鏁伴兘浼氬己鍒舵墽琛岃繖縐嶈漿鎹€?浜庢槸錛屼綘鍙兘鏈夎繖鏍蜂竴涓嚱鏁幫紙涔熻鍦ㄦ煇涓綘涔版潵鐨凞LL涓級錛?/p>
浣犺薄涓嬮潰榪欐牱璋冪敤瀹冿細
銆銆瀹冭兘姝g‘榪愯銆傚洜涓?DoSomethingCool 鍑芥暟宸茬粡璇存槑浜嗛渶瑕佷竴涓?LPCTSTR 綾誨瀷鐨勫弬鏁幫紝鍥犳 LPCTSTR 琚簲鐢ㄤ簬璇ュ弬鏁幫紝鍦?MFC 涓氨鏄繑鍥炵殑涓插湴鍧銆?/p>
銆銆娉ㄦ剰鐢變簬鍦ㄥ彲鍙樺弬鏁板垪琛ㄤ腑鐨勫鹼紙鍦ㄥ嚱鏁拌鏄庝腑鏄互“...”琛ㄧず鐨勶級騫舵病鏈夐殣鍚竴涓己鍒剁被鍨嬭漿鎹㈡搷浣滅銆備綘浼氬緱鍒頒粈涔堢粨鏋滃憿錛?br>銆銆涓涓護浜烘儕璁剁殑緇撴灉錛屾垜浠緱鍒扮殑瀹為檯緇撴灉涓叉槸錛?/p>
銆銆榪欐椂緙栬瘧鍣ㄤ細鎶ラ敊錛屽洜涓轟綘璧嬪間簡涓涓父閲忎覆銆傚鏋滀綘鍋氬涓嬪皾璇曪紝緙栬瘧鍣ㄤ篃浼氶敊錛?/p>
銆銆鍥犱負 strcat 鐨勭涓涓弬鏁板簲璇ユ槸 LPTSTR 綾誨瀷鐨勬暟鎹紝鑰屼綘鍗寸粰浜嗕竴涓?LPCTSTR銆?/p>
銆銆榪欐槸 GetBuffer 鐨勭涓縐嶇敤娉曪紝涔熸槸鏈綆鍗曠殑涓縐嶏紝涓嶇敤緇欏畠浼犻掑弬鏁幫紝瀹冧嬌鐢ㄩ粯璁ゅ?0錛屾剰鎬濇槸錛?#8220;緇欐垜榪欎釜瀛楃涓茬殑鎸囬拡錛屾垜淇濊瘉涓嶅姞闀垮畠”銆傚綋浣犺皟鐢?ReleaseBuffer 鏃訛紝瀛楃涓茬殑瀹為檯闀垮害浼氳閲嶆柊璁$畻錛岀劧鍚庡瓨鍏?CString 瀵硅薄涓?br>銆銆蹇呴』寮鴻皟涓鐐癸紝鍦?GetBuffer 鍜?ReleaseBuffer 涔嬮棿榪欎釜鑼冨洿錛屼竴瀹氫笉鑳戒嬌鐢ㄤ綘瑕佹搷浣滅殑榪欎釜緙撳啿鐨?CString 瀵硅薄鐨勪換浣曟柟娉曘傚洜涓?ReleaseBuffer 琚皟鐢ㄤ箣鍓嶏紝璇?CString 瀵硅薄鐨勫畬鏁存у緱涓嶅埌淇濋殰銆傜爺絀朵互涓嬩唬鐮侊細
琛ㄧず 1024 涓瓧絎︾┖闂磋凍浠ヨ浣犲仛浠諱綍鎯沖仛寰椾簨鎯呫傚湪 CString 涓笌涔嬫剰涔夌浉絳夌殑琛ㄧず娉曪細
銆銆璋冪敤榪欎釜鍑芥暟鍚庯紝浣犱笉浠呰幏寰椾簡瀛楃涓茬紦鍐插尯鐨勬寚閽堬紝鑰屼笖鍚屾椂榪樿幏寰椾簡闀垮害鑷沖皯涓?1024 涓瓧絎︾殑絀洪棿錛堟敞鎰忥紝鎴戣鐨勬槸“瀛楃”錛岃屼笉鏄?#8220;瀛楄妭”錛屽洜涓?CString 鏄互闅愬惈鏂瑰紡鎰熺煡 Unicode 鐨勶級銆?br>銆銆鍚屾椂錛岃繕搴旇娉ㄦ剰鐨勬槸錛屽鏋滀綘鏈変竴涓父閲忎覆鎸囬拡錛岃繖涓覆鏈韓鐨勫艱瀛樺偍鍦ㄥ彧璇誨唴瀛樹腑錛屽鏋滆瘯鍥懼瓨鍌ㄥ畠錛屽嵆浣夸綘宸茬粡璋冪敤浜?GetBuffer 錛屽茍鑾峰緱涓涓彧璇誨唴瀛樼殑鎸囬拡錛屽瓨鍏ユ搷浣滀細澶辮觸錛屽茍鎶ュ憡瀛樺彇閿欒銆傛垜娌℃湁鍦?CString 涓婅瘉鏄庤繖涓鐐癸紝浣嗘垜鐪嬪埌榪囧ぇ鎶婄殑 C 紼嬪簭鍛樼粡甯哥姱榪欎釜閿欒銆?br>銆銆C 紼嬪簭鍛樻湁涓涓氱梾鏄垎閰嶄竴涓浐瀹氶暱搴︾殑緙撳啿錛屽瀹冭繘琛?sprintf 鎿嶄綔錛岀劧鍚庡皢瀹冭祴鍊肩粰涓涓?CString錛?/p>
铏界劧鏇村ソ鐨勫艦寮忓彲浠ヨ繖涔堝仛錛?/p>
濡傛灉浣犵殑瀛楃涓查暱搴︿竾涓瓚呰繃 256 涓瓧絎︾殑鏃跺欙紝涓嶄細鐮村潖鍫嗘爤銆?/p>
瀹冨彲浠ヨ兘琚畝鍗曞湴鍐欐垚錛?/p>
銆銆闇瑕佹敞鎰?sprintf 渚嬪瓙閮戒笉鏄?Unicode 灝辯華鐨勶紝灝界浣犲彲浠ヤ嬌鐢?tsprintf 浠ュ強鐢?_T() 鏉ュ寘鍥存牸寮忓寲瀛楃涓詫紝浣嗘槸鍩烘湰 鎬濊礬浠嶇劧鏄湪璧板集璺紝榪欒繖鏍峰緢瀹規槗鍑洪敊銆?/p>
銆銆涓轟粈涔堢紪璇戝櫒浼氭姤閿欏憿錛熸槑鏄庣湅璧鋒潵寰堝畬緹庣殑鐢ㄦ硶鍟婏紒浣嗘槸浜嬪疄涓婂鏋滀綘鐪嬬湅 TVITEM 緇撴瀯鐨勫畾涔変綘灝變細鏄庣櫧錛屽湪 TVITEM 緇撴瀯涓?pszText 鎴愬憳鐨勫0鏄庡涓嬶細
銆銆鍥犳錛岃祴鍊間笉鏄祴緇欎竴涓?LPCTSTR 綾誨瀷鐨勫彉閲忥紝鑰屼笖緙栬瘧鍣ㄦ棤娉曠煡閬撳浣曞皢璧嬪艱鍙ュ彸杈瑰己鍒惰漿鎹㈡垚 LPCTSTR銆傚ソ鍚э紝浣犺錛岄偅鎴戝氨鏀規垚榪欐牱錛?/p>
銆銆閭d箞錛岀紪璇戝櫒浼氫互涓烘棦鐒?i 鏄?const 錛屾墍浠?usage1鍜寀sage2鐨勫兼槸鐩稿悓鐨勶紝騫朵笖瀹冪敋鑷寵兘浜嬪厛璁$畻濂?usage1 澶勭殑 a[i] 鐨勫湴鍧錛岀劧鍚庝繚鐣欑潃鍦ㄥ悗闈㈢殑 usage2 澶勪嬌鐢紝鑰屼笉鏄噸鏂拌綆椼傚鏋滀綘鎸夊涓嬫柟寮忓啓鐨勮瘽錛?/p>
銆銆緙栬瘧鍣ㄥ皢璁や負 i 鏄父閲忥紝浠庤?a[i] 鐨勪綅緗篃鏄父閲忥紝榪欐牱闂存帴鍦扮牬鍧忎簡鍏堝墠鐨勫亣璁俱傚洜姝わ紝浣犵殑紼嬪簭灝嗕細鍦?debug 緙栬瘧妯″紡錛堟病鏈変紭鍖栵級鍜?release 緙栬瘧妯″紡錛堝畬鍏ㄤ紭鍖栵級涓弽鏄犲嚭涓嶅悓鐨勮涓猴紝榪欑鎯呭喌鍙笉濂斤紝鎵浠ュ綋浣犺瘯鍥炬妸鎸囧悜 i 鐨勬寚閽堣祴鍊肩粰涓涓?鍙慨鏀圭殑寮曠敤鏃訛紝浼氳緙栬瘧鍣ㄨ瘖鏂負榪欐槸涓縐嶄吉閫犮傝繖灝辨槸涓轟粈涔堬紙LPCTSTR錛夊己鍒剁被鍨嬭漿鍖栦笉璧蜂綔鐢ㄧ殑鍘熷洜銆?br>銆銆涓轟粈涔堜笉鎶婅鎴愬憳澹版槑鎴?LPCTSTR 綾誨瀷鍛紵鍥犱負榪欎釜緇撴瀯琚敤浜庤鍐欐帶浠躲傚綋浣犲悜鎺т歡鍐欐暟鎹椂錛屾枃鏈寚閽堝疄闄呬笂琚綋鎴?LPCTSTR錛岃屽綋浣犱粠鎺т歡璇繪暟鎹?鏃訛紝浣犲繀欏繪湁涓涓彲鍐欑殑瀛楃涓層傝繖涓粨鏋勬棤娉曞尯鍒嗗畠鏄敤鏉ヨ榪樻槸鐢ㄦ潵鍐欍?/p>
銆銆瀹冩妸 CString 寮哄埗綾誨瀷杞寲鎴?LPCTSTR錛屼篃灝辨槸璇村厛鑾峰緱鏀瑰瓧絎︿覆鐨勫湴鍧錛岀劧鍚庡啀寮哄埗綾誨瀷杞寲鎴?LPTSTR錛屼互渚垮彲浠ュ涔嬭繘琛岃祴鍊兼搷浣溿?娉ㄦ剰榪欏彧鏈夊湪浣跨敤 Set 鎴?Insert 涔嬬被鐨勬柟娉曟墠鏈夋晥錛佸鏋滀綘璇曞浘鑾峰彇鏁版嵁錛屽垯涓嶈兘榪欎箞鍋氥?br>銆銆濡傛灉浣犳墦綆楄幏鍙栧瓨鍌ㄥ湪鎺т歡涓殑鏁版嵁錛屽垯鏂規硶紼嶆湁涓嶅悓錛屼緥濡傦紝瀵規煇涓?CTreeCtrl 浣跨敤 GetItem 鏂規硶錛屾垜鎯寵幏鍙栭」鐩殑鏂囨湰銆傛垜鐭ラ亾榪欎簺 鏂囨湰鐨勯暱搴︿笉浼氳秴榪?MY_LIMIT錛屽洜姝ゆ垜鍙互榪欐牱鍐欙細
銆銆鍙互鐪嬪嚭鏉ワ紝鍏跺疄涓婇潰鐨勪唬鐮佸鎵鏈夌被鍨嬬殑 Set 鏂規硶閮介傜敤錛屼絾鏄茍涓嶉渶瑕佽繖涔堝仛錛屽洜涓烘墍鏈夌殑綾?Set 鏂規硶錛堝寘鎷?Insert鏂規硶錛変笉浼氭敼鍙樺瓧絎︿覆鐨勫唴瀹廣備絾鏄綋浣犻渶瑕佸啓 CString 瀵硅薄鏃訛紝蹇呴』淇濊瘉緙撳啿鏄彲鍐欑殑錛岃繖姝f槸 GetBuffer 鎵鍋氱殑浜嬫儏銆傚啀嬈″己璋冿細 涓鏃﹀仛浜嗕竴嬈?GetBuffer 璋冪敤錛岄偅涔堝湪璋冪敤 ReleaseBuffer 涔嬪墠涓嶈瀵硅繖涓?CString 瀵硅薄鍋氫換浣曟搷浣溿?/p>
銆銆鐜板湪鎸囬拡 b 鎸囧悜鐨勫氨鏄竴涓柊鍒嗛厤鐨?BSTR 瀵硅薄錛岃瀵硅薄鏄?CString 鐨勪竴涓嫹璐濓紝鍖呭惈緇堢粨 NULL瀛楃銆傜幇鍦ㄤ綘鍙互灝嗗畠浼犻掔粰浠諱綍闇瑕?BSTR 鐨勬帴鍙c傞氬父錛孊STR 鐢辨帴鏀跺畠鐨勭粍浠舵潵閲婃斁錛屽鏋滀綘闇瑕佽嚜宸遍噴鏀?BSTR 鐨勮瘽錛屽彲浠ヨ繖涔堝仛錛?/p>
銆銆瀵逛簬濡備綍琛ㄧず浼犻掔粰 ActiveX 鎺т歡鐨勫瓧絎︿覆錛屽湪寰蔣鍐呴儴鏇句竴搴︿簤璁轟笉浼戯紝鏈鍚?Visual Basic 鐨勪漢鍗犱簡涓婇錛孊STR錛?#8220;Basic String”鐨勯瀛楁瘝緙╁啓錛夊氨鏄繖鍦轟簤璁虹殑緇撴灉銆?/p>
銆銆瀵逛簬鍗曚釜鐨?BSTR 涓叉潵璇達紝榪欑鐢ㄦ硶鍙互宸ヤ綔寰楀緢濂斤紝榪欐槸鍥犱負 CString 鏈変竴涓壒孌婄殑鏋勯犲嚱鏁頒互LPCWSTR錛圔STR姝f槸榪欑綾誨瀷錛?涓哄弬鏁幫紝騫跺皢瀹冭漿鍖栨垚 ANSI 綾誨瀷銆備笓闂ㄦ鏌ユ槸蹇呴』鐨勶紝鍥犱負 BSTR 鍙兘涓虹┖鍊鹼紝鑰?CString 鐨勬瀯閫犲嚱鏁板浜?NULL 鍊兼儏鍐佃冭檻鐨勪笉鏄緢鍛ㄥ埌錛岋紙鎰熻阿 Brian Ross 鎸囧嚭榪欎竴鐐?錛夈傝繖縐嶇敤娉曚篃鍙兘澶勭悊鍖呭惈 NUL 緇堢粨瀛楃鐨勫崟瀛楃涓詫紱濡傛灉瑕佽漿鍖栧惈鏈夊涓?NULL 瀛楃 涓詫紝浣犲緱棰濆鍋氫竴浜涘伐浣滄墠琛屻傚湪 CString 涓唴宓岀殑 NULL 瀛楃閫氬父琛ㄧ幇涓嶅敖濡備漢鎰忥紝搴旇灝介噺閬垮厤銆?br>銆銆鏍規嵁 C/C++ 瑙勫垯錛屽鏋滀綘鏈変竴涓?LPWSTR錛岄偅涔堝畠鍒棤閫夋嫨錛屽彧鑳藉拰 LPCWSTR 鍙傛暟鍖歸厤銆?/p>
姝e涓婇潰鎵琛ㄧず鐨勶紝鍦?ANSI 妯″紡涓嬶紝瀹冩湁涓涓壒孌婄殑鏋勯犲嚱鏁幫細
銆銆瀹冧細璋冪敤涓涓唴閮ㄧ殑鍑芥暟灝?Unicode 瀛楃涓茶漿鎹㈡垚 ANSI 瀛楃涓層傦紙鍦║nicode妯″紡涓嬶紝鏈変竴涓笓闂ㄧ殑鏋勯犲嚱鏁幫紝璇ュ嚱鏁版湁涓涓弬鏁版槸LPCSTR綾誨瀷鈥斺斾竴涓?浣?ANSI 瀛楃涓?鎸囬拡錛岃鍑芥暟灝嗗畠鍔犲涓?Unicode 鐨勫瓧絎︿覆錛侊級鍐嶆寮鴻皟錛氫竴瀹氳媯鏌?BSTR 鐨勫兼槸鍚︿負 NULL銆?br>銆銆鍙﹀榪樻湁涓涓棶棰橈紝姝e涓婃枃鎻愬埌鐨勶細BSTRs鍙互鍚湁澶氫釜鍐呭祵鐨凬ULL瀛楃錛屼絾鏄?CString 鐨勬瀯閫犲嚱鏁板彧鑳藉鐞嗘煇涓覆涓崟涓?NULL 瀛楃銆?涔熷氨鏄錛屽鏋滀覆涓惈鏈夊祵鍏ョ殑 NUL瀛楄妭錛孋String 灝嗕細璁$畻鍑洪敊璇殑涓查暱搴︺備綘蹇呴』鑷繁澶勭悊瀹冦傚鏋滀綘鐪嬬湅 strcore.cpp 涓殑鏋勯犲嚱鏁幫紝浣犱細鍙戠幇 瀹冧滑閮借皟鐢ㄤ簡lstrlen錛屼篃灝辨槸璁$畻瀛楃涓茬殑闀垮害銆?br>銆銆娉ㄦ剰浠?Unicode 鍒?ANSI 鐨勮漿鎹嬌鐢ㄥ甫涓撻棬鍙傛暟鐨?::WideCharToMultiByte錛屽鏋滀綘涓嶆兂浣跨敤榪欑榛樿鐨勮漿鎹㈡柟寮忥紝鍒欏繀欏葷紪鍐欒嚜宸辯殑杞寲浠g爜銆?br>銆銆濡傛灉浣犲湪 UNICODE 妯″紡涓嬬紪璇戜唬鐮侊紝浣犲彲浠ョ畝鍗曞湴鍐欐垚錛?/p>
CString convert(BSTR b){ if(b == NULL) return CString(_T("")); CString s(b); // in UNICODE mode return s;}
銆銆濡傛灉鏄?ANSI 妯″紡錛屽垯闇瑕佹洿澶嶆潅鐨勮繃紼嬫潵杞崲銆傛敞鎰忚繖涓唬鐮佷嬌鐢ㄤ笌 ::WideCharToMultiByte 鐩稿悓鐨勫弬鏁板箋傛墍浠ヤ綘 鍙兘鍦ㄦ兂瑕佹敼鍙樿繖浜涘弬鏁拌繘琛岃漿鎹㈡椂浣跨敤璇ユ妧鏈備緥濡傦紝鎸囧畾涓嶅悓鐨勯粯璁ゅ瓧絎︼紝涓嶅悓鐨勬爣蹇楅泦絳夈?
CString convert(BSTR b){ CString s; if(b == NULL) return s; // empty for NULL BSTR#ifdef UNICODE s = b;#else LPSTR p = s.GetBuffer(SysStringLen(b) + 1); ::WideCharToMultiByte(CP_ACP, // ANSI Code Page 0, // no flags b, // source widechar string -1, // assume NUL-terminated p, // target buffer SysStringLen(b)+1, // target buffer length NULL, // use system default char NULL); // don''t care if default used s.ReleaseBuffer();#endif return s;}
銆銆鎴戝茍涓嶆媴蹇冨鏋?BSTR 鍖呭惈娌℃湁鏄犲皠鍒?8 浣嶅瓧絎﹂泦鐨?Unicode 瀛楃鏃朵細鍙戠敓浠涔堬紝鍥犱負鎴戞寚瀹氫簡::WideCharToMultiByte 鐨勬渶鍚庝袱涓弬鏁頒負 NULL銆傝繖灝辨槸浣犲彲鑳介渶瑕佹敼鍙樼殑鍦版柟銆?
浣犺繕鍙互鏍規嵁 vt 鍩熺殑涓嶅悓鏉ュ緩绔嬫洿閫氱敤鐨勮漿鎹緥紼嬨備負姝や綘鍙兘浼氳冭檻錛?/p>
CString VariantToString(VARIANT * va){ CString s; switch(va->vt) { /* vt */ case VT_BSTR: return CString(vaData->bstrVal); case VT_BSTR | VT_BYREF: return CString(*vaData->pbstrVal); case VT_I4: s.Format(_T("%d"), va->lVal); return s; case VT_I4 | VT_BYREF: s.Format(_T("%d"), *va->plVal); case VT_R8: s.Format(_T("%f"), va->dblVal); return s; ... 鍓╀笅鐨勭被鍨嬭漿鎹㈢敱璇昏呰嚜宸卞畬鎴?nbsp; default: ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional) return CString(""); } /* vt */}
8銆佽澆鍏ュ瓧絎︿覆琛ㄨ祫婧?/p>
銆銆浣犲簲璇ユ妸浣犳墍鏈夌壒瀹氳璦鐨勫瓧絎︿覆鍗曠嫭鎽嗘斁錛堣皟璇曚俊鎭佸湪鍙戝竷鐗堟湰涓笉鍑虹幇鐨勪俊鎭櫎澶栵級銆傝繖鎰忓懗鐫鍚戜笅闈㈣繖鏍峰啓姣旇緝濂斤細
銆銆鍦ㄤ綘鐨勭▼搴忎腑錛屾枃瀛楀瓧絎︿覆涓嶆槸璇█鏁忔劅鐨勩備笉綆℃庢牱錛屼綘蹇呴』寰堝皬蹇冿紝涓嶈浣跨敤涓嬮潰榪欐牱鐨勪覆錛?/p>
銆銆榪欐槸鎴戠殑鍒囪韓浣撲細銆傚湪鎴戠殑絎竴涓浗闄呭寲鐨勫簲鐢ㄧ▼搴忎腑鎴戠姱浜嗚繖涓敊璇紝灝界鎴戞噦寰瘋錛岀煡閬撳湪寰瘋鐨勮娉曚腑鍔ㄨ瘝鏀懼湪鍙ュ瓙鐨勬渶鍚庨潰錛屾垜浠殑寰峰浗鏂歸潰鐨勫彂琛屼漢榪樻槸鑻﹁嫤鐨勬姳鎬ㄤ粬浠笉寰椾笉鎻愬彇閭d簺涓嶅彲鎬濊鐨勫痙璇敊璇彁紺轟俊鎭劧鍚庨噸鏂版牸寮忓寲浠ヨ瀹冧滑鑳芥甯稿伐浣溿傛瘮杈冨ソ鐨勫姙娉曪紙涔熸槸鎴戠幇鍦ㄤ嬌鐢ㄧ殑鍔炴硶錛夋槸浣跨敤涓や釜瀛楃涓詫紝涓涓敤 浜庤錛屼竴涓敤浜庡啓錛屽湪浣跨敤鏃跺姞杞藉悎閫傜殑鐗堟湰錛屼嬌寰楀畠浠瀛楃涓插弬鏁版槸闈炴晱鎰熺殑銆備篃灝辨槸璇村姞杞芥暣涓牸寮忥紝鑰屼笉鏄姞杞戒覆“reading”錛?#8220;writing”錛?/p>
銆銆涓瀹氳娉ㄦ剰錛屽鏋滀綘鏈夊ソ鍑犱釜鍦版柟闇瑕佹浛鎹紝浣犱竴瀹氳淇濊瘉鏇挎崲鍚庡彞瀛愮殑緇撴瀯涓嶄細鍑虹幇闂錛屾瘮濡傚湪鑻辮涓紝鍙互鏄富璇?瀹捐錛屼富璇?璋撹錛屽姩璇?瀹捐鐨勭粨鏋勭瓑絳夈?br>銆銆鍦ㄨ繖閲岋紝鎴戜滑騫朵笉璁ㄨ FormatMessage錛屽叾瀹炲畠姣?sprintf/Format 榪樿鏈変紭鍔匡紝浣嗘槸涓嶅お瀹規槗鍜孋String 緇撳悎浣跨敤銆傝В鍐寵繖縐嶉棶棰樼殑鍔炴硶灝辨槸鎴戜滑鎸夌収鍙傛暟鍑虹幇鍦ㄥ弬鏁拌〃涓殑浣嶇疆緇欏弬鏁板彇鍚嶅瓧錛岃繖鏍峰湪浣犺緭鍑虹殑鏃跺欏氨涓嶄細鎶婁粬浠殑浣嶇疆鎺掗敊浜嗐?br>銆銆鎺ヤ笅鏉ユ垜浠璁烘垜浠繖浜涚嫭绔嬬殑瀛楃涓叉斁鍦ㄤ粈涔堝湴鏂廣傛垜浠彲浠ユ妸瀛楃涓茬殑鍊兼斁鍏ヨ祫婧愭枃浠朵腑鐨勪竴涓О涓?STRINGTABLE 鐨勬涓傝繃紼嬪涓嬶細棣栧厛浣跨敤 Visual Studio 鐨勮祫婧愮紪杈戝櫒鍒涘緩涓涓瓧絎︿覆錛岀劧鍚庣粰姣忎竴涓瓧絎︿覆鍙栦竴涓狪D錛屼竴鑸垜浠粰瀹冨彇鍚嶅瓧閮戒互 IDS_寮澶淬傛墍浠ュ鏋滀綘鏈変竴涓俊鎭紝浣犲彲浠ュ垱寤轟竴涓瓧絎︿覆璧勬簮鐒跺悗鍙栧悕涓?IDS_READING_FILE錛屽彟澶栦竴涓氨鍙栧悕涓?IDS_WRITING_FILE銆傚畠浠互涓嬮潰鐨勫艦寮忓嚭鐜板湪浣犵殑 .rc 鏂囦歡涓細
娉ㄦ剰錛氳繖浜涜祫婧愰兘浠?Unicode 鐨勬牸寮忎繚瀛橈紝涓嶇浣犳槸鍦ㄤ粈涔堢幆澧冧笅緙栬瘧銆備粬浠湪Win9x緋葷粺涓婁篃鏄互Unicode 鐨勫艦寮忓瓨鍦紝铏界劧 Win9x 涓嶈兘鐪熸澶勭悊 Unicode銆?br>鐒跺悗浣犲彲浠ヨ繖鏍蜂嬌鐢ㄨ繖浜涜祫婧愶細
// 鍦ㄤ嬌鐢ㄨ祫婧愪覆琛ㄤ箣鍓嶏紝紼嬪簭鏄繖鏍峰啓鐨勶細
CString fmt; if(...) fmt = "Reading file %s"; else fmt = "Writing file %s"; ... // much later CString s; s.Format(fmt, filename);
// 浣跨敤璧勬簮涓茶〃涔嬪悗錛岀▼搴忚繖鏍峰啓錛?
CString fmt; if(...) fmt.LoadString(IDS_READING_FILE); else fmt.LoadString(DS_WRITING_FILE); ... // much later CString s; s.Format(fmt, filename);
銆銆鐜板湪錛屼綘鐨勪唬鐮佸彲浠ョЩ妞嶅埌浠諱綍璇█涓幓銆侺oadString 鏂規硶闇瑕佷竴涓瓧絎︿覆璧勬簮鐨?ID 浣滀負鍙傛暟錛岀劧鍚庡畠浠?STRINGTABLE 涓彇鍑哄畠瀵瑰簲鐨勫瓧絎︿覆錛岃祴鍊肩粰 CString 瀵硅薄銆?CString 瀵硅薄鐨勬瀯閫犲嚱鏁拌繕鏈変竴涓洿鍔犺仾鏄庣殑鐗瑰緛鍙互綆鍖?STRINGTABLE 鐨勪嬌鐢ㄣ傝繖涓敤娉曞湪 CString::CString 鐨勬枃妗d腑娌℃湁鎸囧嚭錛屼絾鏄湪 鏋勯犲嚱鏁扮殑紺轟緥紼嬪簭涓嬌鐢ㄤ簡銆傦紙涓轟粈涔堣繖涓壒鎬ф病鏈夋垚涓烘寮忔枃妗g殑涓閮ㄥ垎錛岃屾槸鏀懼湪浜嗕竴涓緥瀛愪腑錛屾垜璁頒笉寰椾簡錛侊級鈥斺斻愯瘧鑰呮敞錛氫粠榪欏彞璇濈湅錛屼綔鑰呭彲鑳芥槸CString鐨勮璁¤呫傚叾瀹炲墠闈㈣繕鏈変竴鍙ョ被浼肩殑璇濄傝浠栨病鏈夊浣跨敤GetBuffer(0)鑾峰緱鐨勬寚閽堟寚鍚戠殑鍦板潃鏄惁鍙鍋氭湁鏁堟ф鏌?銆戙傝繖涓壒寰佸氨鏄細濡傛灉浣犲皢涓涓瓧絎︿覆璧勬簮鐨処D寮哄埗綾誨瀷杞崲涓?LPCTSTR錛屽皢浼氶殣鍚皟鐢?LoadString銆傚洜姝わ紝涓嬮潰涓や釜鏋勯犲瓧絎︿覆鐨勪緥瀛愬叿鏈夌浉鍚岀殑鏁堟灉錛岃屼笖鍏?ASSERT 鍦╠ebug妯″紡涓嬩笉浼氳瑙﹀彂錛?br>CString s;s.LoadString(IDS_WHATEVER);CString t( (LPCTSTR)IDS_WHATEVER );ASSERT(s == t);//涓嶄細琚Е鍙戯紝璇存槑s鍜宼鏄浉鍚岀殑銆?br>銆銆鐜板湪錛屼綘鍙兘浼氭兂錛氳繖鎬庝箞鍙兘宸ヤ綔鍛紵鎴戜滑鎬庝箞鑳芥妸 STRINGTABLE ID 杞寲鎴愪竴涓寚閽堝憿錛熷緢綆鍗曪細鎵鏈夌殑瀛楃涓?ID 閮藉湪1~65535榪欎釜鑼冨洿鍐咃紝涔熷氨鏄錛屽畠鎵鏈夌殑楂樹綅閮芥槸0錛岃屾垜浠湪紼嬪簭涓墍浣跨敤鐨勬寚閽堟槸涓嶅彲鑳藉皬浜?5535鐨勶紝鍥犱負紼嬪簭鐨勪綆 64K 鍐呭瓨姘歌繙涔熶笉鍙兘瀛樺湪鐨勶紝濡傛灉浣犺瘯鍥捐闂?x00000000鍒?x0000FFFF涔嬮棿鐨勫唴瀛橈紝灝嗕細寮曞彂涓涓唴瀛樿秺鐣岄敊璇傛墍浠ヨ1~65535鐨勫間笉鍙兘鏄竴涓唴瀛樺湴鍧錛屾墍浠ユ垜浠彲浠ョ敤榪欎簺鍊兼潵浣滀負瀛楃涓茶祫婧愮殑ID銆?br>銆銆鎴戝懼悜浜庝嬌鐢?MAKEINTRESOURCE 瀹忔樉寮忓湴鍋氳繖縐嶈漿鎹€傛垜璁や負榪欐牱鍙互璁╀唬鐮佹洿鍔犳槗浜庨槄璇匯傝繖鏄釜鍙傚悎鍦?MFC 涓嬌鐢ㄧ殑鏍囧噯瀹忋備綘瑕佽浣忥紝澶у鏁扮殑鏂規硶鍗沖彲浠ユ帴鍙椾竴涓?UINT 鍨嬬殑鍙傛暟錛屼篃鍙互鎺ュ彈涓涓?LPCTSTR 鍨嬬殑鍙傛暟錛岃繖鏄緷璧?C++ 鐨勯噸杞藉姛鑳藉仛鍒扮殑銆侰++閲嶈澆鍑芥暟甯︽潵鐨?寮婄灝辨槸閫犳垚鎵鏈夌殑寮哄埗綾誨瀷杞寲閮介渶瑕佹樉紺哄0鏄庛傚悓鏍鳳紝浣犱篃鍙互緇欏緢澶氱緇撴瀯鍙紶閫掍竴涓祫婧愬悕銆?/p>
銆銆鍛婅瘔浣犲惂錛氭垜涓嶄粎鍙槸鍦ㄨ繖閲岄紦鍚癸紝浜嬪疄涓婃垜涔熸槸榪欎箞鍋氱殑銆傚湪鎴戠殑浠g爜涓紝浣犲嚑涔庝笉鍙兘鎵懼埌涓涓瓧絎︿覆錛屽綋鐒訛紝閭d簺鍙槸鍋剁劧鍦ㄨ皟璇曚腑鍑虹幇鐨勬垨鑰呭拰璇█鏃犲叧鐨勫瓧絎︿覆闄ゅ銆?/p>
榪欎釜 Name 瀛楃涓茬殑闀垮害灝忎簬 20錛屾墍浠ユ垜涓嶈涓烘槸 GetBuffer 鐨勫弬鏁扮殑闂銆?/p>
CString Name = GetName();RegSetValueEx(hKey, _T("Name"), 0, REG_SZ, (CONST BYTE *) (LPCTSTR)Name, (Name.GetLength() + 1) * sizeof(TCHAR));
銆銆涓轟粈涔堟垜鍐欑殑浠g爜鑳借鑰屼綘鍐欑殑灝辨湁闂鍛紵涓昏鏄洜涓哄綋浣犺皟鐢?GetName 鏃惰繑鍥炵殑 CString 瀵硅薄鏄竴涓復鏃跺璞°傚弬瑙侊細銆奀++ Reference manual銆?#167;12.2
銆銆鍦ㄤ竴浜涚幆澧冧腑錛岀紪璇戝櫒鏈夊繀瑕佸垱寤轟竴涓復鏃跺璞★紝榪欐牱寮曞叆涓存椂瀵硅薄鏄緷璧栦簬瀹炵幇鐨勩傚鏋滅紪璇戝櫒寮曞叆鐨勮繖涓復鏃跺璞℃墍灞炵殑綾繪湁鏋勯犲嚱鏁扮殑璇濓紝緙栬瘧鍣ㄨ紜繚榪欎釜綾葷殑鏋勯犲嚱鏁拌璋冪敤銆傚悓鏍風殑錛屽鏋滆繖涓被澹版槑鏈夋瀽鏋勫嚱鏁扮殑璇濓紝涔熻淇濊瘉榪欎釜涓存椂瀵硅薄鐨勬瀽鏋勫嚱鏁拌璋冪敤銆?br>銆銆緙栬瘧鍣ㄥ繀欏諱繚璇佽繖涓復鏃跺璞¤閿姣佷簡銆傝閿姣佺殑紜垏鍦扮偣渚濊禆浜庡疄鐜?....榪欎釜鏋愭瀯鍑芥暟蹇呴』鍦ㄩ鍑哄垱寤鴻涓存椂瀵硅薄鐨勮寖鍥翠箣鍓嶈璋冪敤銆?br>銆銆澶ч儴鍒嗙殑緙栬瘧鍣ㄦ槸榪欐牱璁捐鐨勶細鍦ㄤ復鏃跺璞¤鍒涘緩鐨勪唬鐮佺殑涓嬩竴涓墽琛屾楠ゅ闅愬惈璋冪敤榪欎釜涓存椂瀵硅薄鐨勬瀽鏋勫嚱鏁幫紝瀹炵幇璧鋒潵錛屼竴鑸兘鏄湪涓嬩竴涓垎鍙峰銆傚洜姝わ紝榪欎釜 CString 瀵硅薄鍦?GetBuffer 璋冪敤涔嬪悗灝辮鏋愭瀯浜嗭紙欏轟究鎻愪竴鍙ワ紝浣犳病鏈夌悊鐢辯粰 GetBuffer 鍑芥暟浼犻掍竴涓弬鏁幫紝鑰屼笖娌℃湁浣跨敤ReleaseBuffer 涔熸槸涓嶅鐨勶級銆傛墍浠?GetBuffer 鏈潵榪斿洖鐨勬槸鎸囧悜榪欎釜涓存椂瀵硅薄涓瓧絎︿覆鐨勫湴鍧鐨勬寚閽堬紝浣嗘槸褰撹繖涓復鏃跺璞¤鏋愭瀯鍚庯紝榪欏潡鍐呭瓨灝辮閲婃斁浜嗐傜劧鍚?MFC 鐨勮皟璇曞唴瀛樺垎閰嶅櫒浼氶噸鏂頒負榪欏潡鍐呭瓨鍏ㄩ儴濉笂 0xDD錛屾樉紺哄嚭鏉ュ垰濂藉氨鏄?#8220;Ý”絎﹀彿銆傚湪榪欎釜鏃跺欎綘鍚戞敞鍐岃〃涓啓鏁版嵁錛屽瓧絎︿覆鐨勫唴瀹瑰綋鐒跺叏琚牬鍧忎簡銆?br>銆銆鎴戜滑涓嶅簲璇ョ珛鍗蟲妸榪欎釜涓存椂瀵硅薄杞寲鎴?char* 綾誨瀷錛屽簲璇ュ厛鎶婂畠淇濆瓨鍒頒竴涓?CString 瀵硅薄涓紝榪欐剰鍛崇潃鎶婁復鏃跺璞″鍒朵簡涓浠斤紝鎵浠ュ綋涓存椂鐨?CString 瀵硅薄琚瀽鏋勪簡涔嬪悗錛岃繖涓?CString 瀵硅薄涓殑鍊間緷鐒朵繚瀛樼潃銆傝繖涓椂鍊欏啀鍚戞敞鍐岃〃涓啓鏁版嵁灝辨病鏈夐棶棰樹簡銆?br>銆銆姝ゅ錛屾垜鐨勪唬鐮佹槸鍏鋒湁 Unicode 鎰忚瘑鐨勩傞偅涓搷浣滄敞鍐岃〃鐨勫嚱鏁伴渶瑕佷竴涓瓧鑺傚ぇ灝忥紝浣跨敤lstrlen(Name+1) 寰楀埌鐨勫疄闄呯粨鏋滃浜?Unicode 瀛楃鏉ヨ姣?ANSI 瀛楃瑕佸皬涓鍗婏紝鑰屼笖瀹冧篃涓嶈兘浠庤繖涓瓧絎︿覆鐨勭浜屼釜瀛楃璧峰紑濮嬭綆楋紝涔熻浣犵殑鏈剰鏄?lstrlen(Name) + 1錛圤K錛屾垜鎵胯錛屾垜涔熺姱浜嗗悓鏍風殑閿欒錛侊級銆備笉璁哄浣曪紝鍦?Unicode 妯″紡涓嬶紝鎵鏈夌殑瀛楃閮芥槸2涓瓧鑺傚ぇ灝忥紝鎴戜滑闇瑕佸鐞嗚繖涓棶棰樸傚井杞殑鏂囨。浠や漢鎯婅鍦板姝や繚鎸佺紕榛橈細REG_SZ 鐨勫肩┒绔熸槸浠ュ瓧鑺傝綆楄繕鏄互瀛楃璁$畻鍛紵鎴戜滑鍋囪瀹冩寚鐨勬槸浠ュ瓧鑺備負鍗曚綅璁$畻錛屼綘闇瑕佸浣犵殑浠g爜鍋氫竴浜涗慨鏀規潵璁$畻榪欎釜瀛楃涓叉墍鍚湁鐨勫瓧鑺傚ぇ灝忋?/p>
姣旇搗涓嬮潰鐨勪唬鐮佹潵錛屾晥鐜囪浣庡浜嗭細
銆銆鎬諱箣錛屼綘鍙兘浼氭兂錛岄鍏堬紝瀹冧負 SomeCString1 鍒嗛厤涓鍧楀唴瀛橈紝鐒跺悗鎶?SomeCString1 澶嶅埗鍒伴噷闈紝鐒跺悗鍙戠幇瀹冭鍋氫竴涓繛鎺ワ紝鍒欓噸鏂板垎閰嶄竴鍧楁柊鐨勮凍澶熷ぇ鐨勫唴瀛橈紝澶у埌鑳藉鏀句笅褰撳墠鐨勫瓧絎︿覆鍔犱笂SomeCString2錛屾妸鍐呭澶嶅埗鍒拌繖鍧楀唴瀛?錛岀劧鍚庢妸 SomeCString2 榪炴帴鍒板悗闈紝鐒跺悗閲婃斁絎竴鍧楀唴瀛橈紝騫舵妸鎸囬拡閲嶆柊鎸囧悜鏂板唴瀛樸傜劧鍚庝負姣忎釜瀛楃涓查噸澶嶈繖涓繃紼嬨傛妸榪?4 涓瓧絎︿覆榪炴帴璧鋒潵鏁堢巼澶氫綆鍟娿備簨瀹炰笂錛屽湪寰堝鎯呭喌涓嬫牴鏈氨涓嶉渶瑕佸鍒舵簮瀛楃涓詫紙鍦?+= 鎿嶄綔絎﹀乏杈圭殑瀛楃涓詫級銆?br>銆銆鍦?VC++6.0 涓紝Release 妯″紡涓嬶紝鎵鏈夌殑 CString 涓殑緙撳瓨閮芥槸鎸夐瀹氫箟閲忓瓙鍒嗛厤鐨勩傛墍璋撻噺瀛愶紝鍗崇‘瀹氫負 64銆?28銆?56 鎴栬?512 瀛楄妭銆傝繖鎰忓懗鐫闄ら潪瀛楃涓查潪甯擱暱錛岃繛鎺ュ瓧絎︿覆鐨勬搷浣滃疄闄呬笂灝辨槸 strcat 緇忚繃浼樺寲鍚庣殑鐗堟湰錛堝洜涓哄畠鐭ラ亾鏈湴鐨勫瓧絎︿覆搴旇鍦ㄤ粈涔堝湴鏂圭粨鏉燂紝鎵浠ヤ笉闇瑕佸鎵懼瓧絎︿覆鐨勭粨灝撅紱鍙渶瑕佹妸鍐呭瓨涓殑鏁版嵁鎷瘋礉鍒版寚瀹氱殑鍦版柟鍗沖彲錛夊姞涓婇噸鏂拌綆楀瓧絎︿覆鐨勯暱搴︺傛墍浠ュ畠鐨勬墽琛屾晥鐜囧拰綰?C 鐨勪唬鐮佹槸涓鏍風殑錛屼絾鏄畠鏇村鏄撳啓銆佹洿瀹規槗緇存姢鍜屾洿瀹規槗鐞嗚В銆?br>銆銆濡傛灉浣犺繕鏄笉鑳界‘瀹氱┒绔熷彂鐢熶簡鎬庢牱鐨勮繃紼嬶紝璇風湅鐪?CString 鐨勬簮浠g爜錛宻trcore.cpp錛屽湪浣?vc98鐨勫畨瑁呯洰褰曠殑 mfc\src 瀛愮洰褰曚腑銆傜湅鐪?ConcatInPlace 鏂規硶錛屽畠琚湪鎵鏈夌殑 += 鎿嶄綔絎︿腑璋冪敤銆?/p>
銆銆鐒跺悗鎴戝茍涓嶆槸寰楀埌浜嗕竴涓珮鏁堢殑銆佺簿綆鐨?涓瓧鑺傚ぇ灝忕殑緙撳啿鍖猴紙4涓瓧絎﹀姞涓涓粨鏉熷瓧絎︼級錛岀郴緇熷皢緇欐垜鍒嗛厤64涓瓧鑺傦紝鑰屽叾涓?9涓瓧鑺傞兘琚氮璐逛簡銆?br>銆銆濡傛灉浣犱篃鏄繖涔堟兂鐨勮瘽錛岄偅涔堝氨璇峰噯澶囧ソ鎺ュ彈鍐嶆暀鑲插惂銆傚彲鑳藉湪鏌愪釜鍦版柟鏌愪釜浜虹粰浣犺榪囧敖閲忎嬌鐢ㄥ皯鐨勭┖闂存槸浠跺ソ浜嬫儏銆備笉閿欙紝榪欑璇存硶鐨勭‘姝g‘錛屼絾鏄粬蹇界暐浜嗕簨瀹炰腑涓涓緢閲嶈鐨勬柟闈€?br>銆銆濡傛灉浣犵紪鍐欑殑鏄繍琛屽湪16K EPROMs涓嬬殑宓屽叆寮忕▼搴忕殑璇濓紝浣犳湁鐞嗙敱灝介噺灝戜嬌鐢ㄧ┖闂達紝鍦ㄨ繖縐嶇幆澧冧笅錛屽畠鑳戒嬌浣犵殑紼嬪簭鏇村仴澹備絾鏄湪 500MHz, 256MB鐨勬満鍣ㄤ笂鍐?Windows 紼嬪簭錛屽鏋滀綘榪樻槸榪欎箞鍋氾紝瀹冨彧浼氭瘮浣犺涓虹殑“浣庢晥”鐨勪唬鐮佽繍琛屽緱鏇寸碂銆?br>銆銆涓句緥鏉ヨ銆傚瓧絎︿覆鐨勫ぇ灝忚璁や負鏄獎鍝嶆晥鐜囩殑棣栬鍥犵礌錛屼嬌瀛楃涓插敖鍙兘灝忓彲浠ユ彁楂樻晥鐜囷紝鍙嶄箣鍒欓檷浣庢晥鐜囷紝榪欐槸澶у涓璐殑鎯蟲硶銆備絾鏄繖縐嶆兂娉曟槸涓嶅鐨勶紝綺劇‘鐨勫唴瀛樺垎閰嶇殑鍚庢灉瑕佸湪紼嬪簭榪愯浜嗗ソ鍑犱釜灝忔椂鍚庢墠鑳戒綋鐜板緱鍑烘潵錛岄偅鏃訛紝紼嬪簭鐨勫爢涓皢鍏呮弧灝忕墖鐨勫唴瀛橈紝瀹冧滑澶皬浠ヨ嚦浜庝笉鑳界敤鏉ュ仛浠諱綍浜嬶紝浣嗘槸浠栦滑澧炲姞浜嗕綘紼嬪簭鐨勫唴瀛樼敤閲忥紝澧炲姞浜嗗唴瀛橀〉闈氦鎹㈢殑嬈℃暟錛屽綋欏甸潰浜ゆ崲鐨勬鏁板鍔犲埌緋葷粺鑳藉蹇嶅彈鐨勪笂闄愶紝緋葷粺鍒欎細涓轟綘鐨勭▼搴忓垎閰嶆洿澶氱殑欏甸潰錛岀洿鍒頒綘鐨勭▼搴忓崰鐢ㄤ簡鎵鏈夌殑鍙敤鍐呭瓨銆傜敱姝ゅ彲瑙侊紝铏界劧鍐呭瓨紕庣墖鏄喅瀹氭晥鐜囩殑嬈¤鍥犵礌錛屼絾姝f槸榪欎簺鍥犵礌瀹為檯鎺у埗浜嗙郴緇熺殑琛屼負錛屾渶緇堬紝瀹冩崯瀹充簡緋葷粺鐨勫彲闈犳э紝榪欐槸浠や漢鏃犳硶鎺ュ彈鐨勩?br>銆銆璁頒綇錛屽湪 debug 妯″紡涓嬶紝鍐呭瓨寰寰鏄簿紜垎閰嶇殑錛岃繖鏄負浜嗘洿濂界殑鎺掗敊銆?br>銆銆鍋囪浣犵殑搴旂敤紼嬪簭閫氬父闇瑕佽繛緇伐浣滃ソ鍑犱釜鏈堛傛瘮濡傦紝鎴戝父鎵撳紑 VC++錛學ord錛孭owerPoint錛孎rontpage錛孫utlook Express錛孎orté Agent錛孖nternet Explorer鍜屽叾瀹冪殑涓浜涚▼搴忥紝鑰屼笖閫氬父涓嶅叧闂畠浠傛垜鏇劇粡澶滀互緇ф棩鍦拌繛緇敤 PowerPoint 宸ヤ綔浜嗗ソ鍑犲ぉ錛堝弽涔嬶紝濡傛灉浣犱笉騫鎬笉寰椾笉浣跨敤鍍?Adobe FrameMaker 榪欐牱鐨勭▼搴忕殑璇濓紝浣犲皢浼氫綋浼氬埌鍙潬鎬х殑閲嶈錛涜繖涓▼搴忔満浼氭瘡澶╅兘瑕佸穿婧?~6嬈★紝姣忔閮芥槸鍥犱負鐢ㄥ畬浜嗘墍鏈夌殑絀洪棿騫跺~婊℃垜鎵鏈夌殑浜ゆ崲欏甸潰錛夈傛墍浠ョ簿紜唴瀛樺垎閰嶆槸涓嶅彲鍙栫殑錛屽畠浼氬嵄鍙婂埌緋葷粺鐨勫彲闈犳э紝騫跺紩璧峰簲鐢ㄧ▼搴忓穿婧冦?br>銆銆鎸夐噺瀛愮殑鍊嶆暟涓哄瓧絎︿覆鍒嗛厤鍐呭瓨錛屽唴瀛樺垎閰嶅櫒灝卞彲浠ュ洖鏀剁敤榪囩殑鍐呭瓨鍧楋紝閫氬父榪欎簺鍥炴敹鐨勫唴瀛樺潡椹笂灝卞彲浠ヨ鍏跺畠鐨?CString 瀵硅薄閲嶆柊鐢ㄥ埌錛岃繖鏍峰氨鍙互淇濊瘉紕庣墖鏈灝戙傚垎閰嶅櫒鐨勫姛鑳藉姞寮轟簡錛屽簲鐢ㄧ▼搴忕敤鍒扮殑鍐呭瓨灝辮兘灝藉彲鑳戒繚鎸佹渶灝忥紝榪欐牱鐨勭▼搴忓氨鍙互榪愯鍑犱釜鏄熸湡鎴栧嚑涓湀鑰屼笉鍑虹幇闂銆?br>銆銆棰樺璇濓細寰堝騫翠互鍓嶏紝鎴戜滑鍦?CMU 鍐欎竴涓氦浜掑紡緋葷粺鐨勬椂鍊欙紝涓浜涘鍐呭瓨鍒嗛厤鍣ㄧ殑鐮旂┒鏄劇ず鍑哄畠寰寰浜х敓寰堝鍐呭瓨紕庣墖銆侸im Mitchell錛岀幇鍦ㄤ粬鍦?Sun Microsystems 宸ヤ綔錛岄偅鏃朵警浠栧垱閫犱簡涓縐嶅唴瀛樺垎閰嶅櫒錛屽畠淇濈暀浜嗕竴涓唴瀛樺垎閰嶇姸鍐電殑榪愯鏃剁粺璁¤〃錛岃繖縐嶆妧鏈拰褰撴椂鐨勪富嫻佸垎閰嶅櫒鎵鐢ㄧ殑鎶鏈兘涓嶅悓錛屼笖杈冧負棰嗗厛銆傚綋涓涓唴瀛樺潡闇瑕佽鍒嗗壊寰楁瘮鏌愪竴涓煎皬鐨勮瘽錛屼粬騫朵笉鍒嗗壊瀹冿紝鍥犳鍙互閬垮厤浜х敓澶灝忓埌浠涔堜簨閮藉共涓嶄簡鐨勫唴瀛樼鐗囥備簨瀹炰笂浠栧湪鍐呭瓨鍒嗛厤鍣ㄤ腑浣跨敤浜嗕竴涓誕鍔ㄦ寚閽堬紝浠栬涓猴細涓庡叾璁╂寚浠ゅ仛闀挎椂闂寸殑瀛樺彇鍐呭瓨鎿嶄綔錛岃繕涓嶅綆鍗曠殑蹇界暐閭d簺澶皬鐨勫唴瀛樺潡鑰屽彧鍋氫竴浜涙誕鍔ㄦ寚閽堢殑鎿嶄綔銆傦紙His observation was that the long-term saving in instructions by not having to ignore unusable small storage chunks far and away exceeded the additional cost of doing a few floating point operations on an allocation operation.錛変粬鏄鐨勩?br>銆銆姘歌繙涓嶈璁や負鎵璋撶殑“鏈浼樺寲”鏄緩绔嬪湪姣忎竴琛屼唬鐮侀兘楂橀熶笖鑺傜渷鍐呭瓨鐨勫熀紜涓婄殑錛屼簨瀹炰笂錛岄珮閫熶笖鑺傜渷鍐呭瓨搴旇鏄湪涓涓簲鐢ㄧ▼搴忕殑鏁翠綋姘村鉤涓婅冭檻鐨勩傚湪杞歡鐨勬暣浣撴按騫充笂錛屽彧浣跨敤鏈灝忓唴瀛樼殑瀛楃涓插垎閰嶇瓥鐣ュ彲鑳芥槸鏈緋熺硶鐨勪竴縐嶆柟娉曘?br>銆銆濡傛灉浣犺涓轟紭鍖栨槸浣犲湪姣忎竴琛屼唬鐮佷笂鍋氱殑閭d簺鍔姏鐨勮瘽錛屼綘搴旇鎯充竴鎯籌細鍦ㄦ瘡涓琛屼唬鐮佷腑鍋氱殑浼樺寲寰堝皯鑳界湡姝h搗浣滅敤銆備綘鍙互鐪嬫垜鐨勫彟涓綃囧叧浜庝紭鍖栭棶棰樼殑鏂囩珷銆奩our Worst Enemy for some thought-provoking ideas銆嬨?br>銆銆璁頒綇錛?= 榪愮畻絎﹀彧鏄竴縐嶇壒渚嬶紝濡傛灉浣犲啓鎴愪笅闈㈣繖鏍鳳細
鍒欐瘡涓涓?+ 鐨勫簲鐢ㄤ細閫犳垚涓涓柊鐨勫瓧絎︿覆琚垱寤哄拰涓嬈″鍒舵搷浣溿?/p>
]]>
浣滆咃細鍛ㄧ劚
棣?鍏堬紝搴旇娓呮MFC鐨勬秷鎭驚鐜?::GetMessage,::PeekMessage)錛屾秷鎭車(CWinThread::PumpMessage)鍜?MFC鐨勬秷鎭湪紿楀彛涔嬮棿鐨勮礬鐢辨槸涓や歡涓嶅悓鐨勪簨鎯呫傚湪MFC鐨勫簲鐢ㄧ▼搴忎腑(搴旂敤紼嬪簭綾誨熀浜嶤WinThread緇ф壙)錛屽繀欏昏鏈変竴涓秷鎭驚鐜紝浠栫殑浣滅敤鏄粠 搴旂敤紼嬪簭鐨勬秷鎭槦鍒椾腑璇誨彇娑堟伅錛屽茍鎶婂畠媧鵑佸嚭鍘?::DispatchMessage)銆傝屾秷鎭礬鐢辨槸鎸囨秷鎭淳閫佸嚭鍘諱箣鍚庯紝緋葷粺(USER32.DLL) 鎶婃秷鎭姇閫掑埌鍝釜紿楀彛錛屼互鍙婁互鍚庢秷鎭湪紿楀彛涔嬮棿鐨勪紶閫掓槸鎬庢牱鐨勩?/font>
娑堟伅鍒嗕負闃熷垪娑堟伅(榪涘叆綰跨▼鐨勬秷鎭槦鍒? 鍜岄潪闃熷垪娑堟伅(涓嶈繘鍏ョ嚎紼嬬殑娑堟伅闃熷垪)銆傚浜庨槦鍒楁秷鎭紝鏈甯歌鐨勬槸榧犳爣鍜岄敭鐩樿Е鍙戠殑娑堟伅錛屼緥濡俉M_MOUSERMOVE,WM_CHAR絳夋秷鎭紱榪樻湁渚?濡傦細WM_PAINT銆乄M_TIMER鍜學M_QUIT銆傚綋榧犳爣銆侀敭鐩樹簨浠惰瑙﹀彂鍚庯紝鐩稿簲鐨勯紶鏍囨垨閿洏椹卞姩紼嬪簭灝變細鎶婅繖浜涗簨浠惰漿鎹㈡垚鐩稿簲鐨勬秷鎭紝鐒跺悗杈?閫佸埌緋葷粺娑堟伅闃熷垪錛岀敱Windows緋葷粺璐熻矗鎶婃秷鎭姞鍏ュ埌鐩稿簲綰跨▼鐨勬秷鎭槦鍒椾腑錛屼簬鏄氨鏈変簡娑堟伅寰幆(浠庢秷鎭槦鍒椾腑璇誨彇騫舵淳閫佹秷鎭?銆傝繕鏈変竴縐嶆槸闈為槦鍒楁秷 鎭紝浠栫粫榪囩郴緇熼槦鍒楀拰娑堟伅闃熷垪錛岀洿鎺ュ皢娑堟伅鍙戦佸埌紿楀彛榪囩▼銆備緥濡?褰撶敤鎴鋒縺媧諱竴涓獥鍙g郴緇熷彂閫乄M_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR銆傚垱寤虹獥鍙f椂鍙戦乄M_CREATE娑堟伅銆傚湪鍚庨潰浣犲皢鐪嬪埌錛孧S榪欎箞璁捐鏄緢鏈夐亾鐞嗙殑錛屼互鍙婁粬鐨勬暣濂楀疄鐜版満鍒躲?/p>
榪欓噷璁茶堪MFC鐨勬秷鎭驚鐜紝娑堟伅娉點傚厛鐪嬬湅紼嬪簭鍚姩鏃訛紝鎬庝箞榪涘叆娑堟伅寰幆鐨勶細
_tWinMain ->AfxWinMain ->AfxWinInit ->CWinThread::InitApplication ->CWinThread::InitInstance ->CWinThread::Run
闈炲璇濇紼嬪簭鐨勬秷鎭驚鐜殑浜嬫儏閮戒粠榪機WinThread鐨勪竴Run寮濮?..
絎竴閮ㄥ垎錛氶潪瀵硅瘽妗嗙▼搴忕殑娑堟伅寰幆鏈哄埗銆?/strong>
//thrdcore.cpp
// main running routine until thread exits
int CWinThread::Run()
{
ASSERT_VALID(this);
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
// acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do
{
// pump message, but quit on WM_QUIT
if (!PumpMessage())
return ExitInstance();
// reset "no idle" state after pumping "normal" message
if (IsIdleMessage(&m_msgCur))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
} //鏃犻檺寰幆錛岄鍑烘潯浠舵槸鏀跺埌WM_QUIT娑堟伅銆?/font>
ASSERT(FALSE); // not reachable
}
榪欐槸涓涓棤闄愬驚鐜紝浠栫殑閫鍑烘潯浠舵槸鏀跺埌WM_QUIT娑堟伅錛?/p>
if (!PumpMessage())
return ExitInstance();
鍦≒umpMessage涓紝濡傛灉鏀跺埌WM_QUIT娑堟伅錛岄偅涔堣繑鍥濬ALSE,鎵浠xitInstance()鍑芥暟鎵ц錛岃煩鍑哄驚鐜紝榪斿洖紼嬪簭鐨勯鍑轟唬鐮併傛墍浠ワ紝涓涓▼搴忚閫鍑猴紝鍙敤鍦ㄤ唬鐮佷腑璋冪敤鍑芥暟
VOID PostQuitMessage( int nExitCode )銆傛寚瀹氶鍑轟唬鐮乶ExitCode灝卞彲浠ラ鍑虹▼搴忋?/font>
涓嬮潰璁ㄨ涓涓嬭繖涓嚱鏁癛un鐨勬祦紼嬶紝鍒嗕袱姝ワ細
1, 絎竴涓唴寰幆phase1銆俠Idle浠h〃紼嬪簭鏄惁絀洪棽銆備粬鐨勬剰鎬濆氨鏄紝濡傛灉紼嬪簭鏄┖闂插茍涓旀秷鎭槦鍒椾腑娌℃湁瑕佸鐞嗙殑娑堟伅錛岄偅涔堣皟鐢ㄨ櫄鍑芥暟OnIdle榪涜 絀洪棽澶勭悊銆傚湪榪欎釜澶勭悊涓皢鏇存柊UI鐣岄潰(姣斿宸ュ叿鏍忔寜閽殑enable鍜宒isable鐘舵?錛屽垹闄や復鏃跺璞?姣斿鐢‵romHandle寰楀埌鐨勫璞℃寚 閽堛傜敱浜庤繖涓師鍥狅紝鍦ㄥ嚱鏁頒箣闂翠紶閫掔敱FromHandle寰楀埌鐨勫璞℃寚閽堟槸涓嶅畨鍏ㄧ殑錛屽洜涓轟粬娌℃湁鎸佷箙鎬?銆侽nIdle鏄彲浠ラ噸杞界殑錛屼綘鍙互閲嶈澆浠栧茍榪斿洖 TRUE浣挎秷鎭驚鐜戶緇浜庣┖闂茬姸鎬併?/p>
NOTE錛歁S鐢ㄤ復鏃跺璞℃槸鍑轟簬鏁堢巼涓婄殑鑰冭檻錛屼嬌鍐呭瓨 鏈夋晥鍒╃敤錛屽茍鑳藉鍦ㄧ┖闂叉椂鑷姩鎾ら攢璧勬簮銆傚叧浜庣敱鍙ユ焺杞崲鎴愬璞★紝鍙互鏈夎嫢騫茬鏂規硶銆備竴鑸槸鍏堢敵鏄庝竴涓璞bj,鐒跺悗浣跨敤obj.Attatch鏉ュ拰涓涓?鍙ユ焺緇戝畾銆傝繖鏍蜂駭鐢熺殑瀵硅薄鏄案涔呯殑錛屼綘蹇呴』鐢╫bj.Detach鏉ラ噴鏀懼璞°?/font>
2錛岀浜屼釜鍐呭驚鐜痯hase2銆傚湪榪欎釜寰幆鍐呭厛鍚姩娑堟伅娉?PumpMessage),濡傛灉涓嶆槸WM_QUIT娑堟伅錛屾秷鎭車灝嗘秷鎭彂閫佸嚭鍘?::DispatchMessage)銆傛秷鎭殑鐩殑鍦版槸娑堟伅緇撴瀯涓殑hwnd瀛楁鎵瀵瑰簲鐨勭獥鍙c?br>//thrdcore.cpp
BOOL CWinThread::PumpMessage()
{
ASSERT_VALID(this);
//濡傛灉鏄疻M_QUIT灝遍鍑哄嚱鏁?return FALSE)錛岃繖灝嗗鑷寸▼搴忕粨鏉?
if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) {
#ifdef _DEBUG
if (afxTraceFlags & traceAppMsg)
TRACE0("CWinThread::PumpMessage - Received WM_QUIT.\n");
m_nDisablePumpCount++; // application must die
// Note: prevents calling message loop things in 'ExitInstance'
// will never be decremented
#endif
return FALSE;
}
#ifdef _DEBUG
if (m_nDisablePumpCount != 0)
{
TRACE0("Error: CWinThread::PumpMessage called when not permitted.\n");
ASSERT(FALSE);
}
#endif
#ifdef _DEBUG
if (afxTraceFlags & traceAppMsg)
_AfxTraceMsg(_T("PumpMessage"), &m_msgCur);
#endif
// process this message
if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur))
{
::TranslateMessage(&m_msgCur); //閿漿鎹?/font>
::DispatchMessage(&m_msgCur); //媧鵑佹秷鎭?/font>
}
return TRUE;
}
鍦?榪欎竴姝ユ湁涓涓壒鍒噸瑕佺殑鍑芥暟澶у涓瀹氳璇嗭細PreTranslateMessage銆傝繖涓嚱鏁板湪::DispatchMessage鍙戦佹秷鎭埌紿楀彛涔嬪墠錛?榪涜瀵規秷鎭殑棰勫鐞嗐侾reTranslateMessage鍑芥暟鏄疌WinThread鐨勬垚鍛樺嚱鏁幫紝澶у閲嶈澆鐨勬椂鍊欓兘鏄湪View綾繪垨鑰呬富紿楀彛綾諱腑錛岄偅 涔堬紝瀹冩槸鎬庝箞榪涘叆鍒殑綾葷殑鍛紵浠g爜濡備笅錛?br>//thrdcore.cpp
BOOL CWinThread::PreTranslateMessage(MSG* pMsg)
{
ASSERT_VALID(this);
// 濡傛灉鏄嚎紼嬫秷鎭紝閭d箞灝嗕細璋冪敤綰跨▼娑堟伅鐨勫鐞嗗嚱鏁?/font>
if (pMsg->hwnd == NULL && DispatchThreadMessageEx(pMsg))
return TRUE;
// walk from target to main window
CWnd* pMainWnd = AfxGetMainWnd();
if (CWnd::WalkPreTranslateTree(pMainWnd->GetSafeHwnd(), pMsg))
return TRUE;
// in case of modeless dialogs, last chance route through main
// window's accelerator table
if (pMainWnd != NULL)
{
CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd);
if (pWnd->GetTopLevelParent() != pMainWnd)
return pMainWnd->PreTranslateMessage(pMsg);
}
return FALSE; // no special processing
}
鐢變笂闈㈣繖涓嚱鏁板彲浠ョ湅鍑猴細
絎竴錛屽鏋?pMsg->hwnd == NULL),璇存槑榪欐槸涓涓嚎紼嬫秷鎭傝皟鐢–WinThread::DispatchThreadMessageEx鍒版秷鎭槧灝勮〃鎵懼埌娑堟伅鍏ュ彛錛岀劧鍚庤皟鐢ㄦ秷鎭鐞嗗嚱鏁般?/p>
NOTE: 涓鑸敤PostThreadMessage鍑芥暟鍙戦佺嚎紼嬩箣闂寸殑娑堟伅錛屼粬鍜岀獥鍙f秷鎭笉鍚岋紝闇瑕佹寚瀹氱嚎紼媔d,娑堟伅嬋琚郴緇熸斁鍏ュ埌鐩爣綰跨▼鐨勬秷鎭槦鍒椾腑錛涚敤 ON_THREAD_MESSAGE( message, memberFxn )瀹忓彲浠ユ槧灝勭嚎紼嬫秷鎭拰浠栫殑澶勭悊鍑芥暟銆傝繖涓畯蹇呴』鍦ㄥ簲鐢ㄧ▼搴忕被(浠嶤WinThread緇ф壙)涓紝鍥犱負鍙湁搴旂敤紼嬪簭綾繪墠澶勭悊綰跨▼娑堟伅銆傚鏋滀綘鍦ㄥ埆鐨勭被(姣?濡傝鍥劇被)涓敤榪欎釜瀹忥紝綰跨▼娑堟伅鐨勬秷鎭鐞嗗嚱鏁板皢寰椾笉鍒扮嚎紼嬫秷鎭?/font>
絎簩錛屾秷鎭殑鐩爣紿楀彛鐨?PreTranslateMessage鍑芥暟棣栧厛寰楀埌娑堟伅澶勭悊鏉冿紝濡傛灉鍑芥暟榪斿洖FALSE錛岄偅涔堜粬鐨勭埗紿楀彛灝嗗緱鍒版秷鎭殑澶勭悊鏉冿紝鐩村埌涓葷獥鍙o紱濡傛灉鍑芥暟榪斿洖 TRUE(琛ㄧず娑堟伅宸茬粡琚鐞嗕簡)錛岄偅涔堝氨涓嶉渶瑕佽皟鐢ㄧ埗綾葷殑PreTranslateMessage鍑芥暟銆傝繖鏍鳳紝淇濊瘉浜嗘秷鎭殑鐩爣紿楀彛浠ュ強浠栫殑鐖剁獥鍙i兘鍙?浠ユ湁鏈轟細璋冪敤PreTranslateMessage--鍦ㄦ秷鎭彂閫佸埌紿楀彛涔嬪墠榪涜棰勫鐞?濡傛灉鑷繁澶勭悊瀹岀劧鍚庤繑鍥濬ALSE鐨勮瘽 -_-b),濡傛灉浣犳兂瑕佹秷鎭笉浼犻掔粰鐖剁被榪涜澶勭悊鐨勮瘽錛岃繑鍥濼RUE灝辮浜嗐?/p>
絎笁錛屽鏋滄秷鎭殑鐩爣紿楀彛鍜屼富紿楀彛娌℃湁鐖跺瓙鍏崇郴錛岄偅涔堝啀璋冪敤涓?紿楀彛鐨凱reTranslateMessage鍑芥暟銆備負浠涔堣繖鏍鳳紵鐢辯浜屾鐭ラ亾錛屼竴涓獥鍙g殑鐖剁獥鍙d笉鏄富紿楀彛鐨勮瘽錛屽敖綆″畠鐨?PreTranslateMessage榪斿洖FALSE錛屼富紿楀彛涔熸病鏈夋満浼氳皟鐢≒reTranslateMessage鍑芥暟銆傛垜浠煡閬擄紝鍔犻熼敭鐨勮漿鎹竴鑸?鍦ㄦ鏋剁獥鍙g殑PreTranslateMessage鍑芥暟涓傛垜鎵鵑亶浜哅FC涓叧浜庡姞閫熼敭杞崲鐨勫鐞嗭紝鍙湁CFrameWnd, CMDIFrameWnd錛孋MDIChildWnd絳夌獥鍙g被鏈夈傛墍浠ワ紝絎笁姝ョ殑鎰忔濇槸錛屽鏋滄秷鎭殑鐩爣紿楀彛(浠栫殑鐖剁獥鍙d笉鏄富紿楀彛錛屾瘮濡備竴涓繖鏍風殑闈炴ā 寮忓璇濇)浣挎秷鎭殑棰勫鐞嗙戶緇極娓哥殑璇?浠栫殑PreTranslateMessage榪斿洖FALSE)錛岄偅涔堢粰涓嬈℃満浼氱粰涓葷獥鍙h皟鐢?PreTranslateMessage(涓囦竴浠栨槸鏌愪釜鍔犻熼敭娑堟伅鍛紵)錛岃繖鏍瘋兘澶熶繚璇佸湪鏈夐潪妯″紡瀵硅瘽妗嗙殑鎯呭喌涓嬭繕鑳戒繚璇佷富紿楀彛鐨勫姞閫熼敭濂戒嬌銆?br>鎴戝仛浜嗕竴涓皬渚嬪瓙錛屽湪瀵硅瘽妗嗙被鐨凱reTranslateMessage涓紝榪斿洖FALSE銆傚湪涓葷獥鍙f樉紺鴻繖涓潪妯″紡瀵硅瘽妗嗭紝鍦ㄥ璇濇鎷ユ湁鐒︾偣鐨勬椂鍊欙紝浠嶇劧鑳藉嬋媧諱富紿楀彛鐨勫揩鎹烽敭銆?/p>
鎬諱箣錛屾暣涓鏋跺氨鏄姣忎釜娑堟伅鐨勭洰鏍囩獥鍙?鍖呮嫭浠栫殑鐖剁獥鍙?閮芥湁鏈轟細鍙備笌娑堟伅鍒版潵涔嬪墠鐨勫鐞嗐傚懙鍛祣
鑷?姝わ紝闈炲璇濇鐨勬秷鎭驚鐜拰娑堟伅娉電殑鏈哄埗灝卞樊涓嶅浜嗐傝繖涓満鍒跺湪涓涓棤闄愬驚鐜腑錛屼笉鏂湴浠庢秷鎭槦鍒椾腑鑾峰彇娑堟伅錛屽茍涓斾繚璇佷簡紼嬪簭鐨勭嚎紼嬫秷鎭兘澶熷緱鍒版満浼氬鐞嗭紝 紿楀彛娑堟伅鍦ㄩ澶勭悊涔嬪悗琚彂閫佸埌鐩稿簲鐨勭獥鍙e鐞嗚繃紼嬨傞偅涔堬紝榪樻湁涓鐐圭枒闂紝涓轟粈涔堣涓浼氬効璋冪敤::PeekMessage,涓浼氬効璋冪敤:: GetMessage鍛紝浠栦滑鏈変粈涔堝尯鍒紵
NOTE錛氫竴鑸潵璇達紝GetMessage琚璁$敤鏉ラ珮鏁堝湴浠庢秷鎭槦鍒楄幏鍙栨秷鎭傚鏋滈槦鍒椾腑娌℃湁娑堟伅錛岄偅涔堝嚱鏁癎etMessage灝嗗鑷寸嚎紼嬩紤鐪?璁╁嚭CPU鏃墮棿)銆傝孭eekMessage鏄垽鏂秷鎭槦鍒椾腑濡傛灉娌℃湁娑堟伅錛屽畠椹笂榪斿洖0錛屼笉浼氬鑷寸嚎紼嬪浜庣潯鐪犵姸鎬併?/font>
鍦?涓婇潰鐨刾hase1絎竴涓唴寰幆涓敤鍒頒簡PeekMessage錛屽畠鐨勫弬鏁癙M_NOREMOVE琛ㄧず騫朵笉浠庢秷鎭槦鍒椾腑縐昏蛋娑堟伅錛岃屾槸涓涓嫻嬫煡璇紝濡傛灉 娑堟伅闃熷垪涓病鏈夋秷鎭粬绔嬪埢榪斿洖0錛屽鏋滆繖鏃剁嚎紼嬬┖闂茬殑璇濆皢浼氬紩璧鋒秷鎭驚鐜皟鐢∣nIdle澶勭悊榪囩▼(涓婇潰璁插埌浜嗚繖涓嚱鏁扮殑閲嶈鎬?銆傚鏋滃皢:: PeekMessage鏀規垚::GetMessage(***),閭d箞濡傛灉娑堟伅闃熷垪涓病鏈夋秷鎭紝綰跨▼灝嗕紤鐪狅紝鐩村埌綰跨▼涓嬩竴嬈¤幏寰桟PU鏃墮棿騫朵笖鏈夋秷鎭嚭鐜?鎵嶅彲鑳界戶緇墽琛岋紝榪欐牱錛屾秷鎭驚鐜殑絀洪棽鏃墮棿娌℃湁寰楀埌搴旂敤錛孫nIdle涔熷皢寰椾笉鍒版墽琛屻傝繖灝辨槸涓轟粈涔堟棦瑕佺敤::PeekMessage(鏌ヨ),鍙堣 鐢?:GetMessage(鍋氬疄闄呯殑宸ヤ綔)鐨勭紭鏁呫?/p>
絎簩閮ㄥ垎: 瀵硅瘽妗嗙▼搴忕殑娑堟伅寰幆鏈哄埗
鍩轟簬瀵硅瘽妗嗙殑MFC宸ョ▼鍜屼笂闈㈢殑娑堟伅寰幆鏈哄埗涓嶄竴鏍楓傚疄闄呬笂MFC鐨勫璇濇宸ョ▼紼嬪簭灝辨槸妯″紡瀵硅瘽妗嗐備粬鍜屼笂闈㈣鍒扮殑闈炲璇濇紼嬪簭鐨勪笉鍚屼箣澶勶紝涓昏鍦ㄤ簬搴旂敤紼嬪簭瀵硅薄鐨処nitInstance()涓嶄竴鏍楓?/p>
//dlg_5Dlg.cpp
BOOL CDlg_5App::InitInstance()
{
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CDlg_5Dlg dlg; //瀹氫箟涓涓璇濇瀵硅薄
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal(); //瀵硅瘽妗嗙殑娑堟伅寰幆鍦ㄨ繖閲岄潰寮濮?/font>
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
NOTE: InitInstance鍑芥暟榪斿洖FALSE錛岀敱鏈涓婇潰紼嬪簭鍚姩嫻佺▼鍙互鐪嬪嚭錛孋WinThread::Run鏄笉浼氬緱鍒版墽琛岀殑銆備篃灝辨槸璇達紝涓婇潰絎竴閮ㄥ垎 璇寸殑娑堟伅寰幆鍦ㄥ璇濇涓槸涓嶈兘鎵ц鐨勩傚疄闄呬笂錛屽璇濇涔熸湁娑堟伅寰幆錛屽ス鐨勬秷鎭驚鐜湪CDialog::DoModal()铏氬嚱鏁頒腑鐨勪竴涓?RunModalLoop鍑芥暟涓?/font>
榪欎釜鍑芥暟鐨勫疄鐜頒綋鍦–Wnd綾諱腑錛?br>int CWnd::RunModalLoop(DWORD dwFlags)
{
ASSERT(::IsWindow(m_hWnd)); // window must be created
ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
HWND hWndParent = ::GetParent(m_hWnd);
m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);
MSG* pMsg = &AfxGetThread()->m_msgCur;
// acquire and dispatch messages until the modal state is done
for (;;)
{
ASSERT(ContinueModal());
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
{
ASSERT(ContinueModal());
// show the dialog when the message queue goes idle
if (bShowIdle)
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
// call OnIdle while in bIdle state
if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
{
// send WM_ENTERIDLE to the parent
::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
}
if ((dwFlags & MLF_NOKICKIDLE) ||
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
{
// stop idle processing next time
bIdle = FALSE;
}
}
// phase2: pump messages while available
do
{
ASSERT(ContinueModal());
// pump message, but quit on WM_QUIT
//PumpMessage(娑堟伅娉?鐨勫疄鐜板拰涓婇潰璁茬殑宸笉澶氥傞兘鏄淳閫佹秷鎭埌紿楀彛銆?/font>
if (!AfxGetThread()->PumpMessage())
{
AfxPostQuitMessage(0);
return -1;
}
// show the window when certain special messages rec'd
if (bShowIdle &&
(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
}
if (!ContinueModal())
goto ExitModal;
// reset "no idle" state after pumping "normal" message
if (AfxGetThread()->IsIdleMessage(pMsg))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));
} //鏃犻檺寰幆
ExitModal:
m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
return m_nModalResult;
}
鍏堣璇存庝箞閫鍑鴻繖涓棤闄愬驚鐜紝鍦ㄤ唬鐮佷腑錛?br>if (!ContinueModal())
goto ExitModal;
鍐沖畾鏄惁閫鍑哄驚鐜紝娑堟伅寰幆鍑芥暟榪斿洖涔熷氨鏄揩瑕佺粨鏉熺粨鏉熺▼搴忎簡銆?br>BOOL CWnd::ContinueModal()
{
return m_nFlags & WF_CONTINUEMODAL;
}
NOTE: CWnd::ContinueModal()鍑芥暟媯鏌ュ璇濇鏄惁緇х畫妯″紡銆傝繑鍥濼RUE,琛ㄧず鐜板湪鏄ā寮忕殑錛涜繑鍥濬ALSE錛岃〃紺哄璇濇宸茬粡涓嶆槸妯″紡(灝嗚緇撴潫)銆?/font>
濡?鏋滆緇撴潫瀵硅瘽妗嗭紝鍦ㄥ唴閮ㄦ渶緇堜細璋冪敤鍑芥暟CWnd::EndModalLoop錛屽畠鍙栨秷m_nFlags鐨勬ā寮忔爣蹇?娑堟伅寰幆涓殑 ContinueModal鍑芥暟灝嗚繑鍥濬ALSE錛屾秷鎭驚鐜皢緇撴潫錛岀▼搴忓皢閫鍑?錛涚劧鍚庢縺鍙戞秷鎭驚鐜鍙栨秷鎭備篃灝辨槸璇達紝緇撴潫妯″紡瀵硅瘽妗嗘槸涓涓爣蹇楋紝鏀瑰彉 榪欎釜鏍囧織灝卞彲浠ヤ簡銆備粬鐨勪唬鐮佹槸錛?/p>
//wincore.cpp
void CWnd::EndModalLoop(int nResult)
{
ASSERT(::IsWindow(m_hWnd));
// this result will be returned from CWnd::RunModalLoop
m_nModalResult = nResult;
// make sure a message goes through to exit the modal loop
if (m_nFlags & WF_CONTINUEMODAL)
{
m_nFlags &= ~WF_CONTINUEMODAL;
PostMessage(WM_NULL);
}
}
NOTE: PostMessage(NULL)鏄湁鐢ㄧ殑銆傚鏋滄秷鎭槦鍒椾腑娌℃湁娑堟伅鐨勮瘽錛屽彲鑳芥秷鎭驚鐜腑鐨凜ontinueModal()涓嶄細椹笂鎵ц錛屽彂閫佷竴涓┖娑堟伅鏄縺鍙戞秷鎭驚鐜┈涓婂伐浣溿?/font>
涓嬮潰璇翠竴涓婥Wnd::RunModalLoop鍑芥暟涓殑娑堟伅寰幆絀剁珶騫蹭簡浜涗粈涔堜簨鎯?
1, 絎竴涓唴寰幆銆傞鍏堜粠娑堟伅闃熷垪涓煡璇㈡秷鎭紝濡傛灉瀵硅瘽妗嗙┖闂詫紝鑰屼笖娑堟伅闃熷垪涓病鏈夋秷鎭紝浠栧仛涓変歡浜嬫儏錛屽ぇ瀹跺簲鍒伴兘鑳戒粠瀛楅潰涓婃槑鐧戒粈涔堟剰鎬濄傛渶閲嶈鐨勬槸鍙戦?WM_KICKIDLE娑堟伅銆備負浠涔堝憿錛熺涓閮ㄥ垎璁插埌浜嗭紝闈炲璇濇紼嬪簭鐢∣nIdle鏉ユ洿鏂扮敤鎴風晫闈?UI)錛屾瘮濡傚伐鍏鋒爮錛岀姸鎬佹爮銆傞偅涔堬紝濡傛灉瀵硅瘽妗嗕腑涔?鏈夊伐鍏鋒爮鍜岀姸鎬佹爮鍛紝鍦ㄥ摢閲屾洿鏂?緗戜笂鏈夊緢澶氳繖鏍風殑紼嬪簭)錛熷彲浠ュ鐞哤M_KICKIDLE娑堟伅錛?br>
LRESULT CDlg_5Dlg::OnKickIdle(WPARAM w,LPARAM l)
{
//璋冪敤CWnd::UpdateDialogControls鏇存柊鐢ㄦ埛鐣岄潰
UpdateDialogControls(this, TRUE);
return 0;
}
NOTE: CWnd::UpdateDialog鍑芥暟鍙戦丆N_UPDATE_COMMAND_UI娑堟伅緇欐墍鏈夌殑鐢ㄦ埛鐣岄潰瀵硅瘽妗嗘帶浠躲?/font>
2, 絎簩涓唴寰幆銆傛渶閲嶈鐨勮繕鏄疨umpMessage媧鵑佹秷鎭埌鐩爣紿楀彛銆傚叾浠栫殑錛屽儚絎簩涓猧f璇彞錛?x118娑堟伅濂藉儚鏄疻M_SYSTIMER娑堟伅(緋?緇熺敤鏉ラ氱煡鍏夋爣璺沖姩鐨勪竴涓秷鎭?銆備篃灝辨槸璇達紝濡傛灉娑堟伅涓篧M_SYSTIMER鎴栬匴M_SYSKEYDOWN,騫朵笖絀洪棽鏄劇ず鏍囧織涓虹湡鐨勮瘽錛屽氨鏄劇ず紿楀彛騫?閫氱煡紿楀彛绔嬪埢閲嶇粯銆?/p>
鎬諱箣錛屽璇濇鐨勬秷鎭驚鐜満鍒跺拰闈炲璇濇(姣斿SDI,MDI)榪樻槸綾諱技 鐨勶紝浠呬粎渚ч噸鐐逛笉鍚屻傛ā寮忓璇濇鏄ā寮忔樉紺猴紝鑷劧鏈変粬鐨勭壒鐐廣備笅闈㈤儴鍒嗚璁轟竴涓嬫ā寮忓璇濇鍜岄潪妯″紡瀵硅瘽妗嗙殑鍖哄埆銆傚洜涓烘ā寮忓璇濇鏈夎嚜宸辯殑鐗規畩娑堟伅寰幆錛涜?闈炴ā寮忓璇濇錛屽叡鐢ㄧ▼搴忕殑娑堟伅寰幆錛屽拰鏅氱殑紿楀彛宸茬粡娌℃湁浠涔堝ぇ鐨勫尯鍒簡銆?/font>
絎笁閮ㄥ垎錛氭ā寮忓璇濇鍜岄潪妯″紡瀵硅瘽妗嗙殑鍖哄埆
榪欎釜璇濋宸茬粡鏈夊緢澶氫漢璁ㄨ錛屾垜璇磋鎴戞墍鐞嗚В鐨勬剰鎬濄?br>鍦∕FC 妗嗘灦涓紝涓涓璇濇瀵硅薄DoModal涓涓嬪氨鑳戒駭鐢熶竴涓ā寮忓璇濇錛孋reate涓涓嬪氨鑳戒駭鐢熶竴涓潪妯″紡瀵硅瘽妗嗐傚疄闄呬笂錛屾棤璁烘槸妯″紡瀵硅瘽妗嗚繕鏄潪妯″紡瀵硅瘽 妗嗭紝鍦∕FC鍐呴儴閮芥槸璋冪敤::CreateDialogIndirect(***)鍑芥暟鏉ュ垱寤洪潪妯″紡瀵硅瘽妗嗐傚彧鏄ā寮忓璇濇浣滀簡鏇村鐨勫伐浣滐紝鍖呮嫭浣跨埗紿楀彛 鏃犳晥錛岀劧鍚庤繘鍏ヨ嚜宸辯殑娑堟伅寰幆絳夌瓑銆?:CreateDialogIndirect(***)鍑芥暟鏈緇堣皟鐢–reateWindowEx鍑芥暟閫氱煡緋葷粺鍒涘緩 紿椾綋騫惰繑鍥炲彞鏌勶紝浠栧唴閮ㄦ病鏈夊疄鐜拌嚜宸辯殑娑堟伅寰幆銆?br>闈炴ā寮忓璇濇鍒涘緩涔嬪悗绔嬪嵆榪斿洖錛屽茍涓斿拰涓葷▼搴忓叡鐢ㄤ竴涓秷鎭驚鐜傞潪妯″紡瀵硅瘽妗嗚絳夊璇濇緇撴潫涔嬪悗鎵嶈繑鍥烇紝鑷繁鏈夋秷鎭驚鐜傛瘮濡備笅闈㈢殑浠g爜錛?br>CMyDlg* pdlg = new CMyDlg;
pdlg ->Create(IDD_DIALOG1);
pdlg->ShowWindow(SW_SHOW);
MessageBox("abc");
闈炴ā寮忓璇濇鍜屾秷鎭MessageBox鍑犱箮鏄悓鏃跺脊鍑烘潵銆傝屽鏋滃皢Create鏀規垚DoModal錛岄偅涔堬紝鍙兘寮瑰嚭妯″紡瀵硅瘽妗嗭紝鍦ㄥ叧闂簡瀵硅瘽妗嗕箣鍚?妯″紡瀵硅瘽妗嗚嚜宸辯殑娑堟伅寰幆緇撴潫)錛屾秷鎭鎵嶅脊鍑烘潵銆?/p>
NOTE錛?鍙互鍦ㄦā寮忓璇濇涓皟鐢℅etParent()->EnableWindow(true);榪欐牱錛屼富紿楀彛鐨勮彍鍗曪紝宸ュ叿鏍忓張嬋媧諱簡錛岃兘鐢ㄤ簡銆侻FC浣?鐢ㄩ潪妯″紡瀵硅瘽妗嗘潵妯℃嫙妯″紡瀵硅瘽妗嗭紝鑰屽湪win32 SDK紼嬪簭涓紝妯″紡瀵硅瘽妗嗘縺鍙戜粬鐨勭埗紿楀彛Enable鎿嶄綔鏄病鏈夋晥鏋滅殑銆?/font>
鍏充簬娑堟伅寰幆鎬葷粨錛?/strong>
1錛?鎴戜滑绔欏湪涓涓粈涔堥珮搴︾湅娑堟伅寰幆錛熸秷鎭驚鐜叾瀹炴病鏈変粈涔堟繁濂ョ殑閬撶悊銆傚鏋滀竴涓偖閫掑憳瑕佷笉鏂湪涓涓煄甯備腑閫佷俊錛屾垜浠姹備粬鍋氫粈涔堬紵瑕佹眰浠栨潵鍥炶窇錛屼絾浠栦竴嬈″彧 鑳藉湪涓涓湴鏂瑰嚭鐜般傚鏋滄垜浠殑搴旂敤紼嬪簭鍙湁涓涓嚎紼嬬殑璇濓紝鎴戜滑瑕佷粬涓嶆柇鍦頒負紿楀彛浼犻掓秷鎭紝鎴戜滑鎬庝箞鍋氾紵鍦ㄤ竴涓驚鐜腑涓嶆柇鐨勬嫻嬫秷鎭紝騫跺皢浠栧彂閫佸埌閫傚綋鐨勭獥 鍙c傜獥鍙e彲浠ユ湁寰堝涓紝浣嗘秷鎭驚鐜彧鏈変竴涓紝鑰屼笖姣忔椂姣忓埢鏈澶氬彧鏈変竴涓湴鏂瑰湪鎵ц浠g爜銆備負浠涔堬紵 鐪嬬浜岀偣銆?/p>
2錛屽洜涓烘槸鍗曠嚎紼嬬殑(紼嬪簭榪涚▼ 鍚姩鐨勬椂鍊欙紝鍙湁鑰屼笖鏈変竴涓嚎紼嬶紝鎴戜滑縐頒粬涓轟富綰跨▼),鎵浠ュ氨鍍忛偖閫掑憳涓鏍鳳紝姣忔鍙兘鍦ㄦ煇涓涓湴鏂瑰共媧匯備粈涔堟剰鎬濆憿錛熶婦涓緥瀛愶紝鐢?: DiapatchMessage媧鵑佹秷鎭紝鍦ㄧ獥鍙e鐞嗚繃紼?WinProc,紿楀彛鍑芥暟)榪斿洖涔嬪墠錛屼粬鏄樆濉炵殑,涓嶄細绔嬪嵆榪斿洖錛屼篃灝辨槸娑堟伅寰幆姝ゆ椂涓嶈兘鍐嶄粠 娑堟伅闃熷垪涓鍙栨秷鎭紝鐩村埌::DispatchMessage榪斿洖銆傚鏋滀綘鍦ㄧ獥鍙e嚱鏁頒腑鎵ц涓涓寰幆鎿嶄綔錛屽氨綆椾綘鐢≒ostQuitMessage鍑芥暟 閫鍑猴紝紼嬪簭涔熶細down鎺夈?br>while(1)
{
PostQuitMessage(0); //紼嬪簭鐓ф牱down.
}
鎵 浠ワ紝褰撶獥鍙e嚱鏁板鐞嗘病鏈夎繑鍥炵殑鏃跺欙紝娑堟伅寰幆鏄笉浼氫粠娑堟伅闃熷垪涓鍙栨秷鎭殑銆傝繖涔熸槸涓轟粈涔堝湪妯″紡瀵硅瘽妗嗕腑瑕佽嚜宸辯敤鏃犻檺寰幆鏉ョ戶緇秷鎭驚鐜紝鍥犱負榪欎釜鏃犻檺寰?鐜樆濉炰簡鍘熸潵鐨勬秷鎭驚鐜紝鎵浠ワ紝鍦ㄨ繖涓棤闄愬驚鐜腑瑕佺敤GetMessage,PeekMessage,DispatchMessage鏉ヤ粠娑堟伅闃熷垪涓鍙?娑堟伅騫舵淳閫佹秷鎭簡銆傝涓嶇劧紼嬪簭灝變笉浼氬搷搴斾簡錛岃繖涓嶆槸鎴戜滑鎵甯屾湜鐨勩?br>鎵浠ヨ錛屾秷鎭驚鐜斁鍦ㄧ▼搴忕殑浠涔堢殑鍦版柟閮藉熀鏈笂鏄繃鐨勫幓鐨勶紝姣斿鏀懼湪DLL閲?闈€備絾鏄紝鏈濂藉湪浠諱綍鏃跺欙紝鍙湁涓涓秷鎭驚鐜湪宸ヤ綔(鍏朵粬鐨勯兘琚樆濉炰簡)銆傜劧鍚庯紝鎴戜滑瑕佷綔濂界殑涓浠朵簨鎯咃紝灝辨槸鎬庝箞浠庢秷鎭驚鐜腑閫鍑猴紒褰撶劧鐢╓M_QUIT 鏄彲浠ユ媺~(PostThreadMessage涔熸槸涓ソ涓繪剰)錛岃繖涓秷鎭驚鐜鍑哄悗錛屽彲鑳界▼搴忛鍑猴紝涔熷彲鑳戒細嬋媧誨彟澶栦竴涓闃誨鐨勬秷鎭驚鐜紝紼嬪簭緇х畫榪?琛屻傝繖瑕佺湅浣犳庝箞鎯籌紝鎬庝箞鍘誨仛銆傛渶鍚庝竴涓秷鎭驚鐜粨鏉熺殑鏃跺欙紝涔熻灝辨槸紼嬪簭蹇粨鏉熺殑鏃跺欙紝鍥犱負涓葷嚎紼嬬殑鎵ц浠g爜涔熷揩瑕佸畬浜?闄ら潪BT鐨勫啀浣滀釜姝誨驚鐜?銆?/p>
NOTE: 璁﹚indows緋葷粺鐭ラ亾鍒涘緩涓涓嚎紼嬬殑鍞竴鏂規硶鏄皟鐢ˋPI CreatThread鍑芥暟(__beginthreadex涔嬬被鐨勯兘瑕佸湪鍐呴儴璋冪敤浠栧垱寤烘柊綰跨▼)銆傚ソ鍍弚indows鏍稿績緙栫▼璇達紝鍦╳in2000涓嬶紝 緋葷粺鐢–reateRemoteThread鍑芥暟鏉ュ垱寤虹嚎紼嬶紝CreateThread鍦ㄥ唴閮ㄨ皟鐢–reateRemoteThread銆備笉榪囪繖涓嶆槸浜夎 鐨勭劍鐐癸紝鑷沖皯win98涓婥reateRemoteThread騫朵笉鑳芥甯稿伐浣滐紝榪樻槸CreateThread涓繪寔澶у眬銆?/font>
3錛屽湪鏁翠釜娑堟伅寰幆鐨勬満鍒朵腑錛岃繕蹇呴』璋堝埌紿楀彛鍑芥暟鐨勫彲閲嶅叆鎬с備粈涔堟剰鎬濓紵灝辨槸紿楀彛鍑芥暟(浠栨槸涓洖璋冨嚱鏁?鐨勪唬鐮佷粈涔堟椂鍊欓兘鍙互琚郴緇?璋冪敤鑰呬竴鑸槸user32妯″潡)璋冪敤銆傛瘮濡傚湪紿楀彛榪囩▼涓紝鍚戣嚜宸辯殑紿楀彛SendMessage(***);閭d箞鎵ц榪囩▼鏄庢牱鐨勶紵
鎴戜滑鐭ラ亾錛孲endMessage鏄絳夊埌娑堟伅鍙戦佸茍琚洰鏍囩獥鍙f墽琛屽畬涔嬪悗鎵嶈繑鍥炵殑銆傞偅涔堢獥鍙e湪澶勭悊娑堟伅錛岀劧鍚庡張絳夊緟鍒氭墠鍙戦佸埌鏈獥鍙g殑娑堟伅琚鐞嗗悗涔嬪悗(SendMessage榪斿洖)鎵嶇戶緇線涓嬫墽琛岋紝紼嬪簭涓嶅氨浜掔浉姝婚攣浜嗗悧錛?
鍏?瀹炴槸涓嶄細鐨勩倃indows璁捐涓濂楅傚悎SendMessage鐨勭畻娉曪紝浠栧垽鏂鏋滃彂閫佺殑娑堟伅鏄睘浜庢湰綰跨▼鍒涘緩鐨勭獥鍙g殑錛岄偅涔堢洿鎺ョ敱user32妯″潡璋冪敤 紿楀彛鍑芥暟(鍙兘灝辨湁紿楀彛閲嶅叆)錛屽茍灝嗘秷鎭殑澶勭悊緇撴灉緇撴灉榪斿洖銆傝繖鏍峰仛浣撶幇浜嗙獥鍙i噸鍏ャ備笂闈㈢殑渚嬪瓙錛屾垜浠皟鐢⊿endMessage(***)鍙戦佹秷鎭埌鏈?紿楀彛錛岄偅涔堢獥鍙h繃紼嬪啀嬈¤璋冪敤錛屽鐞嗗畬娑堟伅涔嬪悗灝嗙粨鏋滆繑鍥烇紝鐒跺悗SendMessage涔嬪悗鐨勭▼搴忔帴鐫鎵ц銆傚浜庨潪闃熷垪娑堟伅錛屽鏋滄病鏈夌獥鍙i噸鍏ワ紝涓嶇煡閬撲細 鏄粈涔堟牱瀛愩?/p>
NOTE: 鐢變簬紿楀彛鐨勫彲閲嶅叆鎬с傚湪win32 SDK紼嬪簭涓簲灝介噺灝戠敤鍏ㄥ眬鍙橀噺鍜岄潤鎬佸彉閲忥紝鍥犱負鍦ㄧ獥鍙e嚱鏁版墽琛岃繃紼嬩腑鍙兘紿楀彛閲嶅叆錛屽鏋滈噸鍏ュ悗灝嗚繖浜涘彉閲忔敼浜嗭紝浣嗕綘鐨勭▼搴忓湪紿楀彛閲嶅叆榪斿洖涔嬪悗緇х畫鎵ц錛?鍙兘灝辨槸浣跨敤宸茬粡鏀瑰彉鐨勫叏灞鎴栭潤鎬佸彉閲忋傚湪MFC涓?鎵鏈夌獥鍙g殑紿楀彛鍑芥暟鍩烘湰涓婇兘鏄疉fxWndProc)錛屾寜鐓х被鐨勬濇兂榪涜浜嗙粍緇囷紝涓鑸彉閲忛兘鏄被涓?鐨勶紝濂界鐞嗙殑澶氥?/font>
4,MFC涓獥鍙g被(姣斿C**View,CFrameWnd絳?涓殑MessageBox鍑芥暟錛屼互鍙?AfxMessageBox鍑芥暟閮芥槸闃誨鍘熸湁鐨勬秷鎭驚鐜殑銆傜敱娑堟伅妗嗗唴閮ㄧ殑涓涓秷鎭驚鐜潵浠庢秷鎭槦鍒椾腑璇誨彇娑堟伅錛屽茍媧鵑佹秷鎭?鍜屾ā寮忓璇濇綾諱技)銆傚疄闄?涓婏紝榪欎簺娑堟伅鍑芥暟鏈緇堣皟鐢ㄧ殑鏄?:MessageBox錛屽畠鍦ㄦ秷鎭鍐呴儴瀹炵幇浜嗕竴涓秷鎭驚鐜?鍘熸湁鐨勪富紼嬪簭娑堟伅寰幆琚樆濉炰簡)銆傝鍧涗腑紕板埌榪囧嚑嬈″叧浜庤鏃?鍣ㄥ拰娑堟伅妗嗙殑闂錛岀湅涓嬮潰鐨勪唬鐮侊細
void CTest_recalclayoutView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
MessageBox("abc");
while(1); //璁捐涓涓寰幆
CView::OnTimer(nIDEvent);
}
鍜?璁㎡nTimer澶х害5縐掗挓寮瑰嚭涓涓秷鎭銆傞偅涔堬紝娑堟伅妗嗕笉鏂殑琚脊鍑烘潵錛屽彧瑕佹秷鎭涓嶈鍏抽棴錛岄偅涔堢▼搴忓氨涓嶄細榪涘叆姝誨驚鐜傚疄闄呬笂錛屾瘡嬈″脊鍑哄璇濇錛岄兘鏄?鏈涓婂眰鐨勯偅涓秷鎭鎺屾彙鐫娑堟伅寰幆錛屽叾浠栫殑娑堟伅寰幆琚樆濉炰簡銆傚彧瑕佷笉鍏抽棴鏈涓婇潰鐨勬秷鎭錛寃hile(1);灝卞緱涓嶅埌鎵ц銆傚鏋滅偣浜嗗叧闂紝紼嬪簭灝辮繘鍏ヤ簡姝?寰幆錛屽彧鑳界敤ctrl+alt+del鏉ヨВ鍐抽棶棰樹簡銆?/p>
5錛屾秷鎭驚鐜湪寰堝鍦版柟閮芥湁搴旂敤銆傛瘮濡傚簲鐢ㄥ湪綰跨▼姹犱腑銆備竴涓嚎紼嬬殑鎵ц鍛ㄦ湡涓鑸湪綰跨▼ 鍑芥暟榪斿洖涔嬪悗緇撴潫錛岄偅涔堟庝箞寤墮暱綰跨▼鐨勭敓鍛藉懆鏈熷憿錛熶竴縐嶆柟娉曞氨鏄寜鐓ф秷鎭驚鐜殑鎬濇兂錛屽湪綰跨▼涓姞鍏ユ秷鎭驚鐜紝涓嶆柇鍦頒粠綰跨▼闃熷垪璇誨彇娑堟伅錛屽茍澶勭悊娑堟伅錛岀嚎紼?鐨勭敓鍛藉懆鏈熷氨淇濇寔鐫鐩村埌榪欎釜娑堟伅寰幆鐨勯鍑恒?/p>
NOTE錛氬彧瑕佺嚎紼嬫湁鐣岄潰鍏冪礌鎴栬呰皟鐢℅etMessage,鎴栬呮湁綰跨▼娑堟伅鍙戦佽繃鏉ワ紝緋葷粺灝變細涓虹嚎紼嬪垱寤轟竴涓秷鎭槦鍒椼?/font>
6, 鍦ㄥ崟綰跨▼紼嬪簭涓紝濡傛灉瑕佹墽琛屼竴涓暱鏃墮棿鐨勫鏉傛搷浣滆屼笖鐣岄潰瑕佹湁鐩稿簲鐨勮瘽錛屽彲浠ヨ冭檻鐢ㄨ嚜宸辯殑娑堟伅娉點傛瘮濡傦紝鍙互灝嗕竴涓樆濉炵瓑寰呮搷浣滄斁鍦ㄤ竴涓驚鐜腑錛屽茍灝嗚秴鏃?鍊艱緗緱姣旇緝灝忥紝鐒跺悗姣忎釜絳夊緟鐨勭墖孌典腑鐢ㄦ秷鎭車緇х畫娑堟伅寰幆錛屼嬌鐣岄潰鑳藉鍝嶅簲鐢ㄦ埛鎿嶄綔銆傜瓑絳変箣綾伙紝閮藉彲浠ュ簲鐢ㄦ秷鎭車(璋冪敤涓涓被浼艱繖鏍風殑鍑芥暟)錛?br>BOOL CChildView::PeekAndPump()
{
MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return false;
}
}
return true;
}
鍏跺疄錛岀敤澶氱嚎紼嬩篃鑳借В鍐沖鏉傝繍綆楁椂鐨勭晫闈㈤棶棰橈紝浣嗘槸娌℃湁榪欎箞鏂逛究錛岃屼笖涓鑸鍔犲叆綰跨▼閫氫俊鍜屽悓姝ワ紝鑰冭檻鐨勪簨鎯呮洿澶氫竴鐐廣?/p>
緇間笂鎵榪幫紝MFC娑堟伅寰幆灝遍偅涔堝洖浜嬶紝涓昏鎬濇兂榪樻槸鍜孲DK涓樊涓嶅銆傝繖縐嶆濇兂涓昏鐨勭壒鐐硅〃鐜板湪榪庡悎MFC鏁翠釜妗嗘灦涓婏紝涓烘暣涓鏋舵湇鍔★紝涓哄簲鐢ㄥ拰鍔熻兘鏈嶅姟銆傝繖鏄垜鐨勭悊瑙c傚懙鍛祣
#define ID_MENU_EDIT 5001
#define ID_MENU_DELETE 50021,鍦ㄥご鏂囦歡涓坊鍔犲嚱鏁板畾涔夎鍙ワ細
// Generated message map functions
//{{AFX_MSG(CAdo2Dlg)
virtual BOOL OnInitDialog();
afx_msg void onInfoEdit(); // 榪欎釜鏄紪杈戣彍鍗曠殑鍝嶅簲鍑芥暟
afx_msg void onInfoDelete(); //榪欎釜鏄垹闄よ彍鍗曠殑鍝嶅簲鍑芥暟
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnButton2();
afx_msg void OnRdblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2錛屽湪cpp鏂囦歡涓坊鍔犲嚱鏁頒綋錛?br>
void CAdo2Dlg::OnInfoEdit()
{
AfxMessageBox("edit");
}
void CAdo2Dlg::OnInfoDelete()
{
AfxMessageBox("delete");
}
3錛岀劧鍚庡湪cpp鏂囦歡涓坊鍔犲獎灝勶細
BEGIN_MESSAGE_MAP(CAdo2Dlg, CDialog)
//{{AFX_MSG_MAP(CAdo2Dlg)
ON_COMMAND(ID_MENU_EDIT, OnInfoEdit)
ON_COMMAND(ID_MENU_DELETE, OnInfoDelete)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
鎵鏈夌殑宸ヤ綔瀹屾垚浜嗭紒
5錛岀紪璇戯紝鐢熸垚dll
浣跨敤錛?br>1錛屾柊寤轟竴涓崟鏂囨。搴旂敤紼嬪簭錛屽悕涓篣sedll5
2,灝嗗垰鎵嶇敓鎴愮殑dll5.lib鏂囦歡鍜宒ll5.h鏂囦歡鎷瘋礉鍒板綋鍓嶅簲鐢ㄧ▼搴忚礬寰勪笅,
灝哾ll5.dll 鏂囦歡鎷瘋礉鍒?褰撳墠搴旂敤紼嬪簭涓嬬殑debug涓?br>3錛屽湪褰撳墠搴旂敤紼嬪簭涓敤鍒拌dll5鐨勫鍑烘柟娉曪紙concatA)鐨勬枃浠訛紙鎴栫被錛変笂娣誨姞濡備笅璇彞錛?br>#include "dll5.h"
鍋囪灝嗗叾鍔犲埌 Usedll5View.cpp涓?br>4錛屽湪Usedll5View綾諱腑寤虹珛娑堟伅鏄犲皠鍏ュ彛錛屽湪娑堟伅鍑芥暟涓坊鍔犲涓嬭鍙ワ細
CString a=concatA("涓浗鍖楄濺闆嗗洟","闀挎槬杞ㄩ亾瀹㈣濺鑲′喚鏈夐檺鍏徃");
MessageBox(a);
5錛屽湪 宸ョ▼/璁劇疆/榪炴帴/瀵硅薄搴?妯″潡 涓姞鍏ワ細dll5.lib
6,緙栬瘧鎵ц璇ュ簲鐢ㄧ▼搴忥紝騫惰Е鍙戣娑堟伅錛屽垯杈撳嚭錛?/p>
涓浗鍖楄濺闆嗗洟闀挎槬杞ㄩ亾瀹㈣濺鑲′喚鏈夐檺鍏徃
涔嬪悗鍙瀹氫箟涓嶆洿鏀癸紝鍑芥暟浣撴棤璁烘庝箞鏇存敼銆傛垜浠彧瑕佸皢緙栬瘧濂界殑dll鎷瘋礉榪囨潵鍗沖彲銆傚鏋滃畾涔夋湁浜嗕慨鏀癸紝鍒欓渶瑕佸皢h鏂囦歡鍜宭ib 鏂囦歡鎷瘋礉榪囨潵錛屽茍闇瑕侀噸鏂扮紪璇戙?/p>
浜岋紝鍔ㄦ侀摼鎺ュ簱浣跨敤鍏變韓MFC DLL
鍒涘緩錛?br>1錛屾柊寤轟竴涓?DLL(閫?鍔ㄦ侀摼鎺ュ簱浣跨敤鍏變韓MFC DLL錛?
2錛屽ご鏂囦歡涓姞鍏ワ細
_declspec(dllexport) CString WINAPI concatA(CString x,CString y);
3錛屽湪cpp鏂囦歡鏈熬鍔犲叆錛?br>_declspec(dllexport) CString WINAPI concatA(CString x,CString y)
{
return x + y;
}
4錛岀紪璇戯紝鐢熸垚dll
浣跨敤錛?br>1錛屾柊寤轟竴涓崟鏂囨。搴旂敤紼嬪簭錛屽悕涓篣sedll8
2,灝嗗垰鎵嶇敓鎴愮殑dll8.lib鏂囦歡鎷瘋礉鍒板綋鍓嶅簲鐢ㄧ▼搴忚礬寰勪笅,
灝哾ll8.dll 鏂囦歡鎷瘋礉鍒?c:\winnt\system32涓?br>3錛屽湪褰撳墠搴旂敤紼嬪簭涓敤鍒拌dll5鐨勫鍑烘柟娉曪紙concatA)鐨?綾葷殑澶存枃浠朵笂娣誨姞濡備笅璇彞錛?br>extern CString WINAPI concatA(CString x,CString y);
鍋囪灝嗗叾鍔犲埌 Usedll8View.h涓?br>4錛屽湪Usedll8View綾諱腑寤虹珛娑堟伅鏄犲皠鍏ュ彛錛屽湪娑堟伅鍑芥暟涓坊鍔犲涓嬭鍙ワ細
CString a=concatA("涓浗鍖楄濺闆嗗洟","闀挎槬杞ㄩ亾瀹㈣濺鑲′喚鏈夐檺鍏徃");
MessageBox(a);
5錛屽湪 宸ョ▼/璁劇疆/榪炴帴/瀵硅薄搴?妯″潡 涓姞鍏ワ細dll8.lib
6,緙栬瘧鎵ц璇ュ簲鐢ㄧ▼搴忥紝騫惰Е鍙戣娑堟伅錛屽垯杈撳嚭錛?/p>
涓浗鍖楄濺闆嗗洟闀挎槬杞ㄩ亾瀹㈣濺鑲′喚鏈夐檺鍏徃
UpdateData錛堬級鍙湁涓涓狟OOL綾誨瀷鐨勫弬鏁幫紝UpdateData(FALSE)涓鑸敤浜庡璇濇鎺т歡榪炴帴鐨勫彉閲忓煎埛鏂板睆騫曟樉紺猴紱姣斿浣犲湪涓涓枃鏈涓婄粦瀹氫簡涓涓猰_member鍙橀噺錛岀敤UpdateData(FALSE);鍗沖彲鎶婅繖涓煎湪鏂囨湰妗嗛噷鏄劇ず鍑烘潵錛屽弽涔嬶紝UpdateData(TRUE);鑳芥妸濉叆鏂囨湰妗嗙殑 鍐呭璧嬪肩粰m_member.
CRect BoxRect;
BoxRect=rect;
BoxRect.right =BoxRect.left +15;
dc.DrawFrameControl(BoxRect,DFC_BUTTON,DFCS_BUTTONCHECK|GetCheck()?DFCS_CHECKED :0);
CFont myFont;
myFont.CreatePointFont (120,_T("瀹嬩綋"));
CFont *pOldFont=(CFont *)dc.SelectObject (&myFont);
dc.SetBkMode(TRANSPARENT);
CString StrWndText;
GetWindowText(StrWndText);
rect.OffsetRect (20,0);
dc.DrawText(StrWndText, rect, DT_LEFT|DT_VCENTER|DT_SINGLELINE);
dc.SelectObject (pOldFont);
myFont.DeleteObject ();
// Do not call CButton::OnPaint() for painting messages
}