锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://www.codediscuss.com
]]>
涓嬮潰鐨勪唬鐮侊紝褰撶敤AfxBeginThread寮濮嬩竴涓嚎紼嬫椂錛屽疄闄呬笂鏄湁鍐呭瓨娉勬紡鐨?/p>
| Q : | MFC榪斿洖鐨勪復鏃跺璞℃寚閽堟垚鍥? | ||
| 涓昏瑙g瓟鑰? | QunKangLi | 鎻愪氦浜? | QunKangLi |
| 鎰熻阿: | oldforest銆亂u_hl銆丵unKangLi | ||
| 瀹℃牳鑰? | happyparrot | 紺懼尯瀵瑰簲璐村瓙: | 鏌ョ湅 |
| 聽聽聽聽 A : | |||
|
msdn鍦ㄤ粙緇岹etDlgItem鐨勬椂鍊欙紝鏄庣‘鎸囧嚭錛?聽 The 聽returned 聽pointer 聽may 聽be 聽temporary 聽and 聽should 聽not 聽be 聽stored 聽for 聽later 聽use. 聽 濡傛灉鐪熸槸榪欐牱閭f垜涓嶆儴浜嗭紒鍦ㄦ垜鐨勪竴涓蔣浠朵腑錛屽洜涓哄父甯歌浣垮垏鎹㈡寜閽殑鍙敤涓庝笉鍙敤浠ュ強鏀瑰彉鎸夐挳鏂囧瓧錛屾墍浠ユ垜鐢―etDlgItem鎶婂畠浠瓨浜嗚搗鏉ワ紝鐢ㄧ殑鏃跺欑洿鎺ュ埌鏁扮粍閲岄潰鍙栵紝榪欐牱鐨勮瘽榪欎釜杞歡涓嶆槸鐘簡涓涓噸澶х殑閿欒浜嗭紵鍙槸鐢ㄨ繖涔堜箙涔熸病鍑洪敊銆?聽 鍙﹀錛屽畠涔熸槸璇村彲鑳芥槸涓存椂鐨勶紝閭d竴瀹氬湪鏌愮鎯呭喌涓嬩笉鏄復鏃剁殑錛岄珮鎵嬭兘涓嶈兘瑙i噴涓涓嬭繖涓棶棰橈紵 聽 --------------------------------------------------------------- 聽 // 聽 聽Most 聽Windows 聽objects 聽are 聽represented 聽with 聽a 聽HANDLE, 聽including 聽 // 聽 聽 聽 聽 聽 聽the 聽most 聽important 聽ones, 聽HWND, 聽HDC, 聽HPEN, 聽HFONT 聽etc. 聽 // 聽 聽We 聽want 聽C++ 聽objects 聽to 聽wrap 聽these 聽handle 聽based 聽objects 聽whenever 聽we 聽can. 聽 // 聽 聽Since 聽Windows 聽objects 聽can 聽be 聽created 聽outside 聽of 聽C++ 聽(eg: 聽calling 聽 // 聽 聽 聽 聽 聽 聽::CreateWindow 聽will 聽return 聽an 聽HWND 聽with 聽no 聽C++ 聽wrapper) 聽we 聽must 聽 // 聽 聽 聽 聽 聽 聽support 聽a 聽reasonably 聽uniform 聽mapping 聽from 聽permanent 聽handles 聽 // 聽 聽 聽 聽 聽 聽(i.e. 聽the 聽ones 聽allocated 聽in 聽C++) 聽and 聽temporary 聽handles 聽(i.e. 聽 // 聽 聽 聽 聽 聽 聽the 聽ones 聽allocated 聽in 聽C, 聽but 聽passed 聽through 聽a 聽C++ 聽interface. 聽 // 聽 聽We 聽keep 聽two 聽dictionaries 聽for 聽this 聽purpose. 聽 聽The 聽permanent 聽dictionary 聽 // 聽 聽 聽 聽 聽 聽stores 聽those 聽C++ 聽objects 聽that 聽have 聽been 聽explicitly 聽created 聽by 聽 // 聽 聽 聽 聽 聽 聽the 聽developer. 聽 聽The 聽C++ 聽constructor 聽for 聽the 聽wrapper 聽class 聽will 聽 // 聽 聽 聽 聽 聽 聽insert 聽the 聽mapping 聽into 聽the 聽permanent 聽dictionary 聽and 聽the 聽C++ 聽 // 聽 聽 聽 聽 聽 聽destructor 聽will 聽remove 聽it 聽and 聽possibly 聽free 聽up 聽the 聽associated 聽 // 聽 聽 聽 聽 聽 聽Windows 聽object. 聽 // 聽 聽When 聽a 聽handle 聽passes 聽through 聽a 聽C++ 聽interface 聽that 聽doesn't 聽exist 聽in 聽 // 聽 聽 聽 聽 聽 聽the 聽permanent 聽dictionary, 聽we 聽allocate 聽a 聽temporary 聽wrapping 聽object 聽 // 聽 聽 聽 聽 聽 聽and 聽store 聽that 聽mapping 聽into 聽the 聽temporary 聽dictionary. 聽 // 聽 聽At 聽idle 聽time 聽the 聽temporary 聽wrapping 聽objects 聽are 聽flushed 聽(since 聽you 聽better 聽 // 聽 聽 聽 聽 聽 聽not 聽be 聽holding 聽onto 聽something 聽you 聽didn't 聽create). 聽 // 聽 聽 聽 鍦–WinThread::OnIdle閲岃皟鐢ˋfxUnlockTempMaps錛孉fxUnlockTempMaps浼氶噴鏀総emporary 聽maps. 聽 聽 鎵浠ヤ笉瑕佷繚鐣橤etDlgItem絳夎繑鍥炵殑涓存椂鎸囬拡錛屽彲浠ョ洿鎺ヤ繚瀛楬WND 聽objects錛岀劧鍚嶤Wnd::FromHandle鑾峰彇涓存椂鎸囬拡鏉ョ敤銆?聽 聽 --------------------------------------------------------------- 聽 聽 涓存椂鍖呰瀵硅薄浼氬湪絀洪棽鏃墮棿鍒犻櫎.鍦ㄥ悓涓鍑芥暟涓嬈′嬌鐢ㄦ槸娌$敤闂鐨?涓嶅悓鍑芥暟涓嬌鐢ㄥ厛鍓嶄繚瀛樹笅鏉ョ殑鎸囬拡灝辨湁鍙兘鍑洪敊,鐗瑰埆鏄璇濇鍒濅嬌鍖栨椂鍊欏瓨涓嬫潵鐨勬寚閽? 聽 聽 聽 聽 聽鍦∕FC灞傛涓婄殑鍑芥暟浣跨敤CWnd瀵硅薄,鑰屾湰鍦癢indows浠g爜(API)浣跨敤鍙ユ焺.濡?褰揥indows緋葷粺璋冪敤涓涓獥鍙h繃紼嬫椂灝嗕紶閫掍竴涓狧WND鍙傛暟,鑰孧FC鏈韓鐨勬秷鎭満鍒朵嬌鐢–Wnd綾?涓轟簡鏇村ソ鏇撮珮鏁堢殑瀹炵幇,MFC闇瑕佷笌Windows緋葷粺鍚堜綔,灝嗗彞鏌勪笌CWnd瀵硅薄榪涜鍏寵仈---瀹冪敤CHandleMap瀹屾垚鍏寵仈. 聽 CHandleMap鏈変袱涓狢MapPtrToPtr鐨勬垚鍛樺彉閲?m_permanentMap(姘鎬箙鏄犲皠琛?紼嬪簭榪愯榪囩▼涓璞?鍙ユ焺涔嬮棿鐨勫叧緋?,m_temporaryMap(涓存椂鏄犲皠琛?鍦ㄦ秷鎭瓨鍦ㄧ殑榪囩▼涓墠瀛樺湪).姘鎬箙琛ㄤ繚瀛樻樉寮忓垱寤虹殑CWnd瀵硅薄,褰撳璞″垱寤烘椂灝嗗湪姘鎬箙鐩綍涓嬫彃鍏ヤ竴涓潯鐩?鍦–Wnd::OnNcDestrory鏃跺垹闄ゅ搴旀潯鐩?浣嗘槸Windows鏈夋椂浼氫紶鍏ユ煇浜涗笉鏄敱寮鍙戜漢鍛樻樉寮忓垱寤虹殑紿楀彛鐨勫彞鏌?姝ゆ椂MFC浼氬垎閰嶄竴涓復鏃跺璞℃潵鍖呰榪欎釜鍙ユ焺騫跺皢瀹冧滑鐨勬槧灝勪繚瀛樺埌涓存椂鏄犲皠琛ㄤ腑,榪欎簺涓存椂瀵硅薄浼氬湪絀洪棽鏃墮棿琚垹闄ゅ茍縐昏蛋鐩稿簲鐨勪復鏃舵槧灝勮〃鏉$洰.綾諱技鐨凪FC瀵硅薄涓嶹indows鍙ユ焺鐨勬槧灝勮〃鏈? 聽 m_pmapHWND: 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽紿楀彛鍙ユ焺涓嶤Wnd瀵硅薄 聽 m_pampHMENU: 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽鑿滃崟鍙ユ焺涓嶤Menu瀵硅薄 聽 m_pmapHDC: 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽璁懼鐜鍙ユ焺涓嶤DC瀵硅薄 聽 m_pmapHGDIOBJ: 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽GDI鍙ユ焺涓嶤GDI瀵硅薄 聽 m_mapHIMAGELIST: 聽聽 聽聽 聽聽 聽聽鍥懼儚閾捐〃鍙ユ焺鍒癈ImageList瀵硅薄 聽 聽 褰撶粰瀹氬彞鏌?濡侶WND鏃?MFC綆鍗曡皟鐢–Wnd* 聽PASCAL 聽CWnd::FromHandle(HWND 聽hWnd), 聽姝ゅ嚱鏁板唴閮ㄤ嬌鐢–HandleMap::FromHandle(hWnd)鑾峰彇鐩稿叧鑱旂殑CWnd瀵硅薄.鍦–HandleMap::FromHandle(h)鍐呴儴(婧愪唬鐮佸湪WinHand.cpp),鍏堜嬌鐢–Object* 聽pObject 聽= 聽LookupPermanent(h); 聽聽 聽聽 聽聽 聽聽if 聽(pObject 聽!= 聽NULL)return 聽pObject; 聽 聽媯鏌ユ案涔呰〃;濡傛案涔呰〃涓笉瀛樺湪,浣跨敤pObject 聽= 聽LookupTemporary(h)) 聽!= 聽NULL媯鏌ヤ復鏃惰〃,閮戒笉瀛樺湪鏃?浣跨敤pTemp 聽= 聽= 聽m_pClass->CreateObject();if 聽(pTemp 聽== 聽NULL)AfxThrowMemoryException();m_temporaryMap.SetAt((LPVOID)h, 聽pTemp);鍒涘緩涓存椂瀵硅薄騫跺皢鍏舵彃鍏ュ埌涓存椂琛ㄤ腑鍘?鍚屾椂榪斿洖璇ヤ復鏃跺璞? 聽 void 聽CHandleMap::RemoveHandle(HANDLE 聽h)鐨勬敞閲婅鏄庝復鏃跺璞″皢鍦ㄧ┖闂叉椂鐢監nIdel閲婃斁: 聽 聽聽 聽聽 聽聽 聽聽// 聽remove 聽only 聽from 聽permanent 聽map 聽-- 聽temporary 聽objects 聽are 聽removed 聽 聽聽 聽聽 聽聽 聽聽// 聽 聽at 聽idle 聽in 聽CHandleMap::DeleteTemp, 聽always! 聽 濡傛灉鎯充笉鑷姩閲婃斁涓存椂瀵硅薄,浣跨敤void 聽AFXAPI 聽AfxLockTempMaps()/BOOL 聽AFXAPI 聽AfxUnlockTempMaps(BOOL 聽bDeleteTemps)榪涜閿佸畾. 聽 |
|||
濡傛灉涓嶆槸unicode,鏌愪簺涓枃瀛楃浼氬湪涓嶅悓鐨?/span>codepage涓婂嚭鐜頒貢鐮?/span>;濡傛灉褰撳墠codepage涓洪煩鏂囨椂,鏌愪簺涓枃瀛椾細鍙樻垚闊╂枃鐨勬牱瀛?/span>,濂囨?/span>.
瀹忓畾涔?/span>UNICODE, _UNICODE瀹氫箟涓や釜涔熷彲浠?/span>,瀹氫箟涓涓篃鍙互,windows鐨勫ご鏂囦歡浼氫繚璇佷袱涓兘浼氳瀹氫箟.
聽
姣斿
char -> TCHAR
浣嗘槸
,騫朵笉鏄鎵鏈夌殑char綾誨瀷閮戒笉鑳界敤浜?/span>.濡傛灉闇瑕佺敤,騫朵笖鍑芥暟鐨勫弬鏁?/span>/榪斿洖鍊間粈涔堢殑閮戒笉鍐茬獊,char綾誨瀷榪樻槸鍙互鐢ㄧ殑.
"
abc
" -> _T("
abc
")
鍥犱負寮濮嬪啓紼嬪簭鏃舵病鏈夋敞鎰?/span>
,閫犳垚榪欐牱鐨勫父閲忓瓧絎︿覆褰㈠紡闈炲父澶?/span>,涓涓釜鏀硅搗鏉ュ緢鐑?/span>,鎴戝啓浜嗕釜灝忔彃浠?/span>,鍙互璁?/span>
鈥?/span>
abc
鈥?/span>
閫変腑鍚庣偣涓涓?/span>
button灝辮兘鍙樻垚_T(
鈥?/span>
abc
鈥?/span>
),鏈夌偣鐢?/span>,浠g爜涔熼潪甯哥殑鐭?/span>.
姣斿atoi -> _ttoi
鍦ㄨ繖閲岄亣鍒頒竴涓棶棰?/span>,灝辨槸atof鐨勬浛鎹?/span>.
鎸夌収msdn, atof搴旇琚?/span>_ttof鏇挎崲
|
TCHAR.H routine
|
_UNICODE & _MBCS not defined
|
_MBCS defined
|
_UNICODE defined
|
|
_tstof
|
atof
|
atof
|
_wtof
|
浣嗘槸濂囨殑鏄?/span>,VC6閲岄潰涓嶈璇?/span>_tstof榪欎釜鍑芥暟,VC.net 2003灝卞彲浠?/span>.
鏈変袱涓В鍐崇殑鍔炴硶:
1)聽聽聽聽聽 鍥犱負atof鍙槸鏇挎崲涓烘誕鐐規暟,鎵浠ヨ繖閲岀敤WideCharToMultiByte杞寲涓涓嬩箣鍚庡啀璋冪敤atof涔熸槸鍙鐨?/span>
2)聽聽聽聽聽 鍛靛懙,鐢?/span>strtod鐨勬浛鎹㈠嚱鏁?/span>_tcstod,鍝堝搱,褰撶劧鍙傛暟瑕佸彉涓涓?鎴戣寰楄繖涓柟娉曚笉閿?涓嶈琚玬sdn闄愬埗姝諱簡
鍥犱負欏圭洰榪樼敤浜嗗彟澶栦竴涓?/span>dll,鍏朵腑鏈変簺鎺ュ彛闇瑕?/span>char*鍙傛暟,榪欎釜鏃跺欏氨蹇呴』鐢?/span>WideCharToMultiByte杞崲涓涓嬩簡.
VC閲岄潰鐨勮緗?
1) 絳夋妸鎵鏈夌殑緙栬瘧error鏀瑰畬浜嗕箣鍚庝竴緙栬瘧,闄や簡涓猯ink閿欒,涓嶈繃msdn鏈夎В閲?
If you are using Unicode and MFC, you will get an unresolved external on _WinMain@16 if you don鈥檛 create an entrypoint to wWinMainCRTStartup. Use the /ENTRY option or type this value in the Project Settings dialog box. (To find this option in the development environment, click Settings on the Project menu, then click the Link tab, and click Output in the Category box.)
2)緇堜簬緙栬瘧鎴愬姛浜?璋冭瘯鐨勬椂鍊欏嵈鍙戠幇CString鐨勫間笉鑳藉湪QuickWatch紿楀彛涓樉紺轟簡
tools->option->
in the debug tab u can find a check box Labeled "Display unicode strings"
Check it.
鍦ㄤ嬌鐢?/span>dll鐨勬椂鍊?/span>,闇瑕佺洿鎺ヤ嬌鐢?/span>dll涓殑涓涓彉閲?/span>,鏄?/span>CString綾誨瀷,鍥犱負榪欎釜dll榪樻病鏈夋敼涓?/span>unicode,鎵浠ュ湪鐩存帴浣跨敤鍏跺彉閲忔椂鏈夌偣闂,浣垮緱鍊間笉瀵?/span>.(鏄笉鏄繖涓師鍥犺繕娌℃湁瀹屽叏楠岃瘉,搴旇鏄殑)
/*琛ュ厖錛?br />緇撴灉鏄け璐ワ紝浣嗘槸鍩烘湰縐繪浠g爜鐨勬墍鏈夋楠ら兘鏈変簡銆傝屼笖錛屼篃鎸囧嚭浜嗗鏋滈渶瑕佽皟鐢ㄧ殑dll涓嶆槸unicode錛屾瘡嬈¤皟鐢?浼犻掑弬鏁版椂錛岄兘瑕佽漿鎹紝寰堢儲銆?br />鍚庢潵鎴戞妸dll鐨勪唬鐮佷篃縐繪浜嗕笅錛岀幇鍦ㄨ繍琛岀殑寰堝ソ錛岄煩鏂囥佷腑鏂囬兘鍙互鏄劇ず錛屼笉綆′綘褰撳墠璇█鏄粈涔堛?br />*/
榪樻湁涓綃囪縐繪姝ラ鐨?鏇村叏闈?閫傚悎鏇村鏉傜殑鎯呭喌:
Cheat Sheet:Unicode-enabling Microsoft C/C++ Source Code (http://www.i18nguy.com/unicode/c-unicode.html)
聽
鐜板湪濂戒簡錛岃嚜宸卞啓浜嗕釜紼嬪簭錛屽揩閫熷垏鎹細褰撳墠鏄彸鎵嬩範鎯氨鎹㈠埌宸︽墜涔犳儻錛涘弽涔嬫崲鍒板彸鎵嬩範鎯?br />紼嬪簭寰堝皬錛屽彧鏈?琛屼唬鐮侊細
CString聽strTest聽=聽"123";
char*聽p聽=聽strTest.GetBuffer(0);
int聽i聽=聽atoi(p);
strTest.ReleaseBuffer();
CString聽strTest聽=聽"123";
int聽i聽=聽atoi((LPCTSTR)strTest);
聽聽聽聽CString聽strTest聽=聽"123聽45";
聽聽聽聽//some聽other聽code
聽聽聽聽CString聽strTest2聽=聽strTest;
聽聽聽聽char聽seps[]聽=聽"聽";
聽聽聽聽char*聽pToken聽=聽0;
聽聽聽聽//char*聽pStr聽=聽strTest2.GetBuffer(0);
聽聽聽聽pToken聽=聽strtok((char*)(LPCTSTR)strTest2,聽seps);
聽聽聽聽//pToken聽=聽strtok(pStr,聽seps);
聽聽聽聽while(pToken)
聽聽聽聽聽聽聽聽pToken聽=聽strtok(NULL,聽seps);
聽聽聽聽聽聽聽聽聽//strTest2.ReleaseBuffer(0);
struct CStringData

{
long nRefs; // reference count
int nDataLength; // length of data (including terminator)
int nAllocLength; // length of allocation
// TCHAR data[nAllocLength]
TCHAR* data() // TCHAR* to managed data
{ return (TCHAR*)(this+1); }
};
class CString

{
public:
// Constructors
// constructs empty CString
CString();
// copy constructor
CString(const CString& stringSrc);
// from a single character
CString(TCHAR ch, int nRepeat = 1);
// from an ANSI string (converts to TCHAR)
CString(LPCSTR lpsz);
// from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpsz);
// subset of characters from an ANSI string (converts to TCHAR)
CString(LPCSTR lpch, int nLength);
// subset of characters from a UNICODE string (converts to TCHAR)
CString(LPCWSTR lpch, int nLength);
// from unsigned characters
CString(const unsigned char* psz);
// Attributes & Operations浣嗘槸鐪嬫枃绔犵殑鏍峰瓙錛屼篃涓嶅儚鏄矖鍒舵互閫犵殑錛屽績閲屽緢鏄枒鎯戙?BR>鍚庢潵鍐嶆墦寮VC7鐨勬簮鐮佺湅錛屾灉鐒訛細
鐪嬫潵寰蔣鍦ㄤ笉鐭ヤ笉瑙変腑鍋氫簡榪欎箞澶х殑鍙樺寲銆?BR>
2
鈥渟tring鏄柟渚跨殑錛屽彲浠ヤ粠鍑犱箮鎵鏈夌殑瀛楃涓叉瀯閫犺屾潵錛屽寘鎷珻String鍜宑har*錛?nbsp;
CString嬈′箣錛屽彲浠ヤ粠鍩烘湰鐨勪竴浜涘瓧絎︿覆鍙橀噺鏋勯犺屾潵錛屽寘鎷琧har*絳夛紱 鈥?BR>鐨勭‘錛屽涓嬬殑浠g爜鏄彲浠ョ紪璇戠殑錛?BR>
浣嗘槸榪欐槸琛ㄦ槑string姣擟String鏂逛究鍚楋紵
瀹為檯涓婏紝鍦╯tring sTest(strTest);涓湁涓涓嚱鏁拌璋冪敤錛屽氨鏄細
鐒跺悗鎵嶆槸string鏋勯犵敓鎴愶紝榪欒兘璇存槸string姣擟String鏂逛究鍚楋紵搴旇璇存槸CString姣攕tring鏂逛究鎵嶅ソ銆?BR>铏界劧鍙互鐢?BR>
鏉ュ垵濮嬪寲CString錛屼絾鏄疌String娌℃湁鍙傛暟涓簊tring鐨勬瀯閫犲嚱鏁幫紝涔熸槸涓涓皬灝忕殑閬楁喚錛屾瘯绔焥tring鏄痗++鏍囧噯搴撶殑涓閮ㄥ垎浜嗐?/STRONG>
閬囧埌濂藉嚑涓漢璇碈Map鍦ㄧ敤CString鍋歬ey綾誨瀷鏃舵湁闂錛岃鐢╥nt鍜孌WORD灝卞彲浠ワ紝鐢–String灝變笉琛屻傚洜姝ゅ緢澶氫漢鎺ㄨ崘浣跨敤MFC涓殑CMapStringToPtr涔嬬被銆?/p>
鐪嬩笅闈㈢殑浠g爜錛?br />//.h
聽聽聽聽CMap<CString, LPCTSTR, int, int> typeMap;
//.cpp
聽聽聽聽typeMap.SetAt(_T("ONE"),1);
聽聽聽聽typeMap.SetAt(_T("TWO"),2);
聽聽聽聽int nValue = 0;
聽聽聽聽BOOL ret = typeMap.Lookup(_T("ONE"), nValue);
聽聽聽聽ret = typeMap.Lookup(_T("THREE"), nValue);
聽聽聽聽ret = typeMap.Lookup(_T("TWO"), nValue);
鎴戠殑浠g爜榪愯鐨勫緢濂斤紝鎴戣寰楀叧閿槸ARG_KEY瑕侀塋PCTSTR