锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 澹版槑錛?/P>
鏈漢鏈榪戜篃鍦ㄧ湅瀛欒佸笀鐨勮棰戯紝涓轟簡鍔犲己鐞嗚В錛屾墍浠ユ兂涓浜涜涔︾瑪璁般備絾鏄湪CSDN涓婁竴鎼滅儲錛屽彂鐜板凡緇忔湁鏈嬪弸鍋氫簡鐩稿叧絎旇銆傛牴鎹潰鍚戝璞$殑鈥滅戶鎵庫濊鐐癸紝涓轟簡瑙e喅鍔沖姩鍔涳紝鎵浠ユ垜鎵撶畻鍦ㄤ粬浠殑鍩虹涓婃坊鍔犮佷慨鏀廣傚簲璇ヤ笉娑夊強钁椾綔鏉冧粈涔堢殑涓滀笢鍚э紵錛?/P>
鎴戝湪BLOG.CSDN.NET/LEWISLAU涓婃悳绱簡涓?nbsp;錛屾湁涓や綅鏈嬪啓浜嗙浉鍏崇瑪璁幫紙鑰屼笖閮芥槸涓鏍風殑錛夈備笉鐭ラ亾璋佹墠鏄師浣滆咃紝鎵浠ュ垪鍑轟袱浣岯LOG鍦板潃錛?/P>
http://blog.csdn.net/hhitjsj021 http://blog.csdn.net/d007879 浠ュ悗鎴戜細鍦ㄥ墠杈堢殑鍩虹涓婁慨鏀廣佸彂鏂囷紒鍛靛懙錛佺戶鎵垮槢錛?/P>
windows紼嬪簭璁捐鏄浜嬩歡椹卞姩鏂瑰紡鐨勭▼搴忚璁★紝涓昏鍩轟簬娑堟伅鐨勩傚綋鐢ㄦ埛闇瑕佸畬鎴愭煇縐嶅姛鑳芥椂錛岄渶瑕佽皟鐢∣S鏌愮鏀寔錛岀劧鍚嶰S灝嗙敤鎴風殑闇瑕佸寘瑁呮垚娑堟伅錛屽茍鎶曞叆鍒版秷鎭槦鍒椾腑錛屾渶鍚庡簲鐢ㄧ▼搴忎粠娑堟伅闃熷垪涓彇璧版秷鎭茍榪涜鍝嶅簲銆?/P>
MSG Structure -------------------------------------------------------------------------------- The MSG structure contains message information from a thread's message queue. Syntax typedef struct { 鍙ユ焺錛岃祫婧愮殑鏍囪瘑錛屾搷浣滅郴緇熼氳繃鍙ユ焺鎸囧埌璧勬簮銆傚父瑙佺殑鍙ユ焺鏈夊浘鏍囧彞鏌勶紙HICON錛夛紝鍏夋爣鍙ユ焺錛圚CURSOR錛夛紝紿楀彛鍙ユ焺錛圚WND錛夛紝搴旂敤紼嬪簭鍙ユ焺錛圚INSTANCE錛?BR> 浣跨敤VC緙栫▼闄や簡鑹ソ鐨凜鍩虹澶栬繕闇瑕佹帉鎻′袱鏂歸潰錛?BR>涓錛屾秷鎭湰韜備笉鍚屾秷鎭墍浠h〃鐨勭敤鎴鋒搷浣滃拰搴旂敤紼嬪簭鐨勭姸鎬併?BR>浜岋紝瀵逛簬鏌愪釜鐗瑰畾鐨勬秷鎭潵璇達紝瑕佽OS鎵ц鏌愪釜鐗瑰畾鐨勫姛鑳藉幓鍝嶅簲娑堟伅銆?/P>
鍒涘緩涓涓畬鏁寸殑紿楀彛闇瑕佺粡榪囦笅闈㈠洓涓搷浣滄楠わ細 Windows鎻愪緵鐨勭獥鍙g被錛?BR>typedef struct WNDCLASS { HICON鍙互鐢盠oadIcon 璧嬪鹼紙瀹冩湁涓や釜鍙傛暟HINSTANCE鍜孡PCTSTR錛岄氬父絎竴涓弬鏁頒負絀猴紝鍙絎簩涓弬鏁拌祴鍊鹼紝鍗沖浘鏍囩殑ID錛?BR>HCURSOR鍚孒ICON 紿楀彛綾繪敞鍐岋細 BOOL GetMessage( 鍥炶皟鍘熺悊錛氬綋搴旂敤紼嬪簭鍙楀埌緇欐煇涓獥鍙g殑娑堟伅鏃訛紝灝卞簲璋冪敤鏌愪竴鍑芥暟鏉ュ鐞嗚繖鏉℃秷鎭傝繖涓娑堟伅鏈夋搷浣滅郴緇熻嚜鍔ㄥ畬鎴愩?/P>
娉細鍑芥暟鍚嶅彲浠ョ敤浠ヨ〃紺哄嚱鏁頒唬鐮佺殑棣栧湴鍧錛堝嚱鏁版寚閽堬級錛岄澶栨暟鎹氬父涓?銆?/P>
棰樿錛氬墠鍑犲ぉ鍑哄幓鎰熷彈涓涓嬶紝鎰熻Е棰囨繁錛屽彂瑙夎嚜宸辯湡鐨勫緢閫娿傜幇鍦ㄥ洖鍒版竻闈欑殑鏍″洯錛岃嚜宸辮寰楀簲璇ユ洿鍔犲姫鍔涖傜ぞ浼氱湡鐨勪笉鏄垜浠兂鐨勯偅鏍鳳紝宸ヤ綔涔熶笉鍍忓涔犱竴鏍瘋交鏉俱傚彧甯屾湜鍚勪綅鏈嬪弸鍦ㄨ蛋鍑烘牎闂紝榪堝悜紺句細鐨勮繃紼嬩腑錛屼竴鍒囬『鍒╋紒 鍦ㄦ垚閮藉緟浜嗕竴涓槦鏈燂紝紜垏鐨勮鍙湁鍏ぉ銆傚湪榪欏叚澶╅噷闈紝鎴戝畬瀹屽叏鍏ㄦ槸涓涓墦宸ョ殑錛屼竴涓ぞ浼氫笂鐨勪漢錛屼竴涓▼搴忓憳銆傚惉涓婂幓澶氱墰B錛岀▼搴忓憳鍟婏紝榪欎釜鍙槸鎴戞ⅵ瀵愪互姹傜殑鑱屼笟鍟婏紝鍙槸浜嬪疄涓婁竴鍒囬兘涓嶆槸鎴戞兂鐨勯偅鏍瘋緣鐓屻傛垜榪欏嚑澶╄剳嫻烽噷鍙嶅嫻幇涓鍙ヨ瘽錛岀▼搴忓憳鐨勭殑紜‘鏄崄鍒嗚緵鑻︾殑鑱屼笟銆?BR> 鎴戞墍鍦ㄧ殑鍏徃鏄竴瀹舵父鎴忓鎸傚叕鍙革紝涓撻棬鍋氭父鎴忓鎸傘備粠紺句細鐨勮搴︽潵璇達紝榪欑鈥滃嬀鎼濆彧鑳芥殫綆辨搷浣滐紝濡備粖鍗磋繕鏄庣洰寮犺儐鐨勨滃紑寮犺惀涓氣濓紝紜疄鎼炵瑧錛涗粠鎶鏈殑瑙掑害鏉ヨ錛屾父鎴忓鎸傦紝鍒╃敤HOOK鎷︽埅鏁版嵁鍖呫佽В瀵嗐佷慨鏀廣佸皝鍖咃紝鏍鋒牱閮芥槸瀹夊叏鏂歸潰鐨勬瘮杈冪墰B鐨勬妧鏈紝鍦ㄦ病鏈夎繘榪欎釜鍏徃涔嬪墠錛屾垜娌℃湁鎯寵繃涓騫翠互鍐呬細鎺ヨЕ鍒拌繖浜涘簳灞傜殑鎶鏈傛墍鏈夎鍏徃瀵規垜鏉ヨ錛屾湁浜涘け鏈涖佷絾鏄篃鏈変竴浜涙湡鏈涖?BR> 浠ュ墠鍦ㄧ壞闃籌紙瀹朵埂錛夌殑涓浜涘皬IT鍏徃涔熺帺鍎胯繃錛屼絾鏄繖嬈℃槸鐙嚜鍦ㄥ錛屼粈涔堥棶棰橀兘瑕佽嚜宸辮В鍐籌紝鎵鏈変粠鍚勪釜鏂歸潰鏉ヨ錛岄兘鏄嚜宸辯殑涓浜涙柊鐨勫皾璇曘備笉榪囪繕濂界殑鏄紝榪欐鎴戞槸鍜屾湅鍙嬩竴鍒囧幓鎴愰兘鈥滃疄涔犫濄傚懙鍛碉紝涓嶈繃鎴戞瘮浠栧ソ鐨勫氨鏄紝浠栧湪鐢典俊璁捐瑙勫垝闄㈠疄涔犱笁涓湀錛屾病鏈夊疄涔犲伐璧勶紝涓変釜鏈堣漿姝o紱鑰屾垜瀹炰範涓涓湀瀹炰範宸ヨ祫涓鍗冿紝涓涓湀鍚庤漿姝o紝鏍規嵁鎯呭喌鑰屽畾宸ヨ祫錛岃〃鐜扮殑濂界殑璇濆湪3K宸﹀彸錛堝惉涓婂幓鎸哄惛寮曚漢鐨勶紝浣嗘槸鐪熺殑寰堢瘡錛夈?BR> 鎴戜滑鍒版垚閮藉彧鐢ㄤ簡2涓皬鏃舵壘浜嗕竴澶勪綇鎴匡紝鍚堢錛?50涓鏈堬紝鍙湁涓寮犲簥鍜屼竴涓功妗岋紙澶╁暒錛屾垚閮界殑鎴夸環鐪烼MD鐨勫悡姝諱漢錛夈傚敮涓姣旇緝嬈f叞鐨勬槸鎴戜滑浣忓湪宸濆ぇ澶栭潰錛屾琛屽埌宸濆ぇ鍙5鍒嗛挓錛屽師鍏堣鎯崇殑鏄瘡澶╀笅鐝幓宸濆ぇ鏁欏鍘諱笂鑷範錛屽彲鏄幇瀹炲線寰涓庤鎯蟲湁寰堝ぇ鐨勫樊璺濓紝姣忓ぉ鍥炲埌瀹剁瘡鐨勭畝鐩翠功閮戒笉鎯崇湅銆傦紙鐧藉ぉ鍦ㄥ叕鍙歌嚦灝戠湅6涓皬鏃朵互涓婄殑鏂囨。錛屽榪欓偅涓?5瀵哥殑CRT錛屾垜綆鐩翠竾鍒嗙殑涓嶇埥錛屽叕鍙擱噷闈?0澶氫漢灝辨垜涓涓敤CRT鏄劇ず鍣紝鎴戦潬錛屾璐熸垜錛燂紵錛侊級姣忔櫄鍜屾湅鍙嬪湪宸濆ぇ杞偁涓ゅ湀灝卞洖鍘葷潯瑙夛紝榪欑鐢熸椿錛岃鎴戝洖蹇嗚搗涓ゅ瞾鐨勬椂鍊欏閲岃繕涓嶆櫙姘旂殑鐘舵併傛睏錛?BR> 璦褰掓杞紝榪樻槸璇村伐浣滅殑浜嬪効錛屾瘡澶╂垜7錛?0璧峰簥錛岃В鍐沖畬鎵鏈夐棶棰樺ぇ綰?錛?0鍒拌揪杞︾珯錛屾惌涓?9璺紝欏哄埄鐨勮瘽8錛?5浣滅敤鑳藉埌杈鵑珮鍗囨ˉ錛堝叕鍙告墍鍦ㄥ湴錛夛紝鍞夛紝涓嶇姹楅錛屾瘡澶╄鐧界櫧嫻垂澶х害90鍒嗛挓鏃墮棿鎼濺錛屽湪鎴愰兘浜虹湅鏉ワ紝榪欒繕綆楄繎鐨勶紙澶у煄甯傜殑鏄瘮鎴戜滑榪欎簺鍐滄皯媧嬬洏錛夈?鐐瑰乏鍙沖埌杈懼叕鍙革紝涓嶅嚭鎰忓鐨勮瘽鍙湁鎴戞梺杈圭殑浠佸厔姣旀垜鏃╁埌銆傦紙鍏徃鑰佸ぇ鑰冭檻鎶鏈儴緇忓父鍔犵彮錛屾墍浠ュ厑璁告妧鏈儴鐨勫厔寮熶滑9錛?0涓婄彮錛岃繖涓繕澶熶漢鎬у寲銆傦級榪欎綅浠佸厔寰呬細瑕侀噸鐐逛粙緇嶏紝鍏徃閲岄潰灝辮窡浠栨販鐨勬渶鐔燂紝鐗圭墰B銆傝鍒板姞鐝紝鎴戠獊鐒舵兂璧鋒墠鍘誨叕鍙稿拰鎶鏈儴鑰佸ぇ璋堢殑鏃跺欙紝鑰佸ぇ鐗瑰埆浜や唬錛屸滃鏋滀綘鍔犵彮鐨勮瘽錛屾櫄涓婂彲浠ユ墦杞﹀洖瀹躲傛嬁涓婂皬紲紝絎簩澶╁洖鍏徃鎶ラ攢銆傗濇垜姹楋紝鍘熸潵榪欎釜鍏徃鍔犵彮灝辮窡鍠濇按涓鏍烽殢渚褲?BR> 鎴戞墠鍒板叕鍙革紝鎴戠殑宸ヤ綔灝辨槸涓嶅仠鐨勭湅鏂囨。錛屼腑鏂囩殑銆佽嫳鏂囩殑閮界湅銆傦紙鎴戦兘鎬鐤戞垜灞呯劧鑳界湅鎳傝嫳鏂囷級鑰佸ぇ緇欐垜鐨勪換鍔″緢綆鍗曪紝灝變竴鍙ヨ瘽錛氣滃埄鐢℉OOK鎶撳彇紼嬪簭鐨勬暟鎹寘銆傗濅粬榪樼壒鍒氦浠o紝鈥滀笉闇瑕佷綘瑙e瘑鏁版嵁鍖咃紝鎶撳彇灝卞彲浠モ濈湅涓婂幓闄嶄綆浜嗗緢澶ч毦搴﹀摝錛屼絾鏄湁涓や釜浜鴻兘璇佹槑榪欎釜鎴戣繖涓叕鍙鎬笉鏄垜鐜板湪鐨勬按騫寵兘澶熸帴鍙楃殑銆傜涓涓啹SIR錛屼粬璇磋繖涓笢瑗垮浜庢垜鏉ヨ錛岄潪甯擱潪甯稿叿鏈夋寫鎴橈紝甯屾湜鎴戣兘鍒涢犲榪廣傦紙姹楋紝濂囪抗錛侊級絎簩涓槸鏉嶴IR錛屽洖瀛︽牎鍚庢垜緇欎粬璁茶堪鎴戠殑鈥滀綔涓氣濓紝浠栬錛屽摝錛岃繖涓笢瑗垮拰鎴戝笀鍏勭爺絀剁敓鐨勬瘯涓氳璁″緢鍍忋傦紙鎴戝啀涓嬈℃睏棰滐級鎴戞壙璁よ嚜宸辯殑鍠滄鏈夋寫鎴樼殑宸ヤ綔錛屼絾鏄垜榪樻槸寰堟湁鑷煡涔嬫槑錛岀‘鍒囩殑璇存垜寰堣嚜閲忓姏銆?BR> 鎴戞瘡澶╃殑宸ヤ綔灝辨槸鐪嬫枃妗o紝鐪嬬殑鎴戣鐤紝HOOK灞炰簬WINDOWS鐨勬牳蹇冩妧鏈紝瓚嬩簬鎿嶄綔緋葷粺搴曞眰錛岀敤浜庢嫤鎴搷浣滅郴緇熷彂鍑虹殑娑堟伅銆傚浜庢垜鏉ヨ鍐充笉鏄畝鍗曠殑浜嬪効錛屾墍浠ヤ笉鏁㈡噲鎬狅紝鎴戞瘡澶╁氨GOOGLE,MSDN涓婃悳瀵誨叧浜庡畠鐨勪竴鍒囷紝涓枃鐨勮嫳鏂囩殑閮界湅錛岃鐤紒鐪嬬湅鎴戞梺杈圭殑瀹朵紮錛岀幇鍦ㄥ氨鏉ヨ璇翠粬錛屼粬鏄祴璇曢儴鐨勶紝浠栫殑宸ヤ綔灝辨槸涓嶅仠鐨勮嶅悇縐嶅悇鏍風殑娓告垙錛堝眳鐒惰嶆父鎴忕湡鐨勮兘鎵懼埌宸ヤ綔錛屾垜綆鐩翠負鎴戜滑瀛︽牎鐨勫厔寮熶滑鎰熷埌嬈f叞錛夛紝鏈夌殑鏃跺欑綉閫熸瘮杈冨崱錛屼粬娌℃硶鑰嶆父鎴忥紝灝卞彧鑳藉灞堜竴涓嬬湅灝忚錛岃繖鏍風殑宸ヤ綔璁╂垜緹℃厱鐨勪笉琛屻傚伓灝旂湅鍒頒粬鍐嶄笉鏂殑鎶勫綍鎴夸駭淇℃伅錛屽氨闂粬鏄惁瑕佷拱鎴褲備粬璇達紝鎭┿傛垜灝辯撼闂蜂簡錛岀湅涓婂幓騫寸邯杞昏交鐨勫氨鎯蟲埧瀛愶紝鍏徃鑰嶆父鎴忕殑闅句笉鎴愭嬁8K涓涓湀錛熺戶緇棶鍒幫紝鈥滀綘宸ヤ綔鍑犲勾浜嗗摝錛熼兘鏈夐挶涔版埧浜嗭紵鈥濃滄垜宸ヤ綔浜嗛兘浜斿勾浜嗭紝鎴戜竴涓湀1500錛屼竴騫村瓨涓嶅埌5000銆傞潬鑷繁鐨勮瘽閮戒笉鐭ラ亾浠涔堟椂鍊欐墠鑳戒拱鍝︺併傚叾瀹炴槸鎴戠埗姣嶇粰閽便傗濈粓浜庡彂鐜頒竴涓瘮鎴戣繕寮虹殑浜轟簡銆備簨鍚庯紝鎴戠粰鎴戠埜濡堟墦鐢佃瘽姹囨姤鎴戠殑榪戝喌錛岄棽鑱婂埌姝や簨鍎匡紝鍙惉鐢佃瘽閭h竟涓鐗囧瘋闈欙紝鎴戠埜鑰嶅彞鈥滀綘緇欐垜璇磋繖浜涳紝闅句笉鎴愪綘榪樿鎴戜滑緇欎綘鍑嗗閽變拱鎴垮瓙錛熲濓紙涓婂笣浣滆瘉錛屾垜緇濆娌¢偅涔堟兂錛夈?BR> 姣忓ぉ鍚冨崍楗ぇ綰﹀崐灝忔椂涓嶉潰瀵歸偅鍙伓鐨凜RT錛屽叾浣欐椂闂村氨閫冧笉榪囨旦鍔紝鐜板湪鐢ㄥ埌絎旇鏈槸鐖藉摝錛岃嚦灝戜笉鏄疌RT鐨勩傚叕鍙擱噷闈㈠熀鏈笂閮借鐜╁効娓告垙錛岃繕鏈変漢琚洍榪囧笎鍙楓傦紙鎴戜滑閮芥槸騫插湴涓嬬敓鎰忕殑錛岃繕琚漢瀹墮粦鍚冮粦錛燂紒錛夋垜灝辨兂錛屽啓涓湪椹浜庢垜浠叕鍙哥殑鍑犱釜楂樻墜鏉ヨ緇濆鏄皬鑿滀竴紕燂紝浣嗘槸鑷繁鐨勫笎鍙瘋鐩椾簡榪樻槸娌″姙娉曪紝璇翠笉瀹氬氨鏄嚜宸辯殑鏈ㄩ┈鐩楃殑鑷繁鐨勫笎鍙楓?BR> 鍏徃榪樻湁涓涓コ紼嬪簭鍛橈紝浣╂湇鍟娿備粖澶╀篃鏄笁鍏濂寵妭錛屽悜鐗汢鐨勫コ紼嬪簭鍛樿嚧鏁紒
瀛欓懌VC璁插駭絎旇--WINDOWS紼嬪簭鍐呴儴榪愯鍘熺悊
HWND hwnd; //鎸囩ず涓涓獥鍙g殑鍙ユ焺錛屾敼娑堟伅鍜岄偅涓獥鍙g浉鍏寵仈銆?BR> UINT message; //鍏蜂綋鐨勬秷鎭紝鐢ㄦ棤絎﹀彿鏁村艦琛ㄧず
WPARAM wParam; //鍏充簬娑堟伅鐨勯檮鍔犲弬鏁?BR> LPARAM lParam; //鍚屼笂
DWORD time; //32浣嶆暣鏁幫紝琛ㄧず娑堟伅琚姇閫掑嚭鍘葷殑鏃墮棿
POINT pt; //琛ㄧず鍏夋爣浣嶇疆
} MSG, *PMSG;
渚嬪錛氬綋鎸変笅鎸夐敭浼氬彂閫佸嚭WM_CHAR娑堟伅 閫氳繃娑堟伅鐨勯檮鍔犲弬鏁幫紝淇濆瓨瀵瑰簲鐨凙SCII鐮侊紝鍗沖彲鐭ラ亾鎸変笅鐨勬槸閭d釜閿?/P>
娑堟伅闃熷垪錛?BR>姣忎釜搴旂敤紼嬪簭OS閮戒負瀹冨緩绔嬩竴涓秷鎭槦鍒楋紝娑堟伅闃熷垪鏄釜鍏堣繘鍏堝嚭鐨勭紦鍐插尯錛屽叾涓瘡涓厓绱犻兘鏄竴涓秷鎭紝OS灝嗙敓鎴愮殑姣忎釜娑堟伅鎸夊厛鍚庨『搴忔斁榪涙秷鎭槦鍒椾腑錛屽簲鐢ㄧ▼搴忔繪槸鍙栬蛋褰撳墠娑堟伅闃熷垪涓殑絎竴鏉℃秷鎭紝搴旂敤紼嬪簭鍙栬蛋娑堟伅鍚庝究鐭ラ亾鐢ㄦ埛鐨勬搷浣滃拰紼嬪簭鐨勭姸鎬侊紝鐒跺悗瀵瑰叾澶勭悊鍗蟲秷鎭搷搴旓紝娑堟伅鍝嶅簲閫氳繃緙栫爜瀹炵幇銆?/P>
Window紼嬪簭鍏ュ彛錛?BR>int WINAPI WinMain(
HINSTANCE hInstance, // 褰撳墠浜嬩緥鍙ユ焺銆?BR> HINSTANCE hPrevInstance, // 鍏堝墠浜嬩緥鍙ユ焺銆?BR> LPSTR lpCmdLine, // 鍛戒護琛屾寚閽?BR> int nCmdShow // 錛堢獥鍙o級鏄劇ず鐨勭姸鎬?BR>);
璇存槑錛歐inMain鍑芥暟鏄疻indows紼嬪簭鍏ュ彛鐐瑰嚱鏁幫紝鐢監S璋冪敤錛屽綋OS鍚姩搴旂敤紼嬪簭鐨勬椂鍊欙紝winmain鍑芥暟鐨勫弬鏁扮敱OS浼犻掔殑銆?/P>
涓錛岃璁′竴涓獥鍙g被錛涘錛歐NDCLASS wndcls;
浜岋紝娉ㄥ唽紿楀彛綾伙紱 濡傦細RegisterClass(&wndcls);
涓夛紝鍒涘緩紿楀彛錛?nbsp; 濡傦細CreateWindow(),CreateWindowEX();
鍥涳紝鏄劇ず鍙婃洿鏂扮獥鍙c傚錛歋howWindow(),UpdateWindow();
璇存槑錛氬垱寤虹獥鍙g殑鏃跺欎竴瀹氳鍩轟簬宸茬粡娉ㄥ唽鐨勭獥鍙g被.
UINT style; //紿楀彛鐨勭被鍨?BR> WNDPROC lpfnWndProc; //紿楀彛榪囩▼鍑芥暟鎸囬拡錛堝洖璋冨嚱鏁幫級
int cbClsExtra; //紿楀彛綾婚檮鍔犲瓧鑺傦紝涓鴻綾葷獥鍙f墍鍏變韓銆傞氬父0銆?BR> int cbWndExtra; //紿楀彛闄勫姞瀛楄妭銆傞氬父璁句負0銆?BR> HANDLE hInstance; //褰撳墠搴旂敤紼嬪簭浜嬩緥鍙ユ焺銆?BR> HICON hIcon; //鍥炬爣鍙ユ焺 LoadIcon();
HCURSOR hCursor; //鍏夋爣鍙ユ焺 LoadCursor();
HBRUSH hbrBackground; //鐢誨埛鍙ユ焺 (HBRUSH)GetStockObject();
LPCTSTR lpszMenuName; //鑿滃崟鍚嶅瓧
LPCTSTR lpszClassName; //綾葷殑鍚嶅瓧
} WNDCLASS錛?PWNDCLASS;
紿楀彛綾誨瀷style涓轟竴涓彉閲忥紝璇ュ彉閲忔瘡涓浣嶅搴旂潃涓縐嶇壒鎬с傚搴斾負1鏃訛紝鏈夎縐嶇壒鎬э紱瀵瑰簲涓?鏃訛紝鏃犺縐嶇壒鎬с備負浜嗘柟渚胯蹇嗭紝鐢ㄤ竴浜涘畯瀵瑰簲涓浜涚壒寰侊紝閫氳繃鍙栧弽錛堬綖錛夊拰鐩鎬笌錛?amp;錛夊彲浠ュ彇娑堜竴浜涚壒鎬с?nbsp; 閫氬父璁劇疆涓?CS_HREDRAW | CS_VREDRAW"琛ㄧず鍨傜洿閲嶇粯鍜屾按騫抽噸緇樸?/P>
HBRUSH 浣跨敤GetStockObject鍑芥暟錛屽畠鍙互鐢ㄦ潵鑾峰彇絎斻佺敾鍒楓佸瓧絎︺佽皟璇曟澘鐨勭敾鍒楓備嬌鐢ㄦ椂瑕佺敤HBRUSH鍋氫竴鐩村己鍒惰漿鍖栥傚洜涓篏etStockObject榪斿洖鍊煎拰HBRUSH涓嶅悓銆?/P>
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // address of structure with class
// data
);
//娉ㄦ剰錛屾槸浣跨敤鍦板潃絎?/P>
鍒涘緩紿楀彛錛?BR>HWND CreateWindow(
LPCTSTR lpClassName, //娉ㄥ唽紿楀彛綾誨悕錛岀敤寮曞彿
LPCTSTR lpWindowName, //紿楀彛鏍囬錛岀敤寮曞彿
DWORD dwStyle, //紿楀彛綾誨瀷錛堥鏍鹼級閫氬父涓?WS_OVERLAPPEDWINDOW)
int x, // 紿楀彛X鍧愭爣
int y, // 紿楀彛X鍧愭爣
int nWidth, // 瀹藉害
int nHeight, // 楂樺害
HWND hWndParent, // 鎸囧悜鐖剁獥鍙g殑鍙ユ焺
HMENU hMenu, // 鑿滃崟鍙ユ焺
HANDLE hInstance, // 褰撳墠瀹炰緥鐨勫彞鏌勶紝鐢盬INMAIN浼犻?BR> LPVOID lpParam // WM_CREATE闄勫姞鍙傛暟浼犲叆鎸囬拡
);
鍒涘緩紿楀彛鐨勬椂鍊欎細鍙戦乄M_CREATE娑堟伅
鏄劇ず鍜屾洿鏂扮獥鍙g獥鍙o細
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state of window
);
BOOL UpdateWindow(
HWND hWnd // handle of window 閫佸嚭WM_PAINT娑堟伅
);
娑堟伅寰幆
MSG msg;
while(GetMessage(&msg,...)) //浠庢秷鎭槦鍒椾腑鍙栧嚭涓鏉℃秷鎭?BR>{
TranslateMessage(&msg); //榪涜娑堟伅錛堝閿洏娑堟伅錛夎漿鍖栥傝漿鍖栬繃紼嬩笉浼氬獎鍝嶅師娑堟伅錛屽彧浼氬垱寤烘柊鐨勬秷鎭?BR> DispatchMessage(&msg); //鍒嗘淳娑堟伅鍒扮獥鍙g殑鍥炶皟鍑芥暟澶勭悊,錛圤S璋冪敤紿楀彛鍥炶皟鍑芥暟榪涜澶勭悊錛夈?BR>}
LPMSG lpMsg, // 娑堟伅緇撴瀯浣撳彉閲?BR> HWND hWnd, // 鍙ユ焺錛岄偅涓竴涓獥鍙o紵涓篘ULL鍒欎負鎵鏈夌獥鍙e彞鏌?BR> UINT wMsgFilterMin, // 鏈灝忔秷鎭鹼紝涓?鏃惰繑鍥炴墍鏈夋秷鎭?BR> UINT wMsgFilterMax // 鏈澶ф秷鎭?BR>);
紿楀彛榪囩▼鍑芥暟錛堝洖璋冨嚱鏁幫級鍘熷瀷錛?BR>LRESULT CALLBACK WindowProc( //榪欓噷WindowProc鏄釜浠e彿鍚嶅瓧銆?BR> HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
璇存槑錛氫袱縐嶅嚱鏁拌皟鐢ㄧ害瀹氾紙__stdcall 鍜?__cdecl錛夛細
#define CALLBACK __stdcall
//__stdcall 鏍囧噯璋冪敤棰勫畾錛屾槸PASCAL 璋冪敤綰﹀畾錛岃薄DELPHI浣跨敤鐨勫氨鏄爣鍑嗚皟鐢ㄧ害瀹?BR>#define WINAPIV __cdecl
// __cdecl 鏄疌 璇█褰㈠紡鐨勮皟鐢ㄧ害瀹氥?BR>涓昏鍖哄埆錛氬嚱鏁板弬鏁頒紶閫掗『搴?鍜?瀵瑰爢鏍堢殑娓呴櫎涓娿?BR>闂錛氶櫎浜嗛偅浜涘彲鍙樺弬鏁扮殑鍑芥暟璋冪敤澶栵紝鍏朵綑鐨勪竴鑸兘鏄痏_stdcall綰﹀畾銆備絾 C/C++緙栬瘧榛樼劧鐨勬槸__cdecl綰﹀畾銆傛墍浠ュ鏋滃湪VC絳夌幆澧冧腑璋冪敤__stdcall綰﹀畾鐨勫嚱鏁幫紝蹇呴』瑕佸湪鍑芥暟澹版槑鐨勬椂鍔犱笂 __stdcall 淇グ絎︼紝浠ヤ究瀵硅繖涓嚱鏁扮殑璋冪敤鏄嬌鐢╛_stdcall綰﹀畾錛堝浣跨敤DELPHI緙栧啓鐨凞LL鏃跺欙級銆?BR>錛圴C涓彲閫氳繃榪欓斿緞淇敼錛歱roject|settings..|c/c++|...)
鍦ㄧ獥鍙h繃紼嬪嚱鏁頒腑閫氳繃涓緇剆witch璇彞鏉ュ娑堟伅榪涜澶勭悊錛?BR>濡傦細
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_PAINT:
...
break;
case ...
break;
case WM_CLOSE:
//DestroyWindow(hwnd);
//閿姣佺獥鍙o紝騫跺彂閫乄M_DESTROY娑堟伅銆?BR> break;
case WM_DESTROY:
//PostQuitMessage(0);
//鍙戦乄M_QUIT娑堟伅鍒版秷鎭槦鍒椾腑錛岃姹傜粓姝€?BR> //GetMessage()鍙栧埌WM_QUIT娑堟伅鍚庯紝榪斿洖0錛岄鍑烘秷鎭驚 // 鐜紝浠庤岀粓姝㈠簲鐢ㄧ▼搴忋?BR> break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
//鐢ㄧ己鐪佺殑紿楀彛榪囩▼澶勭悊鎴戜滑涓嶆劅鍏磋叮鐨勬秷鎭紙鍏跺畠娑堟伅錛夈?BR> //榪欐槸蹇呴』鐨勩?BR> }//switch
return 0;
}//WindowProc
鍝嶅簲WM_DESTROY錛岃皟鐢≒ostQuitMessage(int)緇撴潫榪涚▼銆傚畠浼氭姇閫掍竴涓猈M_QUIT娑堟伅瀵規秷鎭槦鍒椾腑銆傚綋娑堟伅寰幆鐨凣etMessage鍙栧埌WM_QUIT娑堟伅錛屽垯榪斿洖0錛岀▼搴忕粨鏉熴?BR> 鍙﹀瀵逛簬涓嶆劅鍏磋叮鐨勬秷鎭鏅薄緙虹渷鐨勫鐞嗭紝浣跨敤DefWindowProc錛堬級鍐呬負紿楀彛鐨勫弬鏁般?/P>
鍏充簬DC鍙ユ焺鑾峰彇錛?BR>a)浣跨敤BeginPaint(),EndPaint()瀵廣傛敞鎰忓彧鑳藉湪鍝嶅簲WM_PAINT娑堟伅鏃朵嬌鐢ㄣ?BR>b)浣跨敤GetDc(),ReleaseDC()瀵廣傛敞鎰忎粬浠笉鑳藉湪鍝嶅簲WM_PAINT涓嬌鐢?BR>
姣忓ぉ涓嬪崍鍏偣錛屽叾瀹為偅涓椂鍊欐垜閮藉彲浠ョ寮浜嗭紝浣嗘槸鎶鏈儴鎵鏈夊悓鍍氬姞鐝紙闄や簡鎴戯紝鍥犱負鎴戞槸鏂版潵鐨勶紝榪樺仛涓嶄簡浜嬪効銆傦級鎵浠ユ垜涔熶笉濂借蛋鐨勫お蹇紝鎱㈡參鑵捐吘鐨勭(鍒板叚鐐逛竴鍒繪墠紱誨紑鍏徃錛屽洖瀹跺挴銆?BR> 涓婇潰鎵鏈夎鏂囷紝涔熻浣犺繕娌℃劅瑙夊埌杈涜嫤錛屽洜涓烘湁浜涚粏鑺傜殑浜嬪効鍐嶈璇達細
鎴戞瘡澶╀笂鐝惌涔樺叕杞︼紝澶х害涓鍏辮绔?0鍒嗛挓錛岀粷瀵規湁灝戞棤澶氥備笂鐝繕濂斤紝浜哄茍涓嶅錛涙垜澶ф鎻忚堪涓嬫垜涓嬬彮鐨勬儏鍐碉紝鎴戠涓澶╀笅鐝瓑浜嗕袱杈?9璺悗鎹㈡垚77璺紝緇撴灉澶氭琛屼簡鍥涘崄鍒嗛挓鐨勬牱瀛愶紝鍒板鐨勬椂鍊欓兘蹇?0錛?0浜嗭紝榪樻病鍚冮キ銆傚悗鏉ユ垜鎼?9璺紝澶ф鎯呭喌鏄紝鏈潵鏄墠闂ㄩ忓竵涓婅濺鐨勶紝鎴戝彧鑳戒粠鍚庨棬涓婏紝涓婅濺鍚庤創鍦ㄨ濺闂紝閫斾腑璺繃瑕佷笅杞︾殑鎴戣繕瑕佷粠鍚庨棬涓嬫潵璁╁埆浜轟笅杞︺傛垜闈狅紝榪欎笅鎰熻鍒版瘺澶х埛鐪熶笉瀵癸紝鍟ュ瓙浜哄鍔涢噺澶э紝鐬庢壇錛?BR> 鍥炲埌浣忕殑鍦版柟錛屽悆榪囬キ鐨勬椂闂存槸鏈闅炬墦鍙戠殑銆備互鍓嶅湪瀹剁啲澶滐紝涔熶笉鍙兘鐫$殑澶棭錛屽ぇ姒傛瘡澶╁氨鍗佷竴鐐圭殑鏍峰瓙鐫★紝鏈熼棿鐨勬椂闂村氨涓嶇煡閬撳浣曞鐞嗭紵錛佷竴鍒囧湪瀹舵椂鍊欏氨鐜╁効鐢佃剳錛岀幇鍦ㄨ繛涓數瑙嗛兘鐪嬩笉鍒幫紝鎰熻鑷繁閮戒笌澶栫晫闅旂粷浜嗕竴鏍楓傛瘡澶╁氨鍒板窛澶х殑鏁f暎姝ユ錛岀劧鍚庡洖浣忕殑鍦版柟韜哄湪搴婁笂錛屽彂鍑犳潯鐭俊錛屾墦鍑犱釜鐢佃瘽錛屼究鏃╂棭鐨勭潯鍘匯傝繖涓槸璁╂垜綺劇涓婃渶闅句互蹇嶅彈鐨勫湴鏂廣傛垜闈狅紝鎴戞槸IT浜哄摝錛熶俊鎭椂浠e摝錛燂紒榪欏埌搴曟槸浠涔堣楝肩殑鐢熸椿錛屾垜鏈鍙椾笉浜嗗氨鏄繖涓鐐廣備笉榪囪繕濂斤紝鎴戞槸鍜屾湅鍙嬩竴璧峰嚭鏉ョ殑錛屾櫄涓婅繕鍙互闂茶亰鍑犲彞錛屼笉榪囨兂鎯充互鍚庤鏄竴涓漢鍑洪棬鍦ㄥ錛屾垜浼拌鑷繁鏃╂櫄瑕佺柉銆?BR> 鏅氫笂錛屼功涔熶笉鎯崇湅錛岃鏄互鍚庤繕鏄繖涓牱瀛愶紝鎴戜及璁¤繖杈堝瓙灝卞彧鑳藉綋涓杈堝瓙鐨勫瀮鍦劇▼搴忓憳浜嗐?BR> 鏈夌殑鏃跺欐垜鎯籌紝紼嬪簭鍛樼殑紜潪甯歌緵鑻︼紝鑷繁閫夋嫨榪欐潯閬撹礬瀵逛笉瀵廣傚悗鏉ユ兂浜嗘兂錛屽姫鍔涘仛濂芥瘡涓浠朵簨鍎匡紝鎬繪湁涓澶╂垜鐩鎬俊鑷繁鐨勮兘鍔涘緱鍒伴敾鐐間互鍚庯紝鎴戠浉淇℃佸害鍐沖畾涓鍒囥?BR> 鍞夛紝鐜板湪鍥炲埌瀛︽牎浜嗭紝鐪熺殑寰堝鎰熸偀錛屽ぇ瀹惰繕鏄竴璧峰姫鍔涘惂錛?BR> 鐜板湪鎰熻鍋氱▼搴忕湡鐨勫緢绱紝鑰屼笖浠樺嚭鍜屾敹鍏ユ樉鐒朵笉鏄垚姝f瘮鐨勶紝鐜板湪鏈夌偣涓婁簡璐艱埞鍙堟棤娉曞洖澶達紝浠旂粏鎯蟲兂鍙堟湁鐐圭浉榪芥眰搴撳厠鑸歸暱閭f牱浼犲鐨勪漢鐢燂紝鐭涚浘錛?/P>
涔嬫潵榫欏幓鑴?BR> 棰樿錛氬墠浜涙棩瀛愪竴鐩存兂鍐欒繖涓笢瑗匡紝鍋氫簡涓涓紑澶存斁鍦ㄦ垜鐨凚LOG涓?浣嗘槸鍚嶄負<MFC妗嗘灦紼嬪簭WINMAIN鍑芥暟鍒嗘瀽>)錛屽埌鍚庢潵灝辨病鏈夊啀綆′簡錛屽叾瀹為偅鍙槸鍐板北涓瑙?鍏蜂綋MFC鏄庝箞榪愯鐨勶紝榪樻槸娌℃湁浜ゅ緟娓呮錛岃櫧鐒惰嚜宸辯殑BLOG寰堝皯鏈変漢鍏夐【錛屼絾鏄湰鐫鍋氫簨鍎垮氨瑕佸仛鍒板簳鐨勫績鎬侊紝緇х畫瀹屾垚璇ユ枃銆?BR> 璇存槑錛?銆佹湰鏂囦綔鑰呭湪VS2003涓窡韙唬鐮侊紝姝や唬鐮佷負VS2003涓嫹璐濓紝浣跨敤MFC7銆?BR> 2銆佷笉鍚屾鏋剁殑MFC紼嬪簭鐢辨墍涓嶅悓錛屾湰鏂囦互鍗曟枃妗d負渚嬨?BR> 3銆佹湰鏂囪鑰呴渶瑕佹湁涓瀹氱殑SDK鐨勫熀紜錛屼笉闇瑕佸お澶氾紝鑷沖皯鐭ラ亾瀹冪殑鍩烘湰妗嗘灦鍜屾潵榫欏幓鑴夊嵆鍙紒
4銆佹枃绔犲彧鎯寵搗鍒拌鏄庝綔鐢紝鎵浠ヤ唬鐮佷細鏈変竴浜涘垹闄ゃ?BR> 瀛FC錛岀珶鐒惰繕涓嶇煡閬揗FC鐨凪AIN鍑芥暟鍦ㄤ粈涔堝湴鏂癸紵鎬庝箞榪愯鐨勶紵瀹炲湪涓嶉珮鏄庛?BR> 鐪嬭繃鍊欐嵎(JJHOU)鑰佸笀鐨勩婃繁鍏ユ祬鍑篗FC銆嬬殑錛屽瀹冧竴瀹氬緢鐔熸倝銆傚懙鍛碉紝鏈枃鏄尞緇欐病鏈夌湅榪囬偅鏈功錛屼絾鏄張寰堝笇鏈涘涔燤FC紼嬪簭璁捐鐨勬湅鍙嬬殑銆傦紙娌℃湁鐪嬭繃閭f湰涔︾殑鏈嬪弸榪樹笉璧跺揩鍘諱拱錛燂級鍏跺疄鏈枃錛屼富瑕佹槸瀵廣婃繁鍏ユ祬鍑篗FC銆嬬鍏珷鐨勪竴涓葷粨鍜岃ˉ鍏呯艦浜嗭紒錛堟湰鏂囨湁璇ヤ功涓嶅悓鐨勫湴鏂癸紝涔熸湁涓浜涚瑪鑰呰嚜宸辯殑瑙佽В錛侊級
璦褰掓浼犮?BR> 鍋囧浣犵敤AppWizard涓姝ヤ竴姝EXT涓嬫潵錛岀劧鍚庡湪CLASSVIEW涓幓鎵懼WINMAIN鍑芥暟錛岄偅涔堜綘鍙湁澶辨湜銆侻FC鏈澶х殑鐗圭偣鏄粈涔堬紵灝佽錛丮FC鐨勭‘灝佽鐨勫お濂戒簡錛屼互鑷充簬寰堝鎯沖涔燤FC鐨勪漢閮芥湜鑰屽嵈姝ャ傞棽璇濆皯璇達紝榪樻槸緇х畫鎴戜滑浠婂ぉ鐨勮瘽棰橈紝MAIN鍑芥暟錛佸疄璇濆憡璇変綘鍚э紝鍗充嬌浣犳悳绱㈡墍鏈夌殑MFC鐢熸垚鐨勬枃浠訛紝閮芥棤娉曞彂鐜癢INMAIN鐨勫瓧鐪鹼紝閭d箞瀹冨氨榪戝湪浠涔堝湴鏂瑰憿錛?BR> 鎴戠浉淇′綘宸茬粡鎯沖埌錛孧AIN鍑芥暟搴旇鍦ㄤ富瑕佺殑搴旂敤紼嬪簭鏂囦歡涓傞毦閬撴槸鈥滄偍瀹氫箟鐨勭▼搴忓悕.cpp鈥濊繖涓枃浠訛紵涓嶉敊灝辨槸瀹冦傚啀Crtl+F涓涓嬶紝鐪嬫湁娌℃湁鎴戜滑瑕佹壘鐨刉INMAIN鍑芥暟錛熺湅鏉ヤ綘鍙堣澶辨湜浜嗭紝浣嗘槸浣犳敞鎰忔湁榪欐牱涓鍙ワ細
/////////////////////////////////////////////////////////////////////////////
// The one and only CMyApp object
CMyApp theApp; //鏈漢寤虹珛鐨勫伐紼嬪悕涓篗y銆?BR>
鏄笉鏄緢鐗瑰埆錛屽啀娉ㄦ剰涓涓嬮偅鍙ユ敞閲娾淭he one and only CMyApp object鈥濓紝姣忎釜搴旂敤紼嬪簭鏈変笖鍙敤涓涓狢MyApp瀵硅薄銆傛垜鎯充綘搴旇鎯沖埌浜嗭紝WinMain鍑芥暟姣忎釜紼嬪簭涔熷彧鑳芥湁涓涓紝閭d箞榪欎釜鍏ㄥ眬瀵硅薄璺焀inMain鍑芥暟鑲畾鏈夎帿澶х殑鍏崇郴錛熸病閿欙紝鐩鎬俊浣犵殑鐩磋銆?BR> 鐗瑰埆娉ㄦ剰錛氭繁鏅揅++緇嗚妭鐨勪漢涓瀹氱煡閬擄紝鍏ㄥ眬瀵硅薄浼樺厛浜嶮AIN鍑芥暟鎵ц鐨勯亾鐞嗐傚鏋滀綘涓嶇煡閬撲篃娌″叧緋伙紝閭d箞鎴戝湪榪欓噷鍛婅瘔浣狅細鈥滃叏灞瀵硅薄浼樺厛浜嶮IAN鍑芥暟鎵ц錛屼笖鏋勫緩浜庢爤涓紝鍒囪錛屽垏璁幫紒鈥?BR> 鐜板湪錛屾垜浠娣卞叆WinMain榪愯鏈哄埗浜嗭紝紜垏鐨勮錛屽簲璇ユ槸MFC鐨勬満鍒訛紒
棣栧厛錛岀湅鐪婱FC鐨勫簱鏂囦歡鎶婏紝瀹冭兘緇欐垜浠甫鏉ヨ澶氭儕鍠溿傦紙vc6鐨勭浉搴旂殑鐩綍鏄痋Microsoft Visual Studio\VC98\MFC\SRC錛沄C7鐩稿簲鐨勭洰褰曟槸\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc錛?BR> 鐜板湪鎴戜滑灝變粠榪欎釜鍏ㄥ眬涓嬫墜錛屽紑濮嬩粖澶╃殑鏃呴斻?BR> CMyApp theApp;
姝ゆ椂錛岀郴緇熶細鎵цCMyApp鐨勭埗綾伙紙CWinApp錛夋瀯閫犲嚱鏁幫紝鍐嶆墽琛孋MyApp鐨勬瀯閫犲嚱鏁般傦紙鍏堟湁鑰佺埞錛屽啀鏈夊効瀛愶紒錛夛紝姝ゆ椂灝變細璋冪敤CWinApp鐨勬瀯閫犲嚱鏁般?BR>
CWinApp鐨勬瀯閫犲嚱鏁幫紙鍦╒C鎻愪緵鐨凪FC浠g爜涓互鈥滄枃涓殑涓涓瓧鎴栬瘝緇勨濈殑鏂瑰紡鏌ヨ鍏抽敭瀛楋紝姝ゆ椂鎵撳紑APPCORE.CPP錛屼互涓嬩嬌鐢ㄧ浉鍚屾悳绱㈡柟寮忥紝涓嶅啀澶嶈堪銆傦級鎵懼埌浠ヤ笅鍐呭錛?BR> CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName != NULL)
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;
// initialize CWinThread state
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();
// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
pModuleState->m_pCurrentWinApp = this;
ASSERT(AfxGetApp() == this);
... ...
}
OK錛屽氨鍒拌繖閲屽氨鍙互浜嗭紝浠旂粏鐪嬩笂闈唬鐮侊紝瀹冨凡緇忓畬鎴愪簡搴旂敤紼嬪簭綰跨▼棰濈殑鍚姩錛屽畠緇欎簣浜嗘垜浠▼搴忕殑鐢熷懡銆傜幇鍦ㄨ娉ㄦ剰錛?BR> pThreadState->m_pCurrentWinThread = this;
pModuleState->m_pCurrentWinApp = this;
榪欎袱琛屼唬鐮佸叾瀹為兘鏄仛鐨勪竴浠朵簨鍎褲?BR> 榪欐浠g爜鐨勬剰鎬濇槸錛岃幏寰椾簡CMyApp鐨勫叏灞瀵硅薄鐨則his鎸囬拡銆?姝ゆ椂浣犺偗瀹氳鐤戦棶錛屼負浠涔堟槸CMyApp鐨勬寚閽堬紵this鐩墠鏄湪CWinApp涓晩錛?nbsp; 瀵規鎴戠殑絳旀鏄紝鍙槸浣犳槸鐢盋MyApp鐨勫璞″紩鍙戠殑CWinApp鐨勬瀯閫犲晩錛侊紒)榪欎釜鎸囬拡鍙潪涓鑸殑浜虹墿錛岀◢鍚庢垜浠殑寰堝宸ヤ綔閮借闈犲畠瀹屾垚銆?BR> CWinApp涔嬩腑鐨勬垚鍛樺彉閲忓皢鍥犱負theApp榪欎釜鍏ㄥ眬瀵硅薄鐨勮癁鐢熻岃幏寰楅厤緗拰鍒濆鍊箋?BR> 鏋勯犲畬鐖剁被錛岀幇鍦ㄦ瀯閫犲瓙綾匯傚彲鏄垜浠湅鍒幫紝AppWizard緇欐垜浠殑瀛愮被閲屽畠浠涔堜篃娌″仛錛熸槸鐨勶紝榪欎竴鍒囬兘鍚粠浣犵殑瀹夋帓錛?BR> CMyApp::CMyApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
鎺ヤ笅鏉ュ氨鏄粖澶╃殑涓昏鍎夸簡錛屾悳绱㈠叧閿瓧鈥淲inMain鈥濓紝鍑虹幇寰堝鏂囦歡銆傚埆鎬ワ紝鍥犱負鐜板湪鎴戜滑搴旇鍏堢湅鐪媁inMain鐨勫0鏄庛傛墦寮appmodul.cpp錛?/P>
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
榪欓噷_tWinMain鏄負浜嗘敮鎸乁NICODE鑰屽懡鍚嶇殑涓涓畯錛岀湡姝h搗浣滅敤鐨勬槸AfxWinMain錛屾敞鎰忕湅鐪嬪畠鐨勫弬鏁幫紝鏄笉鏄拰SDK鐨刉inMain鍑芥暟涓鏍鳳紵
鐜板湪鍐嶆悳绱笅AfxWinMain錛屽叾瀹炲湪winmain.cpp涓細
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
... ...
}
姝ゆ浠g爜娉ㄦ剰浜斾釜緇嗚妭錛?BR> CWinApp* pApp = AfxGetApp();
鎰忎負鑾峰緱瀵硅薄鎸囬拡錛屽叾瀹炲氨鏄垰鎵嶉偅涓猅HIS銆備笉璁板緱浜嗭紵鎸囧悜CMyApp鐨勯偅涓紒榪樺煎緱娉ㄦ剰鐨勬槸錛孉fx鎰忔槸鍏ㄥ眬鐨勶紝闅忔椂浣犻兘鍙互璋冪敤瀹冦?AFX灝辨槸MFC寮鍙戝皬緇勭殑寮鍙戜唬鍙鳳紝鎰忎負Application Framework 浼犺X鍙槸涓轟簡濂界湅錛屾病瀹炲湪鎰忔濓紵錛?
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
AfxWinInit瀹屾垚浜嗙嚎紼嬬殑鍒濆鍖栧拰紿楁綾葷殑娉ㄥ唽銆傚叿浣撳弬鐪媋ppinit.cpp涓殑瀹氫箟銆?BR> if (pApp != NULL && !pApp->InitApplication())
鍏跺疄pApp鍜宲Thread鏄悓涓涓寚閽堬紝閮芥槸鎸囧悜CMyApp鐨勬寚閽堬紝榪欓噷鍥犱負CMyApp涓病鏈夊畾涔塈nitApplication錛屽疄闄呬笂灝辮皟鐢ㄧ殑CWinApp::InitApplication錛堬級錛屽畬鎴愪簡MFC鐨勫唴瀹圭鐞嗐?BR> if (!pThread->InitInstance())
鍥犱負CMyApp涓敼鍐欎簡瀹冿紝鎵浠ヨ皟鐢–MyApp涓殑錛屽叾瀹炲畠涔熸槸鍒濆鍖栧伐浣溿傛鏃朵篃瀹屾垚浜嗛粯璁ょ獥鍙g被鐨勫畾涔夈傚亣濡備綘鐔熸倝SDK緙栫▼鐨勮瘽錛屼竴瀹氫笉浼氬繕璁扮獥鍙g被鐨勮璁°佹敞鍐屻佸垱寤恒佺幇瀹炲強鏇存柊鐨勬楠わ紝姝ゆ椂MFC浠ヤ負浣犺璁″ソ浜嗛粯璁ょ殑紿楀彛綾匯?BR> 鐜板湪浣犱笉紱佽鐤戦棶,InitApplication()鍜孖nitInstance()鏈変綍涓嶅悓錛?BR> 絳旀鏄紝鍋囧浣犳墽琛屼竴涓▼搴忥紝浜庢槸涓や釜鍑芥暟閮戒細琚皟鐢紱褰撲綘鍦ㄤ笉鍏抽棴鍓嶄竴涓▼搴忕殑鍓嶆彁涓嬶紝鍐嶆墽琛屼竴涓▼搴忥紝閭d箞灝卞彧鎵ц鍚庝竴涓嚱鏁般?BR> nReturnCode = pThread->Run();
榪欎釜涓姝ラ鍦ㄣ婃繁鍏ユ祬鍑篗FC銆嬩腑琚垚涓虹▼搴忕殑媧繪按婧愬ご錛屽湪鎴戠湅鏉ュ畠灝辨槸浣犲紑杞﹁俯娌歸棬鐨勬楠ゃ傚緟浼氭垜浠細鍏蜂綋闃愯堪錛?BR>
鍦ㄨ璁$獥鍙g被浠ュ悗錛屽氨搴旇鏄敞鍐岋紝MFC鑷姩璋冪敤(璺寵漿鍒?AfxEndDeferRegisterClass錛圵INCORE.CPP涓級錛屼負浣犳敞鍐屼簡浜斾釜紿楀彛綾伙紝鍒嗗埆鏄細AfxWnd錛孉fxCreateBar錛孉fxMDIFrame錛孉fxFrameOrView錛孉fxOleControl浠ヤ笂紿楀彛綾籑FC灝嗚嚜鍔ㄨ漿鍖栨垚鐙珛鏃犱簩鐨勭被鍚嶏紝渚涘叾璋冪敤銆?BR> 鍦ㄧ獥鍙g殑娉ㄥ唽浠ュ悗錛屽氨搴旇鏄獥鍙g殑鍒涘緩宸ヤ綔錛屾鏃朵細璋冪敤CFrameWnd::Create(),璇ヤ唬鐮佷綅浜嶹INFRM.Cpp涓?BR>BOOL CFrameWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
LPCTSTR lpszMenuName,
DWORD dwExStyle,
CCreateContext* pContext)
{
HMENU hMenu = NULL;
if (lpszMenuName != NULL)
{
// load in a menu that will get destroyed when window gets destroyed
HINSTANCE hInst = AfxFindResourceHandle(lpszMenuName, RT_MENU);
if ((hMenu = ::LoadMenu(hInst, lpszMenuName)) == NULL)
{
TRACE(traceAppMsg, 0, "Warning: failed to load menu for CFrameWnd.\n");
PostNcDestroy(); // perhaps delete the C++ object
return FALSE;
}
}
m_strTitle = lpszWindowName; // save title for later
if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext))
{
TRACE(traceAppMsg, 0, "Warning: failed to create CFrameWnd.\n");
if (hMenu != NULL)
DestroyMenu(hMenu);
return FALSE;
}
return TRUE;
}
鍏朵腑瀹屾垚浜嗙獥鍙g殑鍒涘緩宸ヤ綔錛岄噷闈㈣繕娑夊強鎵╁睍椋庢牸鐨勮皟鐢–reateEx錛屽叿浣撶粏鑺傝鍙傜湅MSDN銆?BR>
姝ゆ椂浣犱笉紱佽闂紝鎴戜滑鐨勪簨鍎塊兘璁㎝FC鍋氬畬浜嗭紵宸ヤ笟鍖栫敓浜у嚭鏉ョ殑紿楀彛閮芥槸鍗冪瘒涓寰嬪晩錛屾垜瑕佹湁鎴戣嚜宸辯殑椋庢牸錛?BR> 鍒ワ紝MFC緇欑敤鎴鋒彁渚涗簡涓涓慨鏀圭獥鍙h璁$殑鏈轟細閭e氨鏄細PreCreateWindow(CREATESTRUCT& cs) 浣犲湪MSDN涓煡璇竴涓婥REATESTRUCT榪欎釜緇撴瀯浣擄紝浣犱細鍙戠幇瀹冨拰鎴戜滑鐨凜reateWindow鍑犱箮鏄竴妯′竴鏍鳳紝榪欎釜灝辨槸MFC鐣欑粰浣犱慨鏀圭獥鍙g殑涓涓満浼氥傚湪PreCreateWindow鏃訛紝浼氳煩鍒癈Wnd::PreCreateWindow錛岄噷闈㈡湁涓涓畯錛欰fxDeferRegisterClass錛屽畠鐨勪綔鐢ㄦ槸錛氬鏋滆紿楀彛綾繪病鏈夎娉ㄥ唽錛岄偅涔堝氨娉ㄥ唽瀹冿紱濡傛灉娉ㄥ唽浜嗭紝灝變粈涔堜篃涓嶇錛?BR> 紿楀彛綾葷殑璁捐銆佹敞鍐屻佸垱寤洪兘宸茬粡瀹屾垚錛岀幇鍦ㄥ彧鍓╀笅鏇存柊鍜屾樉紺轟簡銆傝繖浜涘伐浣滈兘浜ょ敱 CMyApp::InitInstance()瀹屾垚錛?BR> m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
鐜板湪if (!pThread->InitInstance())鐨勫伐浣滃凡緇忓畬鎴愶紝鎸夌収MAIN鍑芥暟鐨勫唴瀹癸紝鎺ヤ笅鏉ヨ錛歯ReturnCode = pThread->Run()浜?BR> 姝ゆ椂搴旇璋冪敤CMyApp鐨凴un()鍑芥暟錛屼絾鏄湪CMyApp綾諱腑錛屾牴鏈病鏈夊0鏄庢垨瀹氫箟榪欐牱涓涓嚱鏁幫紝鏍規嵁澶氭佹х殑鍘熸潵錛屾寚閽堣縼鍗囷紝鎸囧悜CWinApp::Run()錛屽叾浠g爜浣嶄簬APPCORE.CPP涓細
int CWinApp::Run()
{
if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
{
// Not launched /Embedding or /Automation, but has no main window!
TRACE(traceAppMsg, 0, "Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
AfxPostQuitMessage(0);
}
return CWinThread::Run();
}
鏈鍚庝綘浼氬彂鐜幫紝瀹冪敱璋冪敤浜嗕竴涓狢WinThread::Run()錛屾鏃朵綘灝辯湅涓嶅埌CWinThread::Run()鐨勪唬鐮佷簡錛堣嚦灝戠瑪鑰呮病鏈夋壘鍒幫紝鍥犱負寰蔣鍙彁渚涗簡閮ㄥ垎MFC浠g爜銆傦級浣嗘槸浣犲彲浠ュ湪MSDN涓壘鍒癈WinThread::Run()鐨勬弿榪幫細
Run 鎺у埗綰跨▼鐨勫嚱鏁般傚寘鍚秷鎭車銆備竴鑸笉閲嶅啓銆?
鍐嶅叿浣撶偣灝辨槸錛?BR> Run acquires and dispatches Windows messages until the application receives a WM_QUIT message. If the thread's message queue currently contains no messages, Run calls OnIdle to perform idle-time processing. Incoming messages go to the PreTranslateMessage member function for special processing and then to the Windows function TranslateMessage for standard keyboard translation. Finally, the DispatchMessage Windows function is called.
Run is rarely overridden, but you can override it to implement special behavior.
This member function is used only in user-interface threads.
鍘熸潵瀹冩妸娑堟伅寰幆鍖呰浜嗕竴涓嬶紝鍦∕FC涓О涓烘秷鎭槧灝勶紙message map錛夌殑涓滆タ錛佽嚦浜庢秷鎭槧灝勭殑鍏蜂綋緇嗚妭鏈漢浼氬彟鍐欐枃绔犺鏄庯紒
OK錛孧FC涓嶅啀紲炵錛屾帉鎻′簡瀹冪殑鏉ラ緳鍘昏剦錛屽啀鐪嬪叾浠栫殑MFC涔︾睄鐨勬椂鍊欙紝灝辯煡閬撴垜璇ユ庝箞鍋氾紵涓轟粈涔堟垜瑕佽繖鏍峰仛錛熻搗鍒頒簡鐭ュ叾鐒跺張鐭ュ叾鎵浠ョ劧鐨勬晥鏋滐紝榪欏氨鏄垜鎵榪芥眰鐨勬妧鏈鐣屻?BR>