锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ㄤ綘寮濮嬩嬌鐢╓TL鎴栫潃鍦ㄦ湰鏂囩珷鐨勮璁哄尯寮犺創娑堟伅涔嬪墠錛屾垜鎯寵浣犲厛闃呰涓嬮潰鐨勬潗鏂欍?/p>
浣犻渶瑕佸紑鍙戝鉤鍙癝DK錛圥latform SDK錛夈備綘瑕佷嬌鐢╓TL涓嶈兘娌℃湁瀹冿紝浣犲彲浠ヤ嬌鐢?a >鍦ㄧ嚎鍗囩駭瀹夎寮鍙戝鉤鍙癝DK錛屼篃鍙互涓嬭澆鍏ㄩ儴鏂囦歡鍚庡湪鏈湴瀹夎銆傚湪浣跨敤涔嬪墠瑕佸皢SDK鐨勫寘鍚枃浠訛紙.h澶存枃浠訛級鍜屽簱鏂囦歡錛?Lib鏂囦歡錛夎礬寰勬坊鍔犲埌VC鐨勬悳绱㈢洰褰曪紝SDK鏈夌幇鎴愮殑宸ュ叿瀹屾垚榪欎釜宸ヤ綔錛岃繖涓伐鍏蜂綅浜庡紑鍙戝鉤鍙癝DK紼嬪簭緇勭殑鈥?i>Visual Studio Registration鈥濇枃浠跺す閲屻?/p>
浣犻渶瑕佸畨瑁?WTL銆備綘鍙互浠庡井杞殑緗戠珯涓?a >涓嬭澆WTL鐨?.0鐗?/font>錛?*緙栬緫娉細WTL涔熷彲浠ュ埌VC鐭ヨ瘑搴?a target="_blank">http://www.vckbase.com/tools涓嬭澆) 鍦ㄥ畨瑁呬箣鍓嶅彲浠ュ厛鏌ョ湅鈥?a >Introduction to WTL - Part 1鈥濆拰鈥?a >Easy installation of WTL鈥濊繖涓ょ瘒鏂囩珷錛屼簡瑙d竴涓嬫墍瑕佸畨瑁呯殑鏂囦歡鐨勪俊鎭紝铏界劧鐜板湪榪欎簺鏂囩珷鏈変簺榪囨椂錛屼絾榪樻槸鍙互鎻愪緵寰堝鏈夌敤鐨勪俊鎭傛湁涓浠舵垜璁や負涓嶈鍦ㄦ湰綃囨枃绔犱腑鎻愬埌鐨勪簨鏄憡璇塚C濡備綍鎼滅儲WTL鐨勫寘鍚枃浠惰礬寰勶紝濡傛灉浣犵敤鐨刅C6錛岀敤榧犳爣鐐瑰嚮 Tools\Options錛岃漿鍒?i>Directories鏍囩欏碉紝鍦ㄦ樉紺鴻礬寰勭殑鍒楄〃妗嗕腑閫夋嫨Include Files錛岀劧鍚庡皢WTL鐨勫寘鍚枃浠剁殑瀛樻斁璺緞娣誨姞鍒板寘鍚枃浠舵悳绱㈣礬寰勫垪琛ㄤ腑銆?/p>
浣犻渶瑕佷簡瑙FC銆傚緢濂藉湴浜嗚ВMFC灝嗘湁鍔╀簬浣犵悊瑙e悗闈㈡彁鍒扮殑鏈夊叧娑堟伅鏄犲皠鐨勫畯騫惰兘澶熺紪杈戦偅浜涙爣鏈夆滀笉瑕佺紪杈戯紙DO NOT EDIT錛夆濈殑浠g爜鑰屼笉浼氬嚭鐜伴棶棰樸?/p>
浣犻渶瑕佹竻妤氬湴鐭ラ亾濡備綍浣跨敤Win32 API緙栫▼銆傚鏋滀綘鏄洿鎺ヤ粠MFC寮濮嬪涔燱indows緙栫▼錛屾病鏈夊榪嘇PI綰у埆鐨勬秷鎭鐞嗘柟寮忥紝閭e緢涓嶅垢浣犱細鍦ㄤ嬌鐢╓TL鏃墮亣鍒伴夯鐑︺傚鏋滀笉浜嗚ВWindows娑堟伅涓璚PARAM鍙傛暟鍜孡PARAM鍙傛暟鐨勬剰涔夛紝搴旇鏄庣櫧闇瑕佽涓浜涜繖鏂歸潰鐨勬枃绔狅紙鍦–odeProject鏈夊ぇ閲忕殑姝ょ被鏂囩珷錛夈?/p>
浣犻渶瑕佺煡閬?C++ 妯℃澘鐨勮娉曪紝浣犲彲浠ュ埌VC Forum FAQ 鐩稿叧鐨勮繛鎺ュ姹傜瓟妗堛?/p>
鎴戝彧鏄璁轟簡涓浜涙兜鐩朧C 6鐨勭壒鐐癸紝涓嶈繃鎹垜浜嗚В鎵鏈夌殑紼嬪簭閮藉彲浠ュ湪VC 7涓婁嬌鐢ㄣ傜敱浜庢垜涓嶄嬌鐢╒C 7錛屾垜鏃犳硶瀵歸偅浜涘湪VC 7涓嚭鐜扮殑闂鎻愪緵甯姪錛屼笉榪囦綘榪樻槸鍙互鏀懼績鐨勫湪姝ゅ紶璐翠綘鐨勯棶棰橈紝鍥犱負鍏朵粬鐨勪漢鍙兘浼氬府鍔╀綘銆?/p>
瀵規湰緋誨垪鏂囩珷鐨勬諱綋浠嬬粛
WTL 鍏鋒湁涓ら潰鎬э紝紜疄鏄繖鏍風殑銆傚畠娌℃湁MFC鐨勭晫闈紙GUI錛夌被搴撻偅鏍峰姛鑳藉己澶э紝浣嗘槸鑳藉鐢熸垚寰堝皬鐨勫彲鎵ц鏂囦歡銆傚鏋滀綘璞℃垜涓鏍蜂嬌鐢∕FC榪涜鐣岄潰緙栫▼錛屼綘浼氳寰桵FC鎻愪緵鐨勭晫闈㈡帶浠跺皝瑁呬嬌鐢ㄨ搗鏉ラ潪甯歌垝鏈嶏紝鏇翠笉鐢ㄨMFC鍐呯疆鐨勬秷鎭鐞嗘満鍒躲傚綋鐒訛紝濡傛灉浣犱篃璞℃垜涓鏍蜂笉甯屾湜鑷繁鐨勭▼搴忎粎浠呭洜涓轟嬌鐢ㄤ簡MFC鐨勬鏋跺氨澧炲姞鍑犵櫨K鐨勫ぇ灝忕殑璇濓紝WTL灝辨槸浣犵殑閫夋嫨銆傚綋鐒訛紝鎴戜滑榪樿鍏嬫湇涓浜涢殰紕嶏細 浠庡彟涓鏂歸潰璁詫紝WTL涔熸湁瀹冭嚜韜殑浼樺娍錛?/p>
鍦ㄨ繖涓緋誨垪鏂囩珷涓紝鎴戝皢棣栧厛浠嬬粛ATL鐨勭獥鍙g被錛屾瘯绔焀TL鏄瀯寤轟笌ATL涔嬩笂鐨勪竴緋誨垪闄勫姞綾伙紝鎵浠ラ渶瑕佸緢濂界殑浜嗚ВATL鐨勭獥鍙g被銆備粙緇嶅畬ATL涔嬪悗鎴戝皢浠嬬粛WTL鐨勭壒鎬т互騫跺睍紺哄畠鏄浣曚嬌鐣岄潰緙栫▼鍙樺緱杞昏屾槗涓俱?/p>
瀵圭涓绔犵殑綆鍗曚粙緇?/b>
WTL鏄釜寰堥叿鐨勫伐鍏鳳紝鍦ㄧ悊瑙h繖涓鐐逛箣鍓嶉渶瑕侀鍏堜粙緇岮TL銆俉TL鏄瀯寤轟笌ATL涔嬩笂鐨勪竴緋誨垪闄勫姞綾伙紝濡傛灉浣犳槸涓弗鏍間嬌鐢∕FC鐨勭▼搴忓憳閭d箞浣犲彲鑳芥病鏈夋満浼氭帴瑙﹀埌ATL鐨勭晫闈㈢被錛屾墍浠ヨ瀹瑰繊鎴戝湪寮濮媁TL涔嬪墠鍏堢綏绱竴浜涘埆鐨勪笢瑗匡紝緇曢亾鏉ヤ粙緇嶄竴涓婣TL鏄緢鏈夊繀瑕佸湴銆?/p>
鍦ㄦ湰鏂囩殑絎竴閮ㄥ垎錛屾垜灝嗙粰鍑轟竴鐐笰TL鐨勮儗鏅煡璇嗭紝鍖呮嫭涓浜涚紪鍐橝TL浠g爜蹇呴』鐭ラ亾鐨勫熀鏈煡璇嗭紝蹇熺殑瑙i噴涓浜涗護浜轟笉鐭ユ墍鎺殑ATL妯℃澘綾誨拰鍩烘湰鐨凙TL紿楀彛綾匯?/p>
ATL 鑳屾櫙鐭ヨ瘑
ATL 鍜?WTL 鐨勫彂灞曞巻鍙?/b>
鈥滄椿鍔ㄦā鏉垮簱鈥濓紙Active Template Library錛夋槸涓涓緢鍙ゆ殑鍚嶅瓧錛屼笉鏄悧錛熼偅浜涘勾綰ぇ鐨勪漢鍙兘榪樿寰楀畠鏈鍒濊縐頒負鈥滅綉緇滅粍浠舵ā鏉垮簱鈥濓紝榪欏彲鑳芥槸瀹冩洿鍑嗙‘鐨勭О鍛鹼紝鍥犱負ATL鐨勭洰鐨勫氨鏄嬌緙栧啓緇勪歡瀵硅薄鍜孉ctiveX鎺т歡鏇村鏄撲竴浜涳紙ATL鏄湪寰蔣寮鍙戞柊浜у搧ActiveX-鏌愭煇鐨勮繃紼嬩腑寮鍙戠殑錛岄偅浜汚ctiveX-鏌愭煇鐜板湪琚О涓烘煇鏌?NET錛夈傜敱浜嶢TL鏄負浜嗕究浜庣紪鍐欑粍浠跺璞¤屽瓨鍦ㄧ殑錛屾墍浠ュ彧鎻愪緵浜嗙畝鍗曠殑鐣岄潰綾伙紝鐩稿綋浜嶮FC鐨勭獥鍙g被錛圕Wnd錛夊拰瀵硅瘽妗嗙被錛圕Dialog錛夈傚垢榪愮殑鏄繖浜涚被闈炲父鐨勭伒媧伙紝鑳藉鍦ㄥ叾鍩虹涓婃瀯寤鴻薄WTL榪欐牱鐨勯檮鍔犵被銆?/p>
WTL鐜板湪宸茬粡鏄浜屾淇浜嗭紝鏈鍒濈殑鐗堟湰鏄?.1錛岀幇鍦ㄧ殑鐗堟湰鏄?錛圵TL鐨勭増鏈彿涔嬫墍浠ヨ繖鏍烽夋嫨鏄負浜嗕笌ATL鐨勭増鏈尮閰嶏紝鎵浠ヤ笉瀛樺湪1鍜?榪欐牱鐨勭増鏈彿錛夈俉TL 3.1鍙互涓嶸C 6鍜孷C 7涓璧蜂嬌鐢紝浣嗘槸鍦╒C 7涓嬮渶瑕佸畾涔夊嚑涓澶勭悊鏍囧彿銆俉TL 7鍚戜笅鍏煎WTL 3.1錛屽茍涓斾笉浣滀換浣曚慨鏀瑰氨鍙互涓嶸C 7涓璧蜂嬌鐢紝鐜板湪鐪嬫潵娌℃湁浠諱綍鐞嗙敱榪樹嬌鐢?.1鏉ヨ繘琛屾柊鐨勫紑鍙戝伐浣溿?br /> 鍗充嬌浣犺兘澶熸涓嶈垂鍔涘湴闃呰C++鐨勬ā鏉跨被浠g爜錛屼粛鐒舵湁涓や歡浜嬪彲鑳戒細浣夸綘鏈変簺澶存檿錛屼互涓嬮潰榪欎釜綾葷殑瀹氫箟涓轟緥錛?/p>
榪欐牱浣滄槸鍚堟硶鐨勶紝鍥犱負C++鐨勮娉曡В閲婅鍗充嬌CMyWnd綾誨彧鏄閮ㄥ垎瀹氫箟錛岀被鍚岰MyWnd宸茬粡琚垪鍏ラ掑綊緇ф壙鍒楄〃錛屾槸鍙互浣跨敤鐨勩傚皢綾誨悕浣滀負妯℃澘綾葷殑鍙傛暟鏄洜涓篈TL瑕佸仛鍙︿竴浠惰縐樼殑浜嬫儏錛岄偅灝辨槸緙栬瘧鏈熼棿鐨勮櫄鍑芥暟璋冪敤鏈哄埗銆?/p>
濡傛灉浣犳兂瑕佷簡瑙e畠鏄浣曞伐浣滃湴錛岃鐪嬩笅闈㈢殑渚嬪瓙錛?/p>
榪欏彞浠g爜static_cast<T*>(this) 灝辨槸紿嶉棬鎵鍦ㄣ傚畠鏍規嵁鍑芥暟璋冪敤鏃剁殑鐗規畩澶勭悊灝嗘寚鍚態1綾誨瀷鐨勬寚閽坱his鎸囨淳涓篋1鎴朌2綾誨瀷鐨勬寚閽堬紝鍥犱負妯℃澘浠g爜鏄湪緙栬瘧鍏墮棿鐢熸垚鐨勶紝鎵浠ュ彧瑕佺紪璇戝櫒鐢熸垚姝g‘鐨勭戶鎵垮垪琛紝榪欐牱鎸囨淳灝辨槸瀹夊叏鐨勩傦紙濡傛灉浣犲啓鎴愶細 灝變細鏈夐夯鐑? 涔嬫墍浠ュ畨鍏ㄦ槸鍥犱負this瀵硅薄鍙彲鑳芥槸鎸囧悜D1鎴朌2錛堝湪鏌愪簺鎯呭喌涓嬶級綾誨瀷鐨勫璞★紝涓嶄細鏄叾浠栫殑涓滆タ銆傛敞鎰忚繖寰堝儚C++鐨勫鎬佹э紙polymorphism錛夛紝鍙槸SayHi()鏂規硶涓嶆槸铏氬嚱鏁般?/p>
瑕佽В閲婅繖鏄浣曞伐浣滅殑錛岄鍏堢湅瀵規瘡涓猄ayHi()鍑芥暟鐨勮皟鐢紝鍦ㄧ涓涓嚱鏁拌皟鐢紝瀵硅薄B1琚寚媧句負D1錛屾墍浠ヤ唬鐮佽瑙i噴鎴愶細 鐢變簬D1娌℃湁閲嶈澆PrintClassName()錛屾墍浠ユ煡鐪嬪熀綾籅1錛孊1鏈塒rintClassName()錛屾墍浠1鐨凱rintClassName()琚皟鐢ㄣ?/p>
鐜板湪鐪嬬浜屼釜鍑芥暟璋冪敤SayHi()錛岃繖涓嬈″璞¤鎸囨淳涓篋2綾誨瀷錛孲ayHi()琚В閲婃垚錛?/p>
榪欎竴嬈★紝D2鍚湁PrintClassName()鏂規硶錛屾墍浠2鐨凱rintClassName()鏂規硶琚皟鐢ㄣ?/p>
榪欑鎶鏈殑鏈夊埄涔嬪鍦ㄤ簬錛?/p>
鑺傜渷铏氬嚱鏁拌〃鍦ㄨ繖涓緥瀛愪腑鐪嬭搗鏉ユ棤瓚寵交閲嶏紙姣忎釜铏氬嚱鏁板彧鏈?涓瓧鑺傦級錛屼絾鏄鎯充竴涓嬪鏋滄湁15涓熀綾伙紝姣忎釜綾誨惈鏈?0涓柟娉曪紝鍔犺搗鏉ュ氨鐩稿綋鍙浜嗐?/p>
ATL 紿楀彛綾?/b>
濂戒簡錛屽叧浜嶢TL鐨勮儗鏅煡璇嗗凡緇忚鐨勬瀯澶氫簡錛屽埌浜嗚姝e紡璁睞TL鐨勬椂鍊欎簡銆侫TL鍦ㄨ璁℃椂鎺ュ彛瀹氫箟鍜屽疄鐜版槸涓ユ牸鍖哄垎寮鐨勶紝榪欏湪紿楀彛綾葷殑璁捐涓槸鏈鏄庢樉鐨勶紝榪欎竴鐐圭被浼間簬COM錛孋OM鐨勬帴鍙e畾涔夊拰瀹炵幇鏄畬鍏ㄥ垎寮鐨勶紙鎴栬呭彲鑳芥湁澶氫釜瀹炵幇錛夈?/p>
ATL鏈変竴涓笓闂ㄤ負紿楀彛璁捐鐨勬帴鍙o紝鍙互鍋氬叏閮ㄧ殑紿楀彛鎿嶄綔錛岃繖灝辨槸CWindow銆傚畠瀹為檯涓婂氨鏄HWND鎿嶄綔鐨勫寘瑁呯被錛屽鍑犱箮鎵鏈変互HWND鍙ユ焺涓虹涓涓弬鏁扮殑紿楀彛API鐨勮繘琛屼簡灝佽錛屼緥濡傦細SetWindowText() 鍜?DestroyWindow()銆侰Window綾繪湁涓涓叕鏈夋垚鍛榤_hWnd錛屼嬌浣犲彲浠ョ洿鎺ュ紿楀彛鐨勫彞鏌勬搷浣滐紝CWindow榪樻湁涓涓搷浣滅HWND錛屼綘鍙互璁睠Window瀵硅薄浼犻掔粰浠WND涓哄弬鏁扮殑鍑芥暟錛屼絾榪欎笌CWnd::GetSafeHwnd()錛堣瘧鑰呭姞錛歁FC鐨勬柟娉曪級娌℃湁浠諱綍絳夊悓涔嬪銆?/p>
CWindow 涓?MFC 鐨凜Wnd綾繪湁寰堝ぇ鐨勪笉鍚岋紝鍒涘緩涓涓狢Window瀵硅薄鍗犵敤寰堝皯鐨勮祫婧愶紝鍥犱負鍙湁涓涓暟鎹垚鍛橈紝娌℃湁MFC紿楀彛涓殑瀵硅薄閾撅紝MFC鍐呴儴緇存寔榪欎竴涓璞¢摼錛屾瀵硅薄閾懼皢HWND鏄犲皠鍒癈Wnd瀵硅薄銆傝繕鏈変竴鐐逛笌MFC鐨凜Wnd綾諱笉鍚岀殑鏄綋涓涓狢Window瀵硅薄瓚呭嚭浜嗕綔鐢ㄥ煙錛屽畠鍏寵仈鐨勭獥鍙e茍涓嶈閿姣佹帀錛岃繖鎰忓懗鐫浣犲茍涓嶉渶瑕侀殢鏃惰寰楀垎紱諱綘鎵鍒涘緩鐨勪復鏃禖Window瀵硅薄銆?/p>
鍦ˋTL綾諱腑瀵圭獥鍙h繃紼嬬殑瀹炵幇鏄疌WindowImpl銆侰WindowImpl 鍚湁鎵鏈夌獥鍙e疄鐜頒唬鐮侊紝渚嬪錛氱獥鍙g被鐨勬敞鍐岋紝紿楀彛鐨勫瓙綾誨寲錛屾秷鎭槧灝勪互鍙婂熀鏈殑WindowProc()鍑芥暟錛屽彲浠ョ湅鍑鴻繖涓嶮FC鐨勮璁℃湁寰堝ぇ鐨勪笉鍚岋紝MFC灝嗘墍鏈夌殑浠g爜閮芥斁鍦ㄤ竴涓狢Wnd綾諱腑銆?/p>
榪樻湁涓や釜鐙珛鐨勭被鍖呭惈瀵硅瘽妗嗙殑瀹炵幇錛屽畠浠垎鍒槸CDialogImpl 鍜?CAxDialogImpl錛孋DialogImpl 鐢ㄤ簬瀹炵幇鏅氱殑瀵硅瘽妗嗚孋AxDialogImpl瀹炵幇鍚湁ActiveX鎺т歡鐨勫璇濇銆?/p>
瀹氫箟涓涓獥鍙g殑瀹炵幇
浠諱綍闈炲璇濇紿楀彛閮芥槸浠嶤WindowImpl 媧劇敓鐨勶紝浣犵殑鏂扮被闇瑕佸寘鍚笁浠朵簨鎯咃細 紿楀彛綾葷殑瀹氫箟閫氳繃DECLARE_WND_CLASS瀹忔垨DECLARE_WND_CLASS_EX瀹忔潵瀹炵幇銆傝繖杈嗕釜瀹忓畾涔変簡涓涓狢WndClassInfo緇撴瀯錛岃繖涓粨鏋勫皝瑁呬簡WNDCLASSEX緇撴瀯銆侱ECLARE_WND_CLASS瀹忚浣犳寚瀹氱獥鍙g被鐨勭被鍚嶏紝鍏朵粬鍙傛暟浣跨敤榛樿璁劇疆錛岃孌ECLARE_WND_CLASS_EX瀹忚繕鍏佽浣犳寚瀹氱獥鍙g被鐨勭被鍨嬪拰紿楀彛鐨勮儗鏅鑹詫紝浣犱篃鍙互鐢∟ULL浣滀負綾誨悕錛孉TL浼氳嚜鍔ㄤ負浣犵敓鎴愪竴涓被鍚嶃?/p>
璁╂垜浠紑濮嬪畾涔変竴涓柊綾伙紝鍦ㄥ悗闈㈢殑绔犺妭鎴戜細閫愭鐨勫畬鎴愯繖涓被鐨勫畾涔夈?/p>
鎺ヤ笅鏉ユ槸娑堟伅鏄犲皠閾撅紝ATL鐨勬秷鎭槧灝勯摼姣擬FC鐨勭畝鍗曠殑澶氾紝ATL鐨勬秷鎭槧灝勯摼琚睍寮涓簊witch璇彞錛宻witch璇彞姝g‘鐨勬秷鎭鐞嗚呭茍璋冪敤鐩稿簲鐨勫嚱鏁般備嬌鐢ㄦ秷鎭槧灝勯摼鐨勫畯鏄疊EGIN_MSG_MAP 鍜?END_MSG_MAP錛岃鎴戜滑涓烘垜浠殑紿楀彛娣誨姞涓涓┖鐨勬秷鎭槧灝勯摼銆?/p>
鎴戝皢鍦ㄤ笅涓鑺傚睍寮璁插浣曞浣曟坊鍔犳秷鎭鐞嗗埌娑堟伅鏄犲皠閾俱傛渶鍚庯紝鎴戜滑闇瑕佷負鎴戜滑鐨勭獥鍙g被瀹氫箟紿楀彛鐨勭壒寰侊紝紿楀彛鐨勭壒寰佸氨鏄獥鍙g被鍨嬪拰鎵╁睍紿楀彛綾誨瀷鐨勮仈鍚堜綋錛岀敤浜庡垱寤虹獥鍙f椂鎸囧畾紿楀彛鐨勭被鍨嬨傜獥鍙g被鍨嬭鎸囧畾涓哄弬鏁版ā鏉匡紝鎵浠ョ獥鍙g殑璋冪敤鑰呬笉闇瑕佷負鎸囧畾紿楀彛鐨勬紜被鍨嬭岀儲蹇冿紝涓嬮潰鏄槸鍚孉TL綾籆WinTraits瀹氫箟紿楀彛綾誨瀷鐨勪緥瀛愶細 璋冪敤鑰呭彲浠ラ噸杞紺MyWindowTraits鐨勭被鍨嬪畾涔夛紝浣嗘槸涓鑸儏鍐典笅榪欐槸娌℃湁蹇呰鐨勶紝ATL鎻愪緵浜嗗嚑涓鍏堝畾涔夌殑鐗規畩鐨勭被鍨嬶紝鍏朵腑涔嬩竴灝辨槸CFrameWinTraits錛屼竴涓潪甯告鐨勬鏋剁獥鍙o細 ATL鐨勬秷鎭槧灝勯摼鏄寮鍙戣呬笉澶弸濂界殑閮ㄥ垎錛屼篃鏄疻TL瀵瑰叾鏀硅繘鏈澶х殑閮ㄥ垎銆傜被鍚戝鑷沖皯鍙互璁╀綘娣誨姞娑堟伅鍝嶅簲錛岀劧鑰孉TL娌℃湁娑堟伅鐩稿叧鐨勫畯鍜岃薄MFC閭f牱鐨勫弬鏁拌嚜鍔ㄥ睍寮鍔熻兘錛屽湪ATL涓彧鏈変笁縐嶇被鍨嬬殑娑堟伅澶勭悊錛屼竴涓槸WM_NOTIFY錛屼竴涓槸WM_COMMAND錛岀涓夌被鏄叾浠栫獥鍙f秷鎭紝璁╂垜浠紑濮嬩負鎴戜滑鐨勭獥鍙f坊鍔燱M_CLOSE 鍜?WM_DESTROY鐨勬秷鎭浉搴斿嚱鏁般?/p>
浣犲彲鑳芥敞鎰忓埌娑堟伅鍝嶅簲鍑芥暟鐨勫埌鐨勬槸鍘熷鐨刉PARAM 鍜?LPARAM鍊鹼紝浣犻渶瑕佽嚜宸卞皢鍏跺睍寮涓虹浉搴旂殑娑堟伅鎵闇瑕佺殑鍙傛暟銆傝繕鏈夌鍥涗釜鍙傛暟bHandled錛岃繖涓弬鏁板湪娑堟伅鐩稿簲鍑芥暟璋冪敤琚獳TL璁劇疆涓篢RUE錛屽鏋滃湪浣犵殑娑堟伅鍝嶅簲澶勭悊瀹屼箣鍚庨渶瑕丄TL璋冪敤榛樿鐨刉indowProc()澶勭悊璇ユ秷鎭紝浣犲彲浠ヨbHandled璁劇疆涓篎ALSE銆傝繖涓嶮FC涓嶅悓錛孧FC鏄樉紺虹殑璋冪敤鍩虹被鐨勫搷搴斿嚱鏁版潵瀹炵幇鐨勯粯璁ょ殑娑堟伅澶勭悊鐨勩?/p>
璁╂垜浠篃娣誨姞涓涓WM_COMMAND娑堟伅鐨勫鐞嗭紝鍋囪鎴戜滑鐨勭獥鍙f湁涓涓狪D涓篒DC_ABOUT鐨凙bout鑿滃崟錛?/p>
闇瑕佹敞鎰忓緱鏄疌OMMAND_HANDLER瀹忓凡緇忓皢娑堟伅鐨勫弬鏁板睍寮浜嗭紝鍚屾牱錛孨OTIFY_HANDLER瀹忎篃灝哤M_NOTIFY娑堟伅鐨勫弬鏁板睍寮浜嗐?/p>
楂樼駭娑堟伅鏄犲皠閾懼拰宓屽叆綾?/b>
ATL鐨勫彟涓涓樉钁椾笉鍚屼箣澶勫氨鏄換浣曚竴涓狢++綾婚兘鍙互鍝嶅簲娑堟伅錛岃孧FC鍙槸灝嗘秷鎭搷搴斾換鍔″垎緇欎簡CWnd綾誨拰CCmdTarget綾伙紝澶栧姞鍑犱釜鏈?code>PreTranslateMessage()鏂規硶鐨勭被銆侫TL鐨勮繖縐嶇壒鎬у厑璁告垜浠紪鍐欐墍璋撶殑鈥滃祵鍏ョ被鈥濓紝涓烘垜浠殑紿楀彛娣誨姞鐗規у彧闇灝嗚綾繪坊鍔犲埌緇ф壙鍒楄〃涓氨琛屼簡錛屽氨榪欎箞綆鍗曪紒 涓涓熀鏈殑甯︽湁娑堟伅鏄犲皠閾劇殑綾婚氬父鏄ā鏉跨被錛屽皢媧劇敓綾葷殑綾誨悕浣滀負妯℃澘鐨勫弬鏁幫紝榪欐牱瀹冨氨鍙互璁塊棶媧劇敓綾諱腑鐨勬垚鍛橈紝姣斿m_hWnd錛圕Window綾諱腑鐨凥WND鎴愬憳錛夈傝鎴戜滑鏉ョ湅涓涓祵鍏ョ被鐨勪緥瀛愶紝榪欎釜宓屽叆綾婚氳繃鍝嶅簲 璁╂垜浠潵鐮旂┒涓涓嬭繖涓柊綾匯傞鍏堬紝CPaintBkgnd鏈変袱涓ā鏉垮弬鏁幫細浣跨敤CPaintBkgnd鐨勬淳鐢熺被鐨勫悕瀛楀拰鐢ㄦ潵鐢葷獥鍙h儗鏅殑棰滆壊銆傦紙t_ 鍓嶇紑閫氬父鐢ㄦ潵浣滀負妯℃澘綾葷殑妯℃澘鍙傛暟鐨勫墠緙錛塁PaintBkgnd涔熸槸浠嶤MessageMap媧劇敓鐨勶紝榪欏茍涓嶆槸蹇呴』鐨勶紝鍥犱負鎵鏈夐渶瑕佸搷搴旀秷鎭殑綾誨彧闇浣跨敤 鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟閮界浉褰撶畝鍗曪紝鍙槸鍒涘緩鍜岄攢姣乄indows鐢誨埛錛岃繖涓敾鍒風敱鍙傛暟t_crBrushColor鍐沖畾棰滆壊銆傛帴鐫鏄秷鎭槧灝勯摼錛屽畠鍝嶅簲WM_ERASEBKGND娑堟伅錛屾渶鍚庣敱鍝嶅簲鍑芥暟OnEraseBkgnd()鐢ㄦ瀯閫犲嚱鏁板垱寤虹殑鐢誨埛濉厖紿楀彛鐨勮儗鏅傚湪OnEraseBkgnd()涓湁涓や歡浜嬮渶瑕佹敞鎰忥紝涓涓槸瀹冧嬌鐢ㄤ簡涓涓淳鐢熺殑紿楀彛綾葷殑鏂規硶錛堝嵆GetClientRect()錛夛紝鎴戜滑濡備綍鐭ラ亾媧劇敓綾諱腑鏈塆etClientRect()鏂規硶鍛紵濡傛灉媧劇敓綾諱腑娌℃湁榪欎釜鏂規硶鎴戜滑鐨勪唬鐮佷篃涓嶄細鏈変換浣曟姳鎬紝鐢辯紪璇戝櫒紜媧劇敓綾籘鏄粠CWindow媧劇敓鐨勩傚彟涓涓槸OnEraseBkgnd()娌℃湁灝嗘秷鎭弬鏁皐Param灞曞紑涓鴻澶囦笂涓嬫枃錛圖C錛夈傦紙WTL鏈緇堜細瑙e喅榪欎釜闂錛屾垜浠緢蹇氨鍙互鐪嬪埌錛屾垜淇濊瘉錛?br /> 瑕佸湪鎴戜滑鐨勭獥鍙d腑浣跨敤榪欎釜宓屽叆綾婚渶瑕佸仛涓や歡浜嬶細棣栧厛錛屽皢瀹冨姞鍏ュ埌緇ф壙鍒楄〃錛?/p>
鍏舵錛岄渶瑕丆MyWindow灝嗘秷鎭紶閫掔粰CPaintBkgnd錛屽氨鏄皢鍏墮摼鍏ュ埌娑堟伅鏄犲皠閾撅紝鍦–MyWindow鐨勬秷鎭槧灝勯摼涓姞鍏HAIN_MSG_MAP瀹忥細 浠諱綍CMyWindow娌℃湁澶勭悊鐨勬秷鎭兘琚紶閫掔粰CPaintBkgnd銆傚簲璇ユ敞鎰忕殑鏄疻M_CLOSE錛學M_DESTROY鍜孖DC_ABOUT娑堟伅灝嗕笉浼氫紶閫掞紝鍥犱負榪欎簺娑堟伅涓鏃﹁澶勭悊娑堟伅鏄犲皠閾劇殑鏌ユ壘灝變細涓銆備嬌鐢╰ypedef鏄繀瑕佸湴錛屽洜涓哄畯鏄澶勭悊瀹忥紝鍙兘鏈変竴涓弬鏁幫紝濡傛灉鎴戜滑灝咰PaintBkgnd<CMyWindow, RGB(0,0,255)>浣滀負鍙傛暟浼犻掞紝閭d釜鈥?鈥濅細浣塊澶勭悊鍣ㄨ涓烘垜浠嬌鐢ㄤ簡澶氫釜鍙傛暟銆?/p>
浣犲彲浠ュ湪緇ф壙鍒楄〃涓嬌鐢ㄥ涓祵鍏ョ被錛屾瘡涓涓祵鍏ョ被浣跨敤涓涓狢HAIN_MSG_MAP瀹忥紝榪欐牱娑堟伅鏄犲皠閾懼氨浼氬皢娑堟伅浼犻掔粰瀹冦傝繖涓嶮FC涓嶅悓錛孧FC鍦癈Wnd媧劇敓綾誨彧鑳芥湁涓涓熀綾伙紝MFC鑷姩灝嗘秷鎭紶閫掔粰鍩虹被銆?/p>
ATL紼嬪簭鐨勭粨鏋?/b>
鍒扮洰鍓嶄負姝㈡垜浠凡緇忔湁浜嗕竴涓畬鏁村湴涓葷獥鍙g被錛堝嵆浣夸笉瀹屽叏鏈夌敤錛夛紝璁╂垜浠湅鐪嬪浣曞湪紼嬪簭涓嬌鐢ㄥ畠銆備竴涓狝TL紼嬪簭鍖呭惈涓涓狢ComModule綾誨瀷鐨勫叏灞鍙橀噺_Module錛岃繖鍜孧FC鐨勭▼搴忛兘鏈変竴涓狢WinApp綾誨瀷鐨勫叏灞鍙橀噺theApp鏈変簺綾諱技錛屽敮涓涓嶅悓鐨勬槸鍦ˋTL涓繖涓彉閲忓繀欏誨懡鍚嶄負_Module銆?/p>
涓嬮潰鏄痵tdafx.h鏂囦歡鐨勫紑濮嬮儴鍒嗭細 atlbase.h宸茬粡鍖呭惈鏈鍩烘湰鐨刉indow緙栫▼鐨勫ご鏂囦歡錛屾墍浠ユ垜浠笉闇瑕佸湪鍖呭惈windows.h錛宼char.h涔嬬被鐨勫ご鏂囦歡銆傚湪CPP鏂囦歡涓0鏄庝簡_Module鍙橀噺錛?/p>
CComModule鍚湁紼嬪簭鐨勫垵濮嬪寲鍜屽叧闂嚱鏁幫紝闇瑕佸湪WinMain()涓樉紺虹殑璋冪敤錛岃鎴戜滑浠庤繖閲屽紑濮嬶細 Init()鐨勭涓涓弬鏁板彧鏈塁OM鐨勬湇鍔$▼搴忔墠鏈夌敤錛岀敱浜庢垜浠殑EXE涓嶅惈鏈塁OM瀵硅薄錛屾垜浠彧闇灝哊ULL浼犻掔粰Init()灝辮浜嗐侫TL涓嶆彁渚涜嚜宸辯殑WinMain()鍜岀被浼糓FC鐨勬秷鎭車錛屾墍浠ユ垜浠渶瑕佸垱寤篊MyWindow瀵硅薄騫舵坊鍔犳秷鎭車鎵嶈兘浣挎垜浠殑紼嬪簭榪愯銆?br /> 涓婇潰鐨勪唬鐮佸敮涓闇瑕佽鏄庣殑鏄疌Window::rcDefault錛岃繖鏄疌Window涓殑鎴愬憳錛堥潤鎬佹暟鎹垚鍛橈級錛屾暟鎹被鍨嬫槸RECT銆傚拰璋冪敤CreateWindow() API鏃朵嬌鐢–W_USEDEFAULT鎸囧畾紿楀彛鐨勫搴﹀拰楂樺害涓鏍鳳紝ATL浣跨敤rcDefault浣滀負紿楀彛鐨勬渶鍒濆ぇ灝忋?/p>
鍦ˋTL浠g爜鍐呴儴錛孉TL浣跨敤浜嗕竴浜涚被浼兼眹緙栬璦鐨勯瓟娉曞皢涓葷獥鍙g殑鍙ユ焺涓庣浉搴旂殑CMyWindow瀵硅薄鑱旂郴璧鋒潵錛屽湪澶栭儴鐪嬫潵灝辨槸鍙互姣棤闂鐨勫湪綰跨▼涔嬮棿浼犻扖Window瀵硅薄錛岃孧FC鐨凜Wnd鍗翠笉鑳借繖鏍蜂綔銆?/p>
榪欏氨鏄垜浠殑紿楀彛錛?/p>
鎴戝緱鎵胯榪欑‘瀹炴病鏈変粈涔堟縺鍔ㄤ漢蹇冪殑鍦版柟銆傛垜浠皢娣誨姞涓涓狝bout鑿滃崟騫舵樉紺轟竴涓璇濇錛屼富瑕佹槸涓哄畠澧炲姞涓浜涙儏瓚c?/p>
ATL涓殑瀵硅瘽妗?/b>
鎴戜滑鍓嶉潰鎻愬埌榪囷紝ATL鏈変袱涓璇濇綾伙紝鎴戜滑鐨凙bout瀵硅瘽妗嗕嬌鐢–DialogImpl銆傜敓鎴愪竴涓柊瀵硅瘽妗嗗拰鐢熸垚涓涓富紿楀彛鍑犱箮涓鏍鳳紝鍙湁涓ょ偣涓嶅悓錛?br /> 鐜板湪寮濮嬩負About瀵硅瘽妗嗗畾涔変竴涓柊綾伙細 ATL娌℃湁鍦ㄥ唴閮ㄥ疄鐜板鈥淥K鈥濆拰鈥淐ancel鈥濅袱涓寜閽殑鍝嶅簲澶勭悊錛屾墍浠ユ垜浠渶瑕佽嚜宸辨坊鍔犺繖浜涗唬鐮侊紝濡傛灉鐢ㄦ埛鐢ㄩ紶鏍囩偣鍑繪爣棰樻爮鐨勫叧闂寜閽紝WM_CLOSE鐨勫搷搴斿嚱鏁板氨浼氳璋冪敤銆傛垜浠繕闇瑕佸鐞哤M_INITDIALOG娑堟伅錛岃繖鏍鋒垜浠氨鑳藉鍦ㄥ璇濇鍑虹幇鏃舵紜殑璁劇疆閿洏鐒︾偣錛屼笅闈㈡槸瀹屾暣鐨勭被瀹氫箟鍜屾秷鎭搷搴斿嚱鏁般?/p>
鎴戜嬌鐢ㄤ竴涓秷鎭搷搴斿嚱鏁板悓鏃跺鐞嗏淥K鈥濆拰鈥淐ancel鈥濅袱涓寜閽殑WM_COMMAND娑堟伅錛屽洜涓哄懡浠ゅ搷搴斿嚱鏁扮殑wID鍙傛暟灝卞凡緇忔寚鏄庝簡娑堟伅鏄潵鑷淥K鈥濇寜閽繕鏄潵鑷淐ancel鈥濇寜閽?/p>
鏄劇ず瀵硅瘽妗嗙殑鏂規硶涓嶮FC鐩鎬技錛屽垱寤轟竴涓柊瀵硅瘽妗嗙被鐨勫疄渚嬶紝鐒跺悗璋冪敤DoModal()鏂規硶銆傜幇鍦ㄦ垜浠繑鍥炰富紿楀彛錛屾坊鍔犱竴涓甫鏈堿bout鑿滃崟欏圭殑鑿滃崟鐢ㄦ潵鏄劇ず鎴戜滑鐨勫璇濇錛岃繖闇瑕佸啀娣誨姞涓や釜娑堟伅鍝嶅簲鍑芥暟錛屼竴涓槸鍝嶅簲 鍦ㄦ寚瀹氬璇濇鐨勭埗紿楀彛鐨勬柟寮忎笂鏈変簺涓嶅悓錛孧FC鏄氳繃鏋勯犲嚱鏁板皢鐖剁獥鍙g殑鎸囬拡浼犻掔粰瀵硅瘽妗嗚屽湪ATL涓槸灝嗙埗紿楀彛鐨勬寚閽堜綔涓篋oModal()鏂規硶鐨勭涓涓弬鏁頒紶閫掔粰瀵硅瘽妗嗙殑錛屽鏋滆薄涓婇潰鐨勪唬鐮佷竴鏍鋒病鏈夋寚瀹氱埗紿楀彛錛孉TL浼氫嬌鐢?code>GetActiveWindow()寰楀埌鐨勭獥鍙o紙涔熷氨鏄垜浠殑涓繪鏋剁獥鍙o級浣滀負瀵硅瘽妗嗙殑鐖剁獥鍙c?/p>
瀵筁oadMenu()鏂規硶鐨勮皟鐢ㄥ睍紺轟簡CComModule鐨勫彟涓涓柟娉曪紞GetResourceInstance()錛屽畠榪斿洖浣犵殑EXE鐨凥INSTANCE瀹炰緥錛屽拰MFC鐨凙fxGetResourceHandle()鏂規硶鐩鎬技銆傦紙褰撶劧榪樻湁CComModule::GetModuleInstance()錛屽畠鐩稿綋浜嶮FC鐨凙fxGetInstanceHandle()銆傦級 榪欏氨鏄富紿楀彛鍜屽璇濇鐨勬樉紺烘晥鏋滐細
鎴戜細緇х畫璁瞁TL鐨勶紝鍙槸浼氬湪絎簩閮ㄥ垎銆傛垜瑙夊緱鏃㈢劧榪欎簺鏂囩珷鏄啓緇欎嬌鐢∕FC鐨勫紑鍙戣呯殑錛屾墍浠ユ湁蹇呰鍦ㄦ姇鍏TL涔嬪墠鍏堜粙緇嶄竴浜汚TL銆傚鏋滀綘鏄涓嬈℃帴瑙﹀埌ATL錛岄偅鐜板湪浣犲氨鍙互灝濊瘯鍐欎竴浜涘皬紼嬪簭錛屽鐞嗘秷鎭拰浣跨敤宓屽叆綾伙紝浣犱篃鍙互灝濊瘯鐢ㄧ被鍚戝鏀寔娑堟伅鏄犲皠閾撅紝浣垮畠鑳藉鑷姩娣誨姞娑堟伅鍝嶅簲銆傜幇鍦ㄥ氨寮濮嬶紝鍙抽敭鍗曞嚮CMyWindow欏癸紝鍦ㄥ脊鍑虹殑涓婁笅鏂囪彍鍗曚腑鍗曞嚮鈥?i>Add Windows Message Handler鈥濊彍鍗曢」銆?/p>
鍦ㄧ浜岄儴鍒嗭紝鎴戝皢鍏ㄩ潰浠嬬粛鍩烘湰鐨刉TL紿楀彛綾誨拰涓涓洿濂界殑娑堟伅鏄犲皠瀹忋?/p>
class CMyWnd : public CWindowImpl<CMyWnd>
{
...
};
template <class T>
class B1
{
public:
void SayHi()
{
T* pT = static_cast<T*>(this); // HUH?? 鎴戝皢鍦ㄤ笅闈㈣В閲?
pT->PrintClassName();
}
protected:
void PrintClassName() { cout << "This is B1"; }
};
class D1 : public B1<D1>
{
// No overridden functions at all
};
class D2 : public B1<D2>
{
protected:
void PrintClassName() { cout << "This is D2"; }
};
main()
{
D1 d1;
D2 d2;
d1.SayHi(); // prints "This is B1"
d2.SayHi(); // prints "This is D2"
}
class D3 : public B1<D2>
void B1<D1>::SayHi()
{
D1* pT = static_cast<D1*>(this);
pT->PrintClassName();
}
void B1<D2>::SayHi()
{
D2* pT = static_cast<D2*>(this);
pT->PrintClassName();
}
class CMyWindow : public CWindowImpl<CMyWindow>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"))
};
class CMyWindow : public CWindowImpl<CMyWindow>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"))
BEGIN_MSG_MAP(CMyWindow)
END_MSG_MAP()
};
typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,WS_EX_APPWINDOW> CMyWindowTraits;
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CMyWindowTraits>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"))
BEGIN_MSG_MAP(CMyWindow)
END_MSG_MAP()
};
typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
濉啓娑堟伅鏄犲皠閾?/b>
WS_EX_APPWINDOW | WS_EX_WINDOWEDGE> CFrameWinTraits;class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"))
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
END_MSG_MAP()
LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
DestroyWindow();
return 0;
}
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PostQuitMessage(0);
return 0;
}
};
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"))
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
COMMAND_ID_HANDLER(IDC_ABOUT, OnAbout)
END_MSG_MAP()
LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
DestroyWindow();
return 0;
}
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PostQuitMessage(0);
return 0;
}
LRESULT OnAbout(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
MessageBox ( _T("Sample ATL window"), _T("About MyWindow") );
return 0;
}
};
WM_ERASEBKGND娑堟伅鏉ョ敾紿楀彛鐨勮儗鏅?/p>
template <class T, COLORREF t_crBrushColor>
class CPaintBkgnd : public CMessageMap
{
public:
CPaintBkgnd() { m_hbrBkgnd = CreateSolidBrush(t_crBrushColor); }
~CPaintBkgnd() { DeleteObject ( m_hbrBkgnd ); }
BEGIN_MSG_MAP(CPaintBkgnd)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
END_MSG_MAP()
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
T* pT = static_cast<T*>(this);
HDC dc = (HDC) wParam;
RECT rcClient;
pT->GetClientRect ( &rcClient );
FillRect ( dc, &rcClient, m_hbrBkgnd );
return 1; // we painted the background
}
protected:
HBRUSH m_hbrBkgnd;
};
BEGIN_MSG_MAP瀹忓氨瓚沖浜嗭紝鎵浠ヤ綘鍙兘鐪嬪埌鍏朵粬鐨勪竴浜涘祵鍏ョ被鐨勪緥瀛愪唬鐮侊紝瀹冧滑騫朵笉鏄粠璇ュ熀綾繪淳鐢熺殑銆?/p>
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>,
public CPaintBkgnd<CMyWindow, RGB(0,0,255)>
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>,
public CPaintBkgnd<CMyWindow, RGB(0,0,255)>
{
...
typedef CPaintBkgnd<CMyWindow, RGB(0,0,255)> CPaintBkgndBase;
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
COMMAND_HANDLER(IDC_ABOUT, OnAbout)
CHAIN_MSG_MAP(CPaintBkgndBase)
END_MSG_MAP()
...
};
// stdafx.h:
#define STRICT
#define VC_EXTRALEAN
#include <atlbase.h> // 鍩烘湰鐨凙TL綾?
extern CComModule _Module; // 鍏ㄥ眬_Module
#include <atlwin.h> // ATL紿楀彛綾?/span>
// main.cpp:
CComModule _Module;
// main.cpp:
CComModule _Module;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
LPSTR szCmdLine, int nCmdShow)
{
_Module.Init(NULL, hInst);
_Module.Term();
}
// main.cpp:
#include "MyWindow.h"
CComModule _Module;
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev,
LPSTR szCmdLine, int nCmdShow)
{
_Module.Init(NULL, hInst);
CMyWindow wndMain;
MSG msg;
// Create & show our main window
if ( NULL == wndMain.Create ( NULL, CWindow::rcDefault,
_T("My First ATL Window") ))
{
// Bad news, window creation failed
return 1;
}
wndMain.ShowWindow(nCmdShow);
wndMain.UpdateWindow();
// Run the message loop
while ( GetMessage(&msg, NULL, 0, 0) > 0 )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
_Module.Term();
return msg.wParam;
}
class CAboutDlg : public CDialogImpl<CAboutDlg>
{
public:
enum { IDD = IDD_ABOUT };
BEGIN_MSG_MAP(CAboutDlg)
END_MSG_MAP()
};
class CAboutDlg : public CDialogImpl<CAboutDlg>
{
public:
enum { IDD = IDD_ABOUT };
BEGIN_MSG_MAP(CAboutDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
COMMAND_ID_HANDLER(IDOK, OnOKCancel)
COMMAND_ID_HANDLER(IDCANCEL, OnOKCancel)
END_MSG_MAP()
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CenterWindow();
return TRUE; // let the system set the focus
}
LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
EndDialog(IDCANCEL);
return 0;
}
LRESULT OnOKCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
};
WM_CREATE錛屽彟涓涓槸鍝嶅簲鑿滃崟鐨処DC_ABOUT鍛戒護銆?/p>
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>,
public CPaintBkgnd<CMyWindow,RGB(0,0,255)>
{
public:
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
COMMAND_ID_HANDLER(IDC_ABOUT, OnAbout)
// ...
CHAIN_MSG_MAP(CPaintBkgndBase)
END_MSG_MAP()
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HMENU hmenu = LoadMenu ( _Module.GetResourceInstance(),
MAKEINTRESOURCE(IDR_MENU1) );
SetMenu ( hmenu );
return 0;
}
LRESULT OnAbout(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
// ...
};
浣犱細璇撮偅灝辯敤MFC鍚э紒
鏄殑錛屾垜涓鐩翠嬌鐢∕FC錛屼絾鎴戝MFC宸茬粡瓚婃潵瓚婂帉鍊︿簡銆傞檲鏃х殑綾誨簱浣垮緱瀹冩棤娉曟敮鎸佹搷浣滅郴緇熺殑鏂扮壒鎬?MFC鐨勭被搴撲粠4.21鐗堜箣鍚庡氨娌℃湁鏇存柊浜嗭紝鑰岄偅鏃舵槸1998騫達紝浜轟滑浣跨敤Windows 95鍜寃indows NT4)錛岃噧鑲跨殑娑堟伅鏄犲皠鏈哄埗鍜屼負浜嗗吋瀹規ц屼繚鐣欎笅鏉ョ殑浠g爜浣垮緱紼嬪簭鏁堢巼浣庝笅錛岄潰闈勘鍒扮殑妗嗘灦緇撴瀯浣垮緱鐢熸垚鐨勫簲鐢ㄧ▼搴忓簽澶у茍鍗犵敤榪囧鐨勭郴緇熻祫婧愩傚綋涓涓姛鑳界畝鍗曠殑紼嬪簭浣跨敤鍔ㄦ侀摼鎺ヤ篃瓚呰繃200K錛屽崰鐢?%-4%鐨勭郴緇熻祫婧愭椂錛屾垜鍐沖畾鏀懼純MFC錛屽鎵句竴涓柊鐨勫姛鑳界被浼肩殑綾誨簱銆傛垜鐮旂┒榪囧緢澶氱被浼肩殑浠g爜錛屼笉鏄繃浜庣畝鍗曪紝鏃犳硶鐢ㄤ簬搴旂敤紼嬪簭鐨勫紑鍙戝氨鏄己涔忎唬鐮佸拰鏂囨。鐨勬敮鎸併傚湪CodeProject涓婃湁涓涓悕涓篊lass鐨勭被搴擄紝鎴戜篃鐮旂┒榪囧畠鐨勪唬鐮侊紝鍏峰浜嗗熀鏈殑鐣岄潰妗嗘灦錛屽鎺т歡涔熸湁浜嗙畝鍗曠殑灝佽錛屼絾鏄笉瀹炵敤錛屽簽澶х殑铏氬嚱鏁版満鍒朵嬌寰楀璞¢潪甯歌噧鑲匡紝鏃犳硶鍑忓皯瀵硅祫婧愮殑鍗犵敤銆傛垜鐢氳嚦浠跨収MFC鍋氫簡涓涓畝鍗曠殑綾誨簱miniGUI錛屽艦鎴愪簡鍩烘湰鐨勬鏋惰В鍐蟲柟妗堬紝浣嗘槸鏈鍚庢斁寮冧簡錛屽師鍥犲緢綆鍗曪細鏃犳硶鐢ㄤ簬搴旂敤紼嬪簭鐨勫紑鍙戙備竴涓簲鐢ㄧ▼搴忕晫闈㈡鏋墮敊緇煎鏉傦紝瑕佽冭檻鐨勪簨鎯呭お澶氾紝寮鍙戣呬笉鍙兘鍦ㄥ簲鐢ㄧ▼搴忓拰鐣岄潰妗嗘灦涓ょ嚎浣滄垬銆傚氨鍦ㄦ垜鍗沖皢緇濇湜鐨勬椂鍊欙紝鎴戦亣鍒頒簡WTL銆?
鐢變簬宸ヤ綔鐨勯渶瑕佺粡甯稿紑鍙戜竴浜汣OM緇勪歡錛屽湪瑕佹眰涓嶈兘浣跨敤MFC鐨勫満鍚堝氨鏄敤ATL銆侫TL鎻愪緵浜嗗紿楀彛鐨勯潰鍚戝璞″湴灝佽鍜岀畝鍗曠殑娑堟伅鏄犲皠鏈哄埗錛屼絾鏄疉TL榪囦簬綆鍗曪紝鐢ㄥ畠寮鍙戝簲鐢ㄧ▼搴忓嚑涔庝笉鍙兘銆傝鎯寵ATL鍏峰鐣岄潰妗嗘灦瑙e喅鏂規鐨勫姛鑳借繕闇瑕佸仛寰堝浜嬫儏錛屽垢榪愮殑鏄疻TL灝卞仛浜嗚繖浜涗簨鎯呫俉TL鏄釜寰堝鐗圭殑涓滆タ錛屽畠鐢卞井杞叕鍙鎬竴緹ょ儹鎯呯殑紼嬪簭鍛樼淮鎶わ紝瀹冧粠鏈嚭鐜板湪寰蔣鐨勫畼鏂逛駭鍝佸悕鍗曚笂錛屼絾鍙互浠庡井杞殑瀹樻柟緗戠珯涓嬭澆鏈鏂扮殑WTL銆傚畠娌℃湁姝e紡鐨勬枃妗f敮鎸侊紝鐢╓TL鍋氬叧閿瓧鍦∕SDN涓绱㈠彧鑳藉緱鍒?涓粨鏋滐紝浣嗘槸鍏ㄤ笘鐣岀殑寮鍙戠綉绔欎笂閮芥湁閽堝WTL鐨勮璁虹粍鍜岄偖浠跺垪琛紝浠諱綍闂閮戒細寰楀埌鐑儏鐨勮В絳斻傛垜璁ょ湡鍦板姣斾簡MFC鍜學TL錛屽彂鐜頒簩鑰呮湁寰堝鐩擱氫箣澶勶紝MFC鐨勫姛鑳藉嚑涔庨兘鑳藉湪WTL涓疄鐜幫紝鍙槸鏂規硶涓嶅悓鑰屽凡銆傛垜鍑犱箮涓嶈垂鍚圭伆涔嬪姏灝卞皢浠ュ墠鍐欑殑涓涓狹FC紼嬪簭鐢╓TL鏀瑰啓浜嗭紝浣跨敤闈欐侀摼鎺ョ殑WTL紼嬪簭姣斾嬌鐢ㄥ姩鎬侀摼鎺ョ殑MFC紼嬪簭榪樿灝忥紝璧勬簮鍗犵敤鍙湁MFC紼嬪簭鐨勪竴鍗娿?
浣嗘槸涓鏃剁殑鐑儏涓嶈兘瑙e喅鏂囨。緙轟箯鐨勫洶鎵幫紝铏界劧緗戜笂鏈夊緢澶氫嬌鐢╓TL鐨勪緥瀛愬拰璇存槑鏂囩珷錛屽嚑涔庢妸MFC鑳藉疄鐜扮殑鍚勭紼濂囧彜鎬殑鏁堟灉閮藉疄鐜頒簡錛屼絾閮芥槸鍙涘【璇版璇句緧鐛懼獟楗╄Н顑g媹慰浣庤濺鍘濐個濞翠簾妯簱TL鐨勬枃绔犮傚氨鍦ㄨ繖涓椂鍊欐垜鐪嬪埌浜嗚繄鍏嬪皵.鏁?Michael Dunn)鐨勨淲TL for MFC Programmers鈥濈郴鍒楁枃绔狅紝鎴戠殑鎰熻鍜?995騫存垜絎竴嬈¤鍒癕SDN鏃朵竴鏍鳳紝鍑犱箮鏄揩涓嶅強寰呭湴灝嗗叾璇誨畬錛屽悓鏃朵篃钀屽彂浜嗗皢鍏剁炕璇戞垚姹夎鐨勫啿鍔ㄣ備簬鏄粰Michael鍐欎簡灝侀偖浠訛紝甯屾湜鑳藉寰楀埌鎺堟潈灝嗕粬鐨勬枃绔犵炕璇戞垚姹夎(浜嬪疄涓婂湪榪欎箣鍓嶆垜宸茬粡緲昏瘧浜嗕袱绔犱簡)銆傚湪寰楀埌鎺堟潈紜鍚庢墠鍙戠幇榪欎釜宸ヤ綔鏄涔堢殑鍥伴毦錛屼絾涓烘椂宸叉櫄錛屽彧鑳界‖鐫澶寸毊鎾戜笅鍘匯?
鐜板湪浠嬬粛涓涓嬭繄鍏嬪皵.鏁﹁繖涓漢銆傝繄鍏?Mike)浣忓湪闃沖厜鐏跨儌鐨勬礇鏉夌煻錛屾繁鍙楅偅閲屽ぉ姘旂殑瀹犵埍浣夸粬鎰挎剰涓鐩翠綇鍦ㄩ偅閲屻備粬鍦?騫寸駭鏃跺氨寮濮嬪湪Apple //e涓婄紪紼嬪簭錛?995騫翠粠UCLA (鍔犲埄紱忓凹浜氬ぇ瀛︽礇鏉夌煻鍒嗘牎)姣曚笟錛岃幏寰楁暟瀛﹀澹浣嶃傛瘯涓氬悗鍔犵洘璧涢棬閾佸厠(Symantec)鍏徃錛屾垚涓篘orton AntiVirus灝忕粍鐨勮川閲忚瘎浠峰伐紼嬪笀銆備粬鍑犱箮鏄嚜瀛︿簡Windows鍜孧FC緙栫▼錛?999騫翠粬涓篘orton AntiVirus 2000璁捐騫剁紪鍐欎簡鏂扮殑鐣岄潰銆傝繄鍏嬬幇鍦ㄦ槸pressplay(涓嶄箙鎴愪負Napster) 鐨勫紑鍙戜漢鍛樸備粬鏈榪戝紑鍙戜簡涓涓狪E鐨勫伐鍏鋒潯鎻掍歡UltraBar 錛屽彲浠ヨ交鏉懼疄鐜扮箒鐞愮殑緗戠粶鎼滅儲鍔熻兘銆備粬榪樺拰鍒漢鍚堜綔鍒涘姙浜嗕竴瀹惰蔣浠跺紑鍙戝叕鍙革細Zabersoft 錛岃鍏徃鍦ㄦ礇鏉夌煻鍜屾鐧昏禌(涓歸害)閮借鏈夊姙浜嬪銆傝繄鍏嬪枩嬈㈢帺寮圭悆鍜岄獞鑷杞︼紝鍋跺皵涔熺帺涓涓婸layStation錛屼粬榪樹竴鐩村潥鎸佸涔犳硶璇紝瀹樻柟姹夎鍜屾棩璇?
鍙﹀闇瑕佽鏄庡緱鏄垜緲昏瘧鈥淲TL for MFC Programmers鈥濈郴鍒楁枃绔犱笉鏄負浜嗚幏寰椾換浣曞埄鐩婏紝鍙槸鎯充負澶у鎻愪緵涓浜涙柊鐨勬濊礬銆傚鏋滀綘鏄疢FC鐨勫潥瀹氭崓鍗咃紝鐪嬪埌榪欓噷浣犲氨鍙互鍋滀笅鏉ヤ簡錛屽啀鐪嬩笅鍘繪槸嫻垂浣犵殑鏃墮棿(甯屾湜浣犵湅浜嗗墠闈㈠嚑孌墊枃瀛楄繕鑳芥尯浣忎笉瑕佸憰鍚?銆傚鏋滀綘鏄釜瀵瑰彟綾諱簨鐗╁厖婊$儹鎯呯殑紼嬪簭鍛橈紝浣犱笉鑳戒笉鐮旂┒WTL錛屽畠鐪熺殑鏄竴搴у疂钘忔渶鍚庣敤鎴戠殑鏈嬪弸瀵規垜鐨勭炕璇戞枃绔犵殑璇勪環鏉ョ粨鏉熲淲TL for MFC Programmers鈥濅腑鏂囩増鐨勫簭璦錛氱炕璇戞按騫沖拰浣犵敤鐨勯紶鏍囦竴鏍風儌錛?br />
]]>