锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美国产综合视频,国产精品私人影院,一区二区三区在线免费播放http://m.shnenglu.com/Walker/category/16501.html鍏堝浼氳漿鏂囩珷錛屽湪浠旂粏璇繪枃绔狅紝鏈鍚庤嚜宸卞啓鐐逛笢瑗?.......zh-cnThu, 26 May 2011 18:51:06 GMTThu, 26 May 2011 18:51:06 GMT60涓浜涘紑婧愰」鐩綉鍧http://m.shnenglu.com/Walker/articles/145927.html婕鑰吤?amp;鈥︹?錕?/dc:creator>婕鑰吤?amp;鈥︹?錕?/author>Sun, 08 May 2011 01:35:00 GMThttp://m.shnenglu.com/Walker/articles/145927.htmlhttp://m.shnenglu.com/Walker/comments/145927.htmlhttp://m.shnenglu.com/Walker/articles/145927.html#Feedback0http://m.shnenglu.com/Walker/comments/commentRss/145927.htmlhttp://m.shnenglu.com/Walker/services/trackbacks/145927.htmlhttp://code.ijinshan.com/
http://search.csdn.net/
CSDN鎼滅儲錛孋SDN榪樻槸鏈夐潪甯稿鐨勭紪紼嬭祫婧愮殑錛岀敤瀹冪殑鎼滅儲鑳芥悳鍑轟笉灝戜笢瑗褲備唬鐮佺被鍒篃姣旇緝鍏ㄩ潰銆?/p>

http://snippets.org/
綆鍗曞疄鐢ㄧ殑浠g爜鏀墮泦緗戠珯錛屽己鍔涙帹鑽愩傛瘮濡備綘瑕佹壘涓狣ES鍔犲瘑錛岃鎵句釜鏁版嵁鍘嬬緝錛屾壘涓狪NI鏂囦歡鎿嶄綔鐨凜浠g爜絳夛紝鍧囪兘鎵嬪埌鎿掓潵銆?/p>

http://www.codase.com/index.html
瀹冩槸涓涓唬鐮佹悳绱㈠紩鎿庯紝鐗瑰埆鏄悳绱/c++鐨勫紑婧愪唬鐮侊紝鍙互閫氳繃鍑芥暟鍚嶃佺被鍚嶇瓑鎼滅儲錛屽緢閰峰櫌

http://sourceforge.net
鏈夊悕鐨勫紑婧愪唬鐮佸簱錛屽彧瑕佽兘鎯沖埌鐨勫姛鑳斤紝涓婇潰閮芥湁瀵瑰簲鐨勬簮鐮?/p>

http://www.tigris.org/
鍜屼笂闈㈢殑sourceforge涓鏍風殑寮婧愪唬鐮佸簱錛屼笉榪噑ourceforge鐢–VS錛岃岃繖涓敤SVN鐗堟湰綆$悊銆?/p>

http://cosoft.org.cn/
涓枃鐗堢殑寮婧愪唬鐮佸簱錛屽ソ鍍忔槸鐢眘ourceforge鐩存帴緲昏瘧榪囨潵鐨勩傚叾鍚屾鎬х瓑灝氭湭鑰冨療銆?/p>

http://codeguru.com
http://codeproject.com
榪欎袱涓珯鐐規瘮杈冪被浼鹼紝鏀句竴璧峰惂銆備互WINDOWS涓嬬殑Visual studio緙栫▼浠g爜銆佹暀紼嬩負涓匯傚湪浠ュ墠鍙槸浣跨敤MFC鐨勪漢鐨勫繀緇忎箣鍦般?/p>

http://www.experts-exchange.com/Programming/
榪欐槸涓撳闂瓟鐨勭綉绔欙紝鍦ㄧ紪紼嬫柟闈㈣兘澶熻В鍐充笉灝戦棶棰樸?/p>

http://www.koders.com/
涔熸槸涓涓唬鐮佹悳绱㈠紩鎿庯紝涓巆odase宸笉澶氾紝騫朵笖鑳芥煡鎵炬寚瀹氳鍙殑浠g爜

http://groups.google.com/
鎵句唬鐮侊紝鍐充笉鑳藉繕璁癵oogle鐨刧roups銆備竴瀹氳鍘誨櫌銆傚浗鍐呯殑鍏勫紵鍙兘璁塊棶鏃朵笉紼沖畾錛屽氨鐢ㄤ唬鐞嗗惂銆傚鏋滀綘鐢╢irefox錛屽彲浠ヤ嬌鐢ㄦ垜寮鍙戠殑xyzproxy鍒囨崲浠g悊錛屽緢鏂逛究鍣?)

http://www.thefreecountry.com/sourcecode/index.shtml
榪欎篃鏄釜婧愮爜鐮佺綉绔欍傝繖涓綉绔欑殑璧勬簮榪樻槸寰堝鐨勩?/p>

http://www.vckbase.com/
VC鐭ヨ瘑搴擄紝鍥藉唴姣旇緝濂界殑VC璧勬簮绔欍

http://www.programmersheaven.com/
寮鍙戣呭ぉ鍫傦紵 鏈変竴浜涙暀紼嬪ソ鍍忎笉閿欍?/p>

http://www.cprogramming.com/
鏀墮泦C/C++緙栫▼鏂歸潰璧勬簮鐨勭綉绔?/p>

http://csourcesearch.net
鍙堜竴涓唬鐮佹悳绱㈢綉绔欙紝澶у璇曡瘯錛?/p>

http://www.netlib.org/
婧愪唬搴撶儲寮曪紝鏈夊緢澶氭暟瀛︽柟闈㈢殑搴擄紝寰堝ソ鐢ㄣ傝鎵懼簱錛屼互姝ょ綉绔欑潃鎵嬭緝濂?/p>

50涓猚/c++婧愪唬鐮佺綉绔?br>C/C++鏄渶涓昏鐨勭紪紼嬭璦銆傝繖閲屽垪鍑轟簡50鍚嶄紭縐緗戠珯鍜岀綉欏墊竻鍗曪紝榪欎簺緗戠珯鎻愪緵c/c++婧愪唬鐮併傝繖浠芥竻鍗曟彁渚涗簡婧愪唬鐮佺殑閾炬帴浠ュ強瀹冧滑鐨勫皬璇存槑銆傛垜宸插敖鍔涘寘鎷渶浣崇殑C/C++婧愪唬鐮佺殑緗戠珯銆傝繖涓嶆槸涓涓畬鏁寸殑娓呭崟錛屾偍鏈夊緩璁彲浠ヨ仈緋繪垜錛屾垜灝嗘榪庢偍鐨勫緩璁紝浠ヨ繘涓姝ュ姞寮鴻繖鏂歸潰鐨勬竻鍗曘?/p>

1銆?a >http://snippets.dzone.com/tag/c/ --鏁頒互鍗冭鐨勬湁鐢ㄧ殑C璇█婧愪唬鐮佺墖孌?br>2銆?a >http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --鎻愪緵鏁頒互鐧捐鐨凜鍜孋++鑴氭湰鍜岀▼搴忋傛墍鏈夌▼搴忛兘鍒嗕負涓嶅悓鐨勭被鍒?br>3銆?a >http://www.planetsourcecode.com/vb/default.asp?lngWId=3 --瓚呰繃涓囪C鍜孋++鍏嶈垂鐨勬簮浠g爜
4銆?a >http://freshmeat.net/browse/164/ --瓚呰繃9000涓狢緙栧啓鐨勯」鐩?br>5銆?a >http://www.daniweb.com/code/c.html --DANIWEB鎻愪緵鐨勫疄鐢ㄤ唬鐮佹銆?br>6銆?a >http://www.programmersheaven.com/tags/C/ --programmersheaven.com涓婄殑C緙栫▼璧勬簮銆?br>7銆?a >http://www.ddj.com/code/ddj.html --Dr. Dobb’s Journal鐨勬簮浠g爜銆?br>8銆?a >http://www.cprogramming.com/cgi-bin/source/source.cgi --C鍜孋 + +緙栫▼璧勬簮銆?br>9銆?a >http://www.codecogs.com/ --CodeCogs鏄竴欏瑰崗浣滅殑寮鏀炬簮鐮佸簱錛孋/C++鐨勬暟鍊兼柟闈㈢殑緇勪歡銆?br>10銆乕URL=http://www.google.com /codesearch?q=programming++lang:c&cs_r=lang:c ]http://www.google.com/codesearch?q=programming++lang:c&cs_r=lang:c [/URL] --璋鋒瓕浠g爜鐨凜婧愪唬鐮併?br>11銆?a >http://www.codepedia.com/1/C --CodePedia鏄竴涓紑鏀劇殑鍏充簬緋葷粺緙栫▼鍜屽叾浠栦笌鐢佃剳鏈夊叧鐨勮棰樸?br>12銆?a >http://www.cis.temple.edu/~ingargio/cis71/code/ --涓哄鐢熸彁渚涚殑涓涓畝鍗曠殑C璇█紼嬪簭鐨勫垪琛ㄣ?br>13銆?a >http://www.codeproject.com/?cat=2 --codeproject鎻愪緵鐨凜/C++璧勬簮浠g爜欏圭洰銆?br>14銆?a >http://www.thefreecountry.com/sourcecode/cpp.shtml --浠ヤ笅鏄竴浜汣鍜孋++搴撶殑DLL錛孷CLs錛屾簮浠g爜錛屽厓浠訛紝妯″潡錛屽簲鐢ㄧ▼搴忔鏋訛紝綾誨簱錛屾簮浠g爜鐗囨絳夛紝浣犲彲浠ュ湪鎮ㄧ殑欏圭洰涓嬌鐢ㄨ屼笉闇瑕佹敮浠樿垂鐢ㄥ拰鐗堢◣銆?br>15銆乕URL=http://people.sc.fsu.edu /~burkardt/cpp_src/cpp_src.html ]http://people.sc.fsu.edu/~burkardt/cpp_src/cpp_src.html [/URL] --榪欐槸涓涓叏闈㈢殑鍏充簬C++鐨?45涓簮浠g爜娓呭崟銆?br>16銆?a >http://www.cplusplus.com/src/ --C++鍐欑殑閫氱敤鎺у埗鍙扮▼搴忓拰Windows紼嬪簭浠g爜娓呭崟銆?br>17銆?a >http://users.cs.fiu.edu/~weiss/dsaa_c++/code/ --C++璇█鏁版嵁緇撴瀯涓庣畻娉曞垎鏋愶紙絎簩鐗堬級鐨勬簮浠g爜銆?br>18銆?a >http://c.snippets.org/ --C婧愪唬鐮佺墖孌點?br>19銆?a >http://www.bbdsoft.com/downloads.html --C++婧愪唬鐮併?br>20銆?a >http://www.moshier.net/ 澶╂枃瀛﹀拰鏁板艱蔣浠舵簮浠g爜
21銆?a >http://cplus.about.com/od/cgames/C_Games_with_Source_Code.htm --娓告垙鏈夊叧鐨凜++婧愪唬鐮併?br>22銆乕URL=http://cliodhna.cop.uop.edu /~hetrick/c-sources.html ]http://cliodhna.cop.uop.edu/~hetrick/c-sources.html [/URL] --鍏嶈垂鐨凜/C++鏁板艱綆楁簮浠g爜銆?br>23銆?a >http://www.mathtools.net/C_C__/Utilities/index.html --C/C++宸ュ叿銆?br>24銆?a >http://www.programmerworld.net/resources/c_library.htm --鍏嶈垂C++婧愪唬鐮佸拰鍏跺畠鏈夌敤鐨勫伐鍏楓?br>25銆?a >http://www.cmcrossroads.com/bradapp/links/cplusplus-links.html --甯冩媺寰烽樋鏅皵欏跨殑C++閾炬帴-璧勬簮錛岄」鐩紝鍥句功棣嗭紝鏁欏鍜岀紪鐮併?br>26銆?a >http://www.robertnz.net/cpp_site.html --榪欐槸涓涓敹闆嗕簡鏁癈/C++緗戠珯閾炬帴鍒楄〃鐨勭綉欏點?br>27銆?a >http://www.josuttis.com/libbook/examples.html --鍦ㄨ繖閲岋紝浣犲彲浠ョ湅鍒板茍涓嬭澆鎵鏈夌殑鏈功鐨凜++鏍囧噯搴撲緥瀛?銆?br>28銆?a href="ftp://66.77.27.238/sourcecode/cuj/">ftp://66.77.27.238/sourcecode/cuj/ --C/C++鐢ㄦ埛鏉傚織
29銆?a href="ftp://66.77.27.238/sourcecode/wd/">ftp://66.77.27.238/sourcecode/wd/ --Windows寮鍙戣呯綉緇?br>30銆?a >http://www.einet.net/directory/65892/Developers.htm --C紼嬪簭
31銆?a >http://www.daniweb.com/code/cplusplus.html --瀹炵敤浠g爜孌點?br>32銆?a >http://snippets.dzone.com/tag/c --C++婧愪唬鐮?br>33銆?a >http://www.programmersheaven.com/tags/C --C++緙栫▼璧勬簮錛宲rogrammersheaven.com
34銆?a >http://www.google.com/codesearch?hl=en&lr=&q=programming --璋鋒瓕浠g爜鎼滅儲-C++緙栫▼璇█
35銆?a >http://www.codepedia.com/1/Cpp --CodePedia鏄竴涓紑鏀劇殑鍏充簬緋葷粺緙栫▼鍜屽叾浠栦笌鐢佃剳鏈夊叧鐨勮棰樼殑緗戠珯銆?br>36銆?a >http://www.codebeach.com/index.asp?TabID=1&CategoryID=3 --C++婧愪唬鐮侊紝Codebeach鎻愪緵
37銆?a >http://freshmeat.net/browse/165/ --5000欏圭洰鍐欑殑C++緙栫▼璇█
38銆?a >http://cplus.about.com/od/codelibrary/Code_Library_for_C_C_and_C.htm --浠g爜搴揅銆丆 + +鍜孋錛冦?br>39銆?a >http://www.c.happycodings.com/ --Visual Basic銆丳HP銆丄SP鎶鏈丆銆丆++澶у叏銆?br>40銆?a >http://www.blueparrots.com/ --Borland C娓告垙錛屽浘鍍忓拰澹伴煶婧愪唬鐮佽寖渚嬨?br>41銆?a >http://www.java2s.com/Code/Cpp/CatalogCpp.htm --C++婧愪唬鐮併?br>42銆?a >http://www.yeohhs.com/modules/mydownloads/ --C涓嶤++鐢靛瓙涔﹀拰婧愪唬鐮佺ず渚嬨?br>43銆?a >http://www.brpreiss.com/books/opus4/programs/index.html C++鐨勬暟瀛︽柟紼嬪拰鍏紡婧愪唬鐮併?br>44銆乕URL=http://users.cs.fiu.edu][/URL]http://users.cs.fiu.edu/ C++銆?br>45銆乕URL=http://www.josuttis.com/libbook/examples.html][/URL]http://www.josuttis.com/libbook/examples.html --C++鏍囧噯搴?鏁欑▼鍜屽弬鑰冭祫鏂欍?br>46銆?a >http://emr.cs.uiuc.edu/~reingold/calendars.shtml Edward M. Reingold's Calendar Book, Papers, and Code銆?br>47銆?a >http://cpp.snippets.org/ --c++婧愪唬鐮佹。妗堛?br>48銆?a >http://ubiety.uwaterloo.ca/~tveldhui/papers/techniques/ --鐢–鍜孋++鐨勮В鍐崇瀛﹂棶棰樸?br>49銆?a >http://c.ittoolbox.com/topics/core-c/ --C/C++鐨処T宸ュ叿妗嗐?br>50銆?a >http://www.le.ac.uk/cc/tutorials/c/ccccdbas.html --鏈枃浠朵腑鍖呭惈鏈夊ぇ閲忕殑C紺轟緥紼嬪簭銆?/p>

 

鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/fisher_jiang/archive/2010/05/06/5561556.aspx



]]>
淇″彿(signals)鍜屾Ы(slots) 綺捐http://m.shnenglu.com/Walker/articles/145870.html婕鑰吤?amp;鈥︹?錕?/dc:creator>婕鑰吤?amp;鈥︹?錕?/author>Sat, 07 May 2011 00:47:00 GMThttp://m.shnenglu.com/Walker/articles/145870.htmlhttp://m.shnenglu.com/Walker/comments/145870.htmlhttp://m.shnenglu.com/Walker/articles/145870.html#Feedback0http://m.shnenglu.com/Walker/comments/commentRss/145870.htmlhttp://m.shnenglu.com/Walker/services/trackbacks/145870.html淇″彿(signals)鍜屾Ы(slots) 綺捐
2010-11-01 22:54

淇″彿(signals)鍜屾Ы(slots)

淇″彿鍜屼俊鍙鋒Ы琚敤浜庡璞?object)涔嬮棿鐨勯氫俊銆備俊鍙峰拰妲芥満鍒舵槸QT鐨勯噸瑕佺壒寰佸茍涓斾篃璁告槸QT涓庡叾浠栨鏋舵渶涓嶇浉鍚岀殑閮ㄥ垎銆?/p>

鍓嶈█

鍦℅UI紼嬪簭璁捐涓紝閫氬父鎴戜滑甯屾湜褰撳涓涓獥鍙i儴浠?widget)榪涜鏀瑰彉鏃惰兘鍛婄煡鍙︿竴涓姝ゆ敼鍙樻劅鍏磋叮鐨勭獥鍙i儴浠躲傛洿涓鑸殑錛屾垜浠笇鏈涗換浣曚竴綾葷殑瀵硅薄(object)閮借兘鍜屽叾浠栧璞¤繘琛岄氫俊銆備緥濡傦紝濡傛灉鐢ㄦ埛鍗曞嚮涓涓叧闂寜閽紝鎴戜滑鍙兘灝卞笇鏈涚獥鍙g殑 close() 鍑芥暟琚皟鐢ㄣ?/p>

鏃╂湡鐨勫伐鍏峰寘鐢ㄥ洖璋?backcalls)鐨勬柟寮忓疄鐜頒笂闈㈡墍鎻愬埌鐨勫璞¢棿鐨勯氫俊銆傚洖璋冩槸鎸囦竴涓嚱鏁扮殑鎸囬拡錛屽洜姝ゅ鏋滀綘甯屾湜涓涓鐞嗗嚱鏁伴氱煡浣犱竴浜涗簨鎯咃紝浣犲彲浠ヤ紶閫掑彟涓涓嚱鏁幫紙鍥炶皟鍑芥暟錛夋寚閽堢粰榪欎釜澶勭悊鍑芥暟銆傝繖涓鐞嗗嚱鏁板氨浼氬湪閫傚綋鐨勬椂鍊欒皟鐢ㄥ洖璋冨嚱鏁般傚洖璋冩湁涓や釜閲嶈鐨勭己闄鳳細棣栧厛錛屽畠浠笉鏄被鍨嬪畨鍏ㄧ殑銆傛垜浠棤娉曠‘瀹氬鐞嗗嚱鏁版槸鐢ㄦ紜殑鍙傛暟璋冪敤榪欎釜鍥炶皟鍑芥暟銆傚叾嬈★紝鍥炶皟涓庡鐞嗗嚱鏁扮揣瀵嗙殑鑱旂郴鍦ㄤ竴璧蜂互鑷村鐞嗗嚱鏁板繀欏葷煡閬撹皟鐢ㄥ摢涓洖璋冦?/p>

娑堟伅鍜屾Ы

鍦≦T涓紝鎴戜滑浣跨敤涓縐嶅彲鏇夸唬鍥炶皟鐨勬妧鏈細淇″彿鍜屾Ы鏈哄埗銆傚綋涓涓壒鍒殑浜嬩歡浜х敓鏃跺垯鍙戝嚭涓涓俊鍙楓俀T鐨勭獥鍙i儴浠舵湁寰堝宸茬粡棰勫畾涔夊ソ鐨勪俊鍙鳳紝鎴戜滑涔熷彲浠ラ氳繃緇ф壙錛岀粰紿楀彛閮ㄤ歡鐨勫瓙綾繪坊鍔犱粬浠嚜宸變俊鍙楓傛Ы灝辨槸涓涓彲浠ヨ璋冪敤澶勭悊鐗瑰畾淇″彿鐨勫嚱鏁般俀T鐨勭獥鍙i儴浠舵湁寰堝棰勫畾涔夊ソ鐨勬Ы錛屼絾鏄氬父鐨勫仛娉曟槸緇欏瓙綾葷獥鍙i儴浠舵坊鍔犺嚜宸辯殑淇″彿錛岃繖鏍峰氨鍙互鎿嶇旱鑷繁鍔犲叆鐨勪俊鍙蜂簡銆?/p>

  




涓婇潰榪欎釜鍥句竴瀹氳濂藉ソ鐞嗚В錛屾瘡涓猻ignal鍜孲lot閮芥槸涓涓狾bject鐨勫睘鎬э紝涓嶅悓Object鐨剆ignal鍙互瀵瑰簲涓嶇敤鐨凮bject鐨凷lot銆?/strong>


淇″彿鍜屾Ы鏈哄埗鏄被鍨嬪畨鍏ㄧ殑錛氫竴涓俊鍙風殑絳懼悕蹇呴』鍜岃淇″彿鎺ュ彈妲界殑絳懼悕鐩稿尮閰嶃傦紙浜嬪疄涓婁互涓涓Ы鐨勭鍚嶅彲浠ユ瘮浠栧彲鎺ュ彈鐨勪俊鍙風殑絳懼悕灝戯紝鍥犱負瀹冨彲浠ュ拷鐣ヤ竴浜涚鍚嶏級銆傚洜姝ょ鍚嶆槸涓鑷寸殑錛岀紪璇戝櫒灝卞彲浠ュ府鍔╂垜浠嫻嬬被鍨嬪尮閰嶃備俊鍙峰拰妲芥槸鏉捐﹀悎鐨勶細涓涓被涓嶇煡閬撲篃涓嶅叧蹇冨摢涓Ы鎺ュ彈浜嗗畠鎵鍙戝嚭鐨勪俊鍙楓俀T鐨勪俊鍙峰拰妲芥満鍒剁‘淇濅粬浠嚜鐢熺殑姝g‘榪炴帴錛屾Ы浼氬湪姝g‘鐨勬椂闂翠嬌鐢ㄤ俊鍙峰弬鏁拌岃璋冪敤銆備俊鍙峰拰妲藉彲浠ヤ嬌鐢ㄤ換浣曟暟閲忋佷換浣曠被鍨嬬殑鍙傛暟銆備粬浠畬鍏ㄦ槸綾誨瀷瀹夊叏鐨勩?/p>

鎵鏈夌戶鎵胯嚦QObject鎴栨槸鍏跺瓙綾伙紙濡?QWidget錛夌殑綾婚兘鍙寘鍚俊鍙峰拰妲姐傚綋瀵硅薄鏀瑰彉瀹冧滑鑷韓鐘舵佺殑鏃跺欙紝淇″彿琚彂閫侊紝浠庢煇縐嶆剰涔変笂璁詫紝瀹冧滑涔熻瀵瑰闈㈢殑涓栫晫鎰熷叴瓚c傝繖灝辨槸鎵鏈夊璞″湪閫氳鏃舵墍鍋氱殑涓鍒囥傚畠涓嶇煡閬撲篃涓嶅叧蹇冩湁娌℃湁鍏朵粬鐨勪笢瑗挎帴鍙楀畠鍙戝嚭鐨勪俊鍙楓傝繖灝辨槸鐪熸鐨勬秷鎭皝瑁咃紝騫朵笖紜繚瀵硅薄鍙敤浣滀竴涓蔣浠剁粍浠躲?/p>

妲借鐢ㄤ簬鎺ユ敹淇″彿錛屼絾鏄粬浠篃鏄甯哥殑鎴愬憳鍑芥暟銆傛濡備竴涓璞′笉鐭ラ亾鏄惁鏈変笢瑗挎帴鍙椾簡浠栦俊鍙鳳紝涓涓Ы涔熶笉鐭ラ亾瀹冩槸鍚﹁鏌愪釜淇″彿榪炴帴銆傝繖灝辯‘淇漄T鑳藉垱寤虹湡姝g嫭绔嬬殑緇勪歡銆?/p>

浣犲彲浠ュ皢浠繪剰涓俊鍙瘋繛鎺ュ埌浣犳兂榪炴帴鐨勪俊鍙鋒Ы錛屽茍涓斿湪闇瑕佹椂鍙皢涓涓俊鍙瘋繛鎺ュ埌澶氫釜妲姐傚皢淇″彿鐩存帴榪炴帴鍒板彟涓涓俊鍙蜂篃鏄彲鑳界殑錛堣繖鏍鋒棤璁轟綍鏃跺綋絎竴涓俊鍙瘋鍙戝嚭鍚庝細绔嬪嵆鍙戝嚭絎簩涓級銆?/p>

鎬諱綋鏉ョ湅錛屼俊鍙峰拰妲芥瀯鎴愪簡涓涓己鏈夊姏鐨勭粍浠剁紪紼嬫満鍒躲?/p>

綆鍗曠ず渚?/p>

涓涓瀬灝忕殑 C++ 綾?澹版槑濡備笅錛?/p>

class Counter
{
public:
Counter() {m_value = 0;}

int value() const {return m_value;}
void setValue(int Value);
private:
int m_value;
};


涓涓皬鍨嬬殑 QObject 瀛愮被澹版槑涓猴細

#include <QObject>

class Counter : public QObject
{
Q_OBJECT

public:
Counter() {m_value = 0;}

int value() const {return m_value;}

public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);

private:
int m_value;
};

QObject鐗堟湰鐨勭被涓庡墠涓涓狢++綾繪湁鐫鐩稿悓鐨勫煙錛屽茍涓旀彁渚涘叕鏈夊嚱鏁版帴鍙楄繖涓煙錛屼絾鏄畠榪樺鍔犱簡瀵逛俊鍙峰拰妲?signals-slots)緇勪歡緙栫▼鐨勬敮鎸併傝繖涓被鍙互閫氳繃valueChanged()鍙戦佷俊鍙峰憡璇夊閮ㄤ笘鐣屼粬鐨勫煙鍙戠敓浜嗘敼鍙?騫朵笖瀹冩湁涓涓彲浠ユ帴鍙楁潵鑷叾浠栧璞″彂鍑轟俊鍙風殑妲姐?/p>

鎵鏈夊寘鍚俊鍙峰拰妲界殑綾婚兘蹇呴』鍦ㄤ粬浠0鏄庝腑鐨勬渶寮濮嬫彁鍒癚_OBJECT銆傚茍涓斾粬浠繀欏葷戶鎵胯嚦錛堢洿鎺ユ垨闂存帴錛塓Object銆?/p>

妲藉彲浠ョ敱搴旂敤紼嬪簭鐨勭紪鍐欒呮潵瀹炵幇銆傝繖閲屾槸Counter::setVaule()鐨勪竴涓彲鑳界殑瀹炵幇錛?/p>

void Counter::setValue(int value)
{
if(value != m_value)
{
m_value = value;
emit valueChanged(value);
}
}

emit鎵鍦ㄧ殑榪欎竴琛屼粠瀵硅薄鍙戝嚭valueChanged淇″彿錛屽茍浣跨敤鏂板煎仛涓哄弬鏁般?/p>

鍦ㄤ笅闈㈢殑浠g爜鐗囨涓紝鎴戜滑鍒涘緩涓や釜Counter瀵硅薄騫朵笖浣跨敤QObject::connect()鍑芥暟灝嗙涓涓璞$殑valueChanged()淇″彿榪炴帴鍒扮浜屼釜瀵硅薄鐨剆etValue()妲姐?/p>

Counter a, b;
QObject::connect (&a, SIGNAL(valueChanged(int)),
&b, SLOT(setValue(int)));
a.setValue(12);    // a.value() == 12, b.value() == 12
b.setValue(48);    // a.value() == 12, b.value() == 48

鍑芥暟a.setValue(12)鐨勮皟鐢ㄥ鑷翠俊鍙穠alueChange(12)琚彂鍑?瀵硅薄b鐨剆etValue()妲芥帴鍙楄淇″彿錛屽嵆鍑芥暟setValue()琚皟鐢ㄣ傜劧鍚巄鍚屾牱鍙戝嚭淇″彿valueChange()錛屼絾鏄敱浜庢病鏈夋Ы榪炴帴鍒癰鍒皏alueChange()淇″彿錛屾墍浠ヨ淇″彿琚拷鐣ャ?/p>

娉ㄦ剰錛屽彧鏈夊綋 value != m_value 鏃訛紝鍑芥暟 setValue() 鎵嶄細璁劇疆鏂板煎茍鍙戝嚭淇″彿銆傝繖鏍峰氨閬垮厤浜嗗湪寰幆榪炴帴鐨勬儏鍐典笅錛堟瘮濡俠.valueChanged() 鍜宎.setValue()榪炴帴鍦ㄤ竴璧鳳級鍑虹幇鏃犱紤姝㈢殑寰幆鐨勬儏鍐點?/p>

淇″彿灝嗚鍙戦佺粰浠諱綍浣犲緩绔嬩簡榪炴帴鐨勬Ы錛涘鏋滈噸澶嶈繛鎺ワ紝灝嗕細鍙戦佷袱涓俊鍙楓傛繪槸鍙互浣跨敤QObject::disconnect()鍑芥暟鏂紑涓涓繛鎺ャ?/p>

榪欎釜渚嬪瓙璇存槑浜嗗璞′箣闂村彲浠ヤ笉闇瑕佺煡閬撶浉浜掗棿鐨勪換浣曚俊鎭岀郴鍗忓悓宸ヤ綔銆備負浜嗗疄鐜拌繖涓鐩殑錛屽彧闇瑕佸皢瀵硅薄閫氳繃鍑芥暟QObject::connect()鐨勮皟鐢ㄧ浉榪炴帴錛坈onnect錛?鎴栬呭埄鐢╱ic鐨刟utomatic connections鐨勭壒鎬с?/p>

緙栬瘧榪欎釜紺轟緥

C++棰勭紪璇戝櫒浼氭敼鍙樻垨鍘婚櫎鍏抽敭瀛梥ignals,slots,鍜宔mit錛岃繖鏍峰氨鍙互浣跨敤鏍囧噯鐨凜++緙栬瘧鍣ㄣ?/p>

鍦ㄤ竴涓畾涔夋湁淇″彿鍜屾Ы鐨勭被涓婅繍琛宮oc錛岃繖鏍峰氨浼氱敓鎴愪竴涓彲浠ュ拰鍏跺畠瀵硅薄鏂囦歡緙栬瘧鍜岃繛鎺ユ垚搴旂敤紼嬪簭鐨凜++婧愭枃浠躲傚鏋滀嬌鐢╭make宸ュ叿錛屽皢浼氬湪浣犵殑makefile鏂囦歡閲屽姞鍏ヨ嚜鍔ㄨ皟鐢╩oc鐨勮鍒欍?/p>

淇″彿

褰撳璞$殑鍐呴儴鐘舵佸彂鐢熸敼鍙橈紝淇″彿灝辮鍙戝皠錛屽湪鏌愪簺鏂歸潰瀵逛簬瀵硅薄浠g悊鎴栬呮墍鏈夎呬篃璁告槸寰堟湁瓚g殑銆傚彧鏈夊畾涔変簡淇″彿鐨勫璞℃垨鍏跺瓙瀵硅薄鎵嶈兘鍙戝皠璇ヤ俊鍙楓?/p>

褰撲竴涓俊鍙瘋鍙戝嚭錛岃榪炴帴鐨勬Ы閫氬父浼氱珛鍒昏繍琛岋紝灝卞儚鎵ц涓涓櫘閫氱殑鍑芥暟璋冪敤銆傚綋榪欎竴鍒囧彂鐢熸椂錛屼俊鍙峰拰妲芥満鍒舵槸瀹屽叏鐙珛浜庝換浣旼UI浜嬩歡寰幆涔嬪鐨勩傛Ы浼氬湪emit鍩熶笅瀹氫箟鐨勪唬鐮佹墽琛屽畬鍚庤繑鍥炪傚綋浣跨敤闃熷垪榪炴帴錛坬ueued connections錛夋椂浼氭湁涓浜涗笉鍚岋紱榪欑鎯呭喌涓嬶紝鍏抽敭瀛梕mit鍚庣殑浠g爜浼氱戶緇墽琛岋紝鑰屾Ы鍦ㄦ涔嬪悗鎵ц銆?/p>

濡傛灉鍑犱釜妲借榪炴帴鍒頒竴涓俊鍙鳳紝褰撲俊鍙瘋鍙戝嚭鍚庯紝妲戒細浠ヤ換鎰忛『搴忎竴涓帴涓涓殑鎵ц銆?/p>

鍏充簬鍙傛暟闇瑕佹敞鎰忥細鎴戜滑鐨勭粡楠屾樉紺哄鏋滀俊鍙峰拰妲戒笉浣跨敤鐗規畩鐨勭被鍨嬪皢浼氬彉寰楁洿鍏烽噸鐢ㄦс傚鏋淨ScrollBar::valueChanged() 浣跨敤浜嗕竴涓壒孌婄殑綾誨瀷錛屾瘮濡俬ypothetical QRangeControl::Range錛屽畠灝卞彧鑳借榪炴帴鍒拌璁捐鎴愬彲浠ュ鐞哘RangeControl鐨勬Ы銆傚啀娌℃湁璞℃暀紼?榪欐牱綆鍗曠殑渚嬪瓙銆?/p>

妲?br style="LINE-HEIGHT: normal">
褰撲竴涓俊鍙瘋鍙戝嚭鏃惰繛鎺ヤ粬鐨勬Ы琚皟鐢ㄣ傛Ы鏄竴涓櫘閫氱殑C++鍑芥暟騫舵寜鏅氭柟寮忚皟鐢紱浠栫殑鐗圭偣浠呬粎鏄彲浠ヨ淇″彿榪炴帴銆?/p>

鐢變簬妲藉彧鏄櫘閫氱殑鎴愬憳鍑芥暟錛屽綋璋冪敤鏃剁洿鎺ラ伒寰狢++瑙勫垯銆傜劧鑰岋紝瀵逛簬妲斤紝浠栦滑鍙互琚換浣曠粍浠墮氳繃涓涓俊鍙?妲借繛鎺ワ紙signal-slot connection錛夎皟鐢紝鑰屼笉綆″叾璁塊棶鏉冮檺銆備篃灝辨槸璇達紝涓涓粠浠繪剰鐨勭被鐨勫疄渚嬪彂鍑虹殑淇″彿鍙鑷翠竴涓笉涓庢綾葷浉鍏崇殑鍙︿竴涓被鐨勫疄渚嬬殑縐佹湁妲借璋冪敤銆?/p>

浣犺繕鍙互瀹氫箟涓涓櫄鎷熸Ы錛屽湪瀹炶返涓鍙戠幇涔熸槸闈炲父鏈夌敤鐨勩?/p>

鐢變簬澧炲姞鏉ョ伒媧繪э紝涓庡洖璋冪浉姣旓紝淇″彿鍜屾Ы紼嶅井鎱竴浜涳紝灝界榪欏鐪熷疄鐨勫簲鐢ㄧ▼搴忔潵璇存槸鍙互蹇界暐鎺夌殑銆傞氬父錛屽彂鍑轟竴榪炴帴浜嗘煇涓Ы鐨勪俊鍙鳳紝姣旂洿鎺ヨ皟鐢ㄩ偅浜涢潪铏氭嫙璋冪敤鐨勬帴鍙楀櫒瑕佹參鍗佸嶃傝繖鏄畾浣嶈繛鎺ュ璞℃墍闇鐨勫紑閿錛屽彲浠ュ畨鍏ㄥ湴閲嶅鎵鏈夊湴榪炴帴錛堜緥濡傚湪鍙戝皠鏈熼棿媯鏌ュ茍鍙戞帴鏀跺櫒鏄惁琚牬鍧忥級騫朵笖鍙互鎸変竴鑸殑鏂瑰紡瀹夋帓浠諱綍鍙傛暟銆傚綋鍗佷釜闈炶櫄鍑芥暟璋冪敤鍚搗鏉ュ緢澶氭椂錛屽疄闄呬笂浠栨瘮浠諱綍new鍜宒elete鎿嶄綔鐨勫紑閿閮藉皯錛屼緥濡傦紝褰撲綘鎵ц涓涓瓧絎︿覆銆佺煝閲忔垨鍒楄〃鎿嶄綔鏃訛紝灝遍渶瑕佺敤鍒皀ew鍜宒elete錛岃屼俊鍙峰拰妲界殑寮閿鍙槸鍏ㄩ儴鍑芥暟璋冪敤鑺辮垂鐨勪竴灝忛儴鍒嗐?/p>

鏃犺浣曟椂浣犵敤妲借繘琛屼竴涓郴緇熻皟鐢ㄥ拰闂存帴鐨勮皟鐢ㄨ秴榪?0涓互涓婄殑鍑芥暟鏃墮棿閮芥槸涓鏍風殑銆傚湪i586-500鏈哄櫒涓婏紝姣忕閽熶綘鍙互鍙戦佽秴榪?,000,000涓俊鍙風粰涓涓帴鍙楄咃紝鎴栬呮瘡縐掑彂閫?,200,000涓俊鍙風粰涓や釜鎺ュ彈鑰呫傜浉瀵逛簬淇″彿鍜屾Ы鏈哄埗鐨勭畝媧佹у拰鐏墊椿鎬э紝浠栫殑鏃墮棿寮閿鏄畬鍏ㄥ煎緱鐨勶紝浣犵殑鐢ㄦ埛鐢氳嚦瀵熻涓嶅嚭鏉ャ?/p>

娉ㄦ剰錛氳嫢鍏朵粬鐨勫簱灝嗗彉閲忓畾涔変負signals鍜宻lots,鍙兘瀵艱嚧緙栬瘧鍣ㄥ湪榪炴帴鍩轟簬QT鐨勫簲鐢ㄧ▼搴忔椂鍑洪敊鎴栬鍛娿備負浜嗚В鍐寵繖涓棶棰橈紝璇蜂嬌鐢?undef棰勫鐞嗙鍙楓?/p>

鍏冨璞′俊鎭?/p>

鍏冨璞$紪璇戝櫒錛坢oc錛夎В鏋愪竴涓狢++鏂囦歡涓殑綾誨0鏄庡茍涓旂敓鎴愬垵濮嬪寲鍏冨璞$殑C++浠g爜銆傚厓瀵硅薄鍖呮嫭淇″彿鍜屾Ы鐨勫悕瀛楋紝鍜屾寚鍚戣繖浜涘嚱鏁扮殑鎸囬拡銆?/p>

if (widget->inherits("QAbstractButton")) {
QAbstractButton *button = static_cast<QAbstractButton *>(widget);
button->toggle();
}

鍏冨璞′俊鎭殑浣跨敤涔熷彲浠ユ槸qobject_cast<T>(), 浠栧拰QObject::inherits() 鐩鎬技錛屼絾鏇翠笉瀹規槗鍑洪敊銆?/p>

if (QAbstractButton *button = qobject_cast<QAbstractButton *>(widget))
button->toggle();

鏌ョ湅Meta-Object緋葷粺鍙幏鍙栨洿澶氫俊鎭?/p>

涓涓疄渚?/p>

榪欐槸涓涓敞閲婅繃鐨勭畝鍗曠殑渚嬪瓙錛堜唬鐮佺墖鏂夎嚜qlcdnumber.h錛夈?/p>

#ifndef LCDNUMBER_H
#define LCDNUMBER_H

#include <QFrame>

class LcdNumber : public QFrame
{
Q_OBJECT

LcdNumber閫氳繃QFrame鍜孮Wiget緇ф壙鑷砆Object錛屽畠鍖呭惈浜嗗ぇ閮ㄥ垎signal-slot鐭ヨ瘑銆傝繖鏄湁鐐圭被浼間簬鍐呯疆鐨凲LCDNumber閮ㄤ歡銆?/p>

Q_OBJECT瀹忕敱棰勫鐞嗗櫒灞曞紑錛岀敤鏉ュ0鏄庣敱moc瀹炵幇鐨勬満涓垚鍛樺嚱鏁幫紱濡傛灉浣犵殑緙栬瘧鍣ㄥ嚭鐜伴敊璇涓?undefined reference to vtable for LcdNumber", 浣犲彲鑳藉繕浜嗚繍琛宮oc鎴栬呮病鏈夌敤榪炴帴鍛戒護鍖呭惈moc杈撳嚭銆?/p>

public:
LcdNumber(QWidget *parent = 0);

LcdNumber騫朵笉鏄庢樉鐨勪笌moc鐩稿叧錛屼絾鏄鏋滀綘緇ф壙浜哘Widege錛岄偅涔堝彲浠ュ嚑涔庤偗瀹氬湪浣犵殑鏋勯犲嚱鏁頒腑鏈夌埗瀵硅薄鐨勫彉閲忥紝騫朵笖甯屾湜鎶婂畠浼犵粰鍩虹被鐨勬瀯閫犲嚱鏁般?/p>

鏋愭瀯鍑芥暟鍜屼竴浜涙垚鍛樺嚱鏁板湪榪欓噷鐪佺暐錛沵oc浼氬拷瑙嗘垚鍛樺嚱鏁般?/p>

signals:
void overflow();

褰揕cdNumbe琚姹傛樉紺轟竴涓笉鍙兘鐨勫兼椂錛屼究鍙戝嚭淇″彿銆?/p>

濡傛灉浣犳病鏈夌暀鎰忔孩鍑猴紝鎴栬呬綘鐭ラ亾婧㈠嚭涓嶄細鍑虹幇錛屼綘鍙互蹇界暐overflow()淇″彿錛屾瘮濡備笉灝嗗叾榪炴帴鍒頒換浣曟Ы銆?/p>

濡傛灉鍙︿竴鏂歸潰錛屽綋鏈夋暟瀛楁孩鍑烘椂浣犳兂璋冪敤涓や釜涓嶅悓鐨勯敊璇鐞嗗嚱鏁幫紝鍙互灝嗚繖涓俊鍙風畝鍗曠殑榪炴帴鍒頒袱涓笉鍚岀殑妲姐俀T灝嗚皟鐢ㄤ袱涓嚱鏁幫紙鏃犲簭鐨勶級銆?/p>

public slots:
void display(int num);
void display(double num);
void display(const QString &str);
void setHexMode();
void setDecMode();
void setOctMode();
void setBinMode();
void setSmallDecimalPoint(bool point);
};

#endif

涓涓Ы鏄竴涓帴鍙楀嚱鏁幫紝鐢ㄤ簬鑾峰緱鍏朵粬紿楀彛閮ㄤ歡鐨勪俊鎭彉鍖栥侺cdNumber浣跨敤瀹冿紝灝卞儚涓婇潰鐨勪唬鐮佷竴鏍鳳紝鏉ヨ緗樉紺虹殑鏁板瓧銆傚洜涓篸isplay()鏄繖涓被鍜岀▼搴忕殑鍏跺畠鐨勯儴鍒嗙殑涓涓帴鍙o紝鎵浠ヨ繖涓Ы鏄叕鏈夌殑銆?/p>

鍑犱釜渚嬬▼鎶奞ScrollBar鐨剉alueChanged()淇″彿榪炴帴鍒癲isplay()妲斤紝鎵浠CD鏁板瓧鍙互緇х畫鏄劇ず婊氬姩鏉$殑鍊箋?/p>

璇鋒敞鎰廳isplay()琚噸杞戒簡錛屽綋灝嗕竴涓俊鍙瘋繛鎺ュ埌妲芥椂QT灝嗛夋嫨涓涓渶閫傚悎鐨勪竴涓傝屽浜庡洖璋冿紝浣犱細鍙戠幇浜斾釜涓嶅悓鐨勫悕瀛楀茍涓旇嚜宸辨潵璺熻釜綾誨瀷銆?/p>

涓涓笉鐩稿共鐨勬垚鍛樺嚱鏁板湪渚嬪瓙涓蹇界暐銆?/p>

楂樼駭淇″彿鍜屾Ы鐨勪嬌鐢?/p>

鍦ㄥ綋浣犻渶瑕佷俊鍙峰彂閫佽呯殑淇℃伅鏃訛紝QT鎻愪緵浜嗕竴涓嚱鏁癚Object::sender()錛屼粬榪斿洖鎸囧悜涓涓俊鍙峰彂閫佸璞$殑鎸囬拡銆?/p>

褰撴湁鍑犱釜淇″彿琚繛鎺ュ埌鍚屼竴妲戒笂錛屽茍涓旀Ы闇瑕佸鐞嗘瘡涓笉鍚岀殑淇″彿錛屽彲浣跨敤 QSignalMapper綾匯?/p>

鍋囪浣犵敤涓変釜鎸夐挳鏉ュ喅瀹氭墦寮鍝釜鏂囦歡錛歍ax File", "Accounts File", or "Report File"銆?/p>

涓轟簡鑳芥墦寮鐪熺‘鐨勬枃浠訛紝浣犻渶瑕佸垎鍒皢瀹冧滑鐨勪俊鍙?QPushButton::clicked()榪炴帴鍒?readFile()銆傜劧鍚庣敤QSignalMapper 鐨?setMapping()鏉ユ槧灝勬墍鏈?clicked()淇″彿鍒頒竴涓?QSignalMapper瀵硅薄銆?/p>

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(taxFileButton, QString("taxfile.txt"));
signalMapper->setMapping(accountFileButton, QString("accountsfile.txt"));
signalMapper->setMapping(reportFileButton, QString("reportfile.txt"));

connect(taxFileButton, SIGNAL(clicked()),
signalMapper, SLOT (map()));
connect(accountFileButton, SIGNAL(clicked()),
signalMapper, SLOT (map()));
connect(reportFileButton, SIGNAL(clicked()),
signalMapper, SLOT (map()));

鐒跺悗錛岃繛鎺ヤ俊鍙?mapped()鍒?readFile() 錛屾牴鎹鎸変笅鐨勬寜閽紝灝卞彲浠ユ墦寮涓嶅悓鐨勬枃浠躲?/p>

connect(signalMapper, SIGNAL(mapped(const QString &)),
this, SLOT(readFile(const QString &)));

鍦≦T涓嬌鐢ㄧ涓夋柟signals slots

鍦≦T涓嬌鐢ㄧ涓夋柟signals slots鏄彲鑳界殑銆備綘鐢氳嚦鍙互鍦ㄥ悓涓綾諱腑浣跨敤涓ょ鏈哄埗銆備粎浠呴渶瑕佸湪浣犵殑qmake宸ョ▼鏂囦歡(.pro)涓姞鍏ヤ笅闈㈣鍙ワ細

CONFIG += no_keywords

瀹冨憡璇塓T涓嶈瀹氫箟moc鍏抽敭瀛梥ignals,slots鍜宔mit錛屽洜涓鴻繖浜涘悕瀛楀彲鑳藉皢琚敤浜庣涓夋柟搴擄紝渚嬪Boost銆備綘鍙渶綆鍗曠殑鐢≦T瀹忓皢浠栦滑鏇挎崲涓?Q_SIGNALS, Q_SLOTS錛屽拰 Q_EMIT錛屽氨鍙互緇х畫浣跨敤淇″彿鍜屾Ы浜嗐?/p>

Qt婧愮爜鍒嗘瀽涔嬩俊鍙峰拰妲芥満鍒?/div>
2009/09/17 13:21

Qt鐨勪俊鍙峰拰妲芥満鍒舵槸Qt鐨勪竴澶х壒鐐?瀹為檯涓婅繖鏄拰MFC涓殑娑堟伅鏄犲皠鏈哄埗鐩鎬技鐨勪笢瑗?瑕佸畬鎴愮殑浜嬫儏涔熷樊涓嶅,灝辨槸鍙戦佷竴涓秷鎭劧鍚庤鍏跺畠紿楀彛鍝嶅簲,褰撶劧,榪欓噷鐨勬秷鎭槸騫夸箟鐨?br>璇存硶,綆鍗曠偣璇村氨鏄浣曞湪涓涓被鐨勪竴涓嚱鏁頒腑瑙﹀彂鍙︿竴涓被鐨勫彟涓涓嚱鏁拌皟鐢?鑰屼笖榪樿鎶婄浉鍏崇殑鍙傛暟浼犻掕繃鍘?濂藉儚榪欏拰鍥炶皟鍑芥暟涔熸湁鐐瑰叧緋?浣嗘槸娑堟伅鏈哄埗鍙瘮鍥炶皟鍑芥暟鏈夌敤
澶氫簡,涔熷鏉傚浜?/p>

MFC涓殑娑堟伅鏈哄埗娌℃湁閲囩敤C++涓殑铏氬嚱鏁版満鍒?鍘熷洜鏄秷鎭お澶?铏氬嚱鏁板紑閿澶ぇ.鍦≦t涓篃娌℃湁閲囩敤C++涓殑铏氬嚱鏁版満鍒?鍘熷洜涓庢鐩稿悓.鍏跺疄榪欓噷榪樻湁鏇存繁灞傛涓婄殑鍘熷洜,澶т綋璇存潵,
澶氭佺殑搴曞眰瀹炵幇鏈哄埗鍙湁涓ょ,涓縐嶆槸鎸夌収鍚嶇О鏌ヨ〃,涓縐嶆槸鎸夌収浣嶇疆鏌ヨ〃,涓ょ鏂瑰紡鍚勬湁鍒╁紛,鑰孋++鐨勮櫄鍑芥暟鏈哄埗鏃犳潯浠剁殑閲囩敤浜嗗悗鑰?瀵艱嚧鐨勯棶棰樺氨鏄湪瀛愮被寰堝皯閲嶈澆鍩虹被瀹炵幇
鐨勬椂鍊欏紑閿澶ぇ,鍐嶅姞涓婅薄鐣岄潰緙栫▼榪欐牱瀛愮被浼楀鐨勬儏鍐?鍩烘湰涓奀++鐨勮櫄鍑芥暟鏈哄埗灝卞簾鎺変簡,浜庢槸鍚勫搴撶殑緙栧啓鑰呭氨鍙ソ鑷皨鐢熻礬浜?璇村埌搴?榪欑‘瀹炴槸C++璇█鏈韓鐨勭己闄?/p>

紺轟緥浠g爜錛?br>#include <QApplication>
#include <QPushButton>
#include <QPointer>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

    QPushButton quit("Quit");
quit.resize(100, 30);
quit.show();
QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

return app.exec();
}

榪欓噷涓昏鏄湅QPushButton鐨刢licked()淇″彿鍜宎pp鐨剄uit()妲藉浣曡繛鎺?鍙堟槸濡備綍鍝嶅簲?
鍓嶉潰宸茬粡璇磋繃浜?Qt鐨勪俊鍙鋒Ы鏈哄埗鍏跺疄灝辨槸鎸夌収鍚嶇О鏌ヨ〃,鍥犳榪欓噷鐨勯瑕侀棶棰樻槸濡備綍鏋勯犺繖涓〃?
鍜孋++铏氬嚱鏁拌〃鏈哄埗綾諱技鐨?鍦≦t涓?榪欎釜琛ㄥ氨鏄厓鏁版嵁琛?Qt涓殑鍏冩暟鎹〃鏈澶х殑浣滅敤灝辨槸鏀寔淇″彿妲芥満鍒?褰撶劧,涔熷彲浠ュ湪姝ゅ熀紜涓婃墿灞曞嚭鏇村鐨勫姛鑳?鍥犱負
鍏冩暟鎹槸鎴戜滑鍙互鐩存帴璁塊棶鍒扮殑,涓嶅啀鏄薄铏氬嚱鏁拌〃閭f牱琚紪璇戝櫒閬伄鎺╂帺鐨勮棌浜嗚搗鏉?涓嶈繃Qt浼間箮榪樻病鏈夊畬鍏ㄥ彂鎸ュ厓鏁版嵁鐨勮兘鍔?鍔ㄦ佸睘鎬?鍙嶅皠涔嬬被鐨勬満鍒跺ソ鍍忚繕娌℃湁

浠諱綍浠嶲Object媧劇敓鐨勭被閮藉寘鍚簡鑷繁鐨勫厓鏁版嵁妯″瀷錛屼竴鑸槸閫氳繃瀹廞_OBJECT瀹氫箟鐨?br>#define Q_OBJECT \
public: \
static const QMetaObject staticMetaObject; \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
QT_TR_FUNCTIONS \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
private:

棣栧厛澹版槑浜嗕竴涓猀MetaObject綾誨瀷鐨勯潤鎬佹垚鍛樺彉閲?榪欏氨鏄厓鏁版嵁鐨勬暟鎹粨鏋?/p>

struct Q_CORE_EXPORT QMetaObject
{
...
struct { // private data
const QMetaObject *superdata;
const char *stringdata;
const uint *data;
const QMetaObject **extradata;
} d;
}
QMetaObject涓湁涓涓祵濂楃被灝佽浜嗘墍鏈夌殑鏁版嵁
const QMetaObject *superdata;//榪欐槸鍏冩暟鎹唬琛ㄧ殑綾葷殑鍩虹被鐨勫厓鏁版嵁
const char *stringdata;//榪欐槸鍏冩暟鎹殑絳懼悕鏍囪
const uint *data;//榪欐槸鍏冩暟鎹殑绱㈠紩鏁扮粍鐨勬寚閽?br>const QMetaObject **extradata;//榪欐槸鎵╁睍鍏冩暟鎹〃鐨勬寚閽?涓鑸槸涓嶇敤鐨?nbsp;      

榪欓噷鐨勪笁涓櫄鍑芥暟metaObject錛宷t_metacast錛宷t_metacall鏄湪moc鏂囦歡涓畾涔夌殑
metaObject鐨勪綔鐢ㄦ槸寰楀埌鍏冩暟鎹〃鎸囬拡
qt_metacast鐨勪綔鐢ㄦ槸鏍規嵁絳懼悕寰楀埌鐩稿叧緇撴瀯鐨勬寚閽?娉ㄦ剰瀹冭繑鍥炵殑鍙槸void*鎸囬拡
qt_metacall鐨勪綔鐢ㄦ槸鏌ヨ〃鐒跺悗璋冪敤璋冪敤鐩稿叧鐨勫嚱鏁?/p>

瀹廞T_TR_FUNCTIONS鏄拰緲昏瘧鐩稿叧鐨?br>#  define QT_TR_FUNCTIONS \
static inline QString tr(const char *s, const char *c = 0) \
{ return staticMetaObject.tr(s, c); }

濂戒簡,鐪嬬湅瀹為檯鐨勪緥瀛愬惂:

QPushButton鐨勫厓鏁版嵁琛ㄥ涓?
static const uint qt_meta_data_QPushButton[] = {

 // content:
1,       // revision
0,       // classname
0,    0, // classinfo
2,   10, // methods
3,   20, // properties
0,    0, // enums/sets

 // slots: signature, parameters, type, tag, flags
13,   12,   12,   12, 0x0a,
24,   12,   12,   12, 0x08,

 // properties: name, type, flags
44,   39, 0x01095103,
56,   39, 0x01095103,
64,   39, 0x01095103,

       0        // eod
};

static const char qt_meta_stringdata_QPushButton[] = {
"QPushButton\0\0showMenu()\0popupPressed()\0bool\0autoDefault\0default\0"
"flat\0"
};

const QMetaObject QPushButton::staticMetaObject = {
{ &QAbstractButton::staticMetaObject, qt_meta_stringdata_QPushButton,
qt_meta_data_QPushButton, 0 }
};

鍦ㄨ繖閲屾垜浠湅鍒頒簡闈欐佹垚鍛榮taticMetaObject琚~鍏呬簡
const QMetaObject *superdata;//榪欐槸鍏冩暟鎹唬琛ㄧ殑綾葷殑鍩虹被鐨勫厓鏁版嵁,琚~鍏呬負鍩虹被鐨勫厓鏁版嵁鎸囬拡&QAbstractButton::staticMetaObject
const char *stringdata;//榪欐槸鍏冩暟鎹殑絳懼悕鏍囪,琚~鍏呬負qt_meta_stringdata_QPushButton
const uint *data;//榪欐槸鍏冩暟鎹殑绱㈠紩鏁扮粍鐨勬寚閽?琚~鍏呬負qt_meta_data_QPushButton
const QMetaObject **extradata;//榪欐槸鎵╁睍鍏冩暟鎹〃鐨勬寚閽?涓鑸槸涓嶇敤鐨?琚~鍏呬負0

棣栧厛搴旇鐪媞t_meta_data_QPushButton,鍥犱負榪欓噷鏄厓鏁版嵁鐨勪富瑕佹暟鎹?瀹冭濉厖涓轟竴涓暣鏁版暟緇?姝e洜涓鴻繖閲屽彧鏈夋暣鏁?涓嶈兘鏈変換浣曞瓧絎︿覆瀛樺湪,鍥犳鎵嶆湁
qt_meta_stringdata_QPushButton鍙戞尌浣滅敤鐨勬満浼?鍙互璇寸湡姝g殑鍏冩暟鎹簲璇ユ槸qt_meta_data_QPushButton鍔犱笂qt_meta_stringdata_QPushButton,閭d箞涓轟粈涔?br>涓嶆妸榪欎袱涓笢瑗垮悎鍦ㄤ竴璧峰憿?浼拌鏄袱鑰呴兘涓嶆槸瀹氶暱鐨勭粨鏋?鍚堝湪涓璧峰弽鑰岄夯鐑﹀惂

qt_meta_data_QPushButton瀹為檯涓婃槸浠ヤ互涓嬬粨鏋勫紑澶寸殑

struct QMetaObjectPrivate
{
int revision;
int className;
int classInfoCount, classInfoData;
int methodCount, methodData;
int propertyCount, propertyData;
int enumeratorCount, enumeratorData;
};

涓鑸嬌鐢ㄤ腑鏄洿鎺ヤ嬌鐢ㄤ互涓嬪嚱鏁板仛涓漿鎹?br>static inline const QMetaObjectPrivate *priv(const uint* data)
{ return reinterpret_cast<const QMetaObjectPrivate*>(data); }

榪欑杞崲鎬庝箞鐪嬮兘鏈変簺榛戝鐨勫懗閬?榪欑‘瀹炴槸鍗佽凍鐨凜椋庢牸

鍐嶇粨鍚堝疄闄呯殑鏁版嵁鐪嬩竴鐪?br>static const uint qt_meta_data_QPushButton[] = {

 // content:
1,       // revision  鐗堟湰鍙鋒槸1
0,       // classname 綾誨悕瀛樺偍鍦╭t_meta_stringdata_QPushButton涓?绱㈠紩鏄?,鍥犳灝辨槸QPushButton浜?br>0,    0, // classinfo  綾諱俊鎭暟閲忎負0,鏁版嵁涔熸槸0
2,   10, // methods  QPushButton鏈?涓嚜瀹氫箟鏂規硶,鏂規硶鏁版嵁瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?0,灝辨槸涓嬮潰鐨剆lots:寮濮嬬殑鍦版柟
3,   20, // properties QPushButton鏈?涓嚜瀹氫箟灞炴?灞炴ф暟鎹瓨鍌ㄥ湪qt_meta_data_QPushButton涓?绱㈠紩鏄?0,灝辨槸涓嬮潰鐨刾roperties:寮濮嬬殑鍦版柟
0,    0, // enums/sets QPushButton娌℃湁鑷畾涔夌殑鏋氫婦

 // slots: signature, parameters, type, tag, flags
13,   12,   12,   12, 0x0a,
絎竴涓嚜瀹氫箟鏂規硶鐨勭鍚嶅瓨鍌ㄥ湪qt_meta_data_QPushButton涓?绱㈠紩鏄?3,灝辨槸showMenu()浜?br>24,   12,   12,   12, 0x08,
絎簩涓嚜瀹氫箟鏂規硶鐨勭鍚嶅瓨鍌ㄥ湪qt_meta_data_QPushButton涓?绱㈠紩鏄?4,popupPressed()浜?/p>

 // properties: name, type, flags
44,   39, 0x01095103,  
絎竴涓嚜瀹氫箟灞炴х殑絳懼悕瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?4,灝辨槸autoDefault浜?br>絎竴涓嚜瀹氫箟灞炴х殑綾誨瀷瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?9,灝辨槸bool
56,   39, 0x01095103,  
絎簩涓嚜瀹氫箟灞炴х殑絳懼悕瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?6,灝辨槸default浜?br>絎簩涓嚜瀹氫箟灞炴х殑綾誨瀷瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?9,灝辨槸bool
64,   39, 0x01095103,  
絎笁涓嚜瀹氫箟灞炴х殑絳懼悕瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?4,灝辨槸flat浜?br>絎笁涓嚜瀹氫箟灞炴х殑綾誨瀷瀛樺偍鍦╭t_meta_data_QPushButton涓?绱㈠紩鏄?9,灝辨槸bool

       0        // eod 鍏冩暟鎹殑緇撴潫鏍囪
};

static const char qt_meta_stringdata_QPushButton[] = {
"QPushButton\0\0showMenu()\0popupPressed()\0bool\0autoDefault\0default\0"
"flat\0"
};

QPushButton\\showMenu()\popupPressed()\bool\autoDefault\default\flat\
榪欓噷鎶奬0鐩存帴鏇挎崲涓篭鏄負浜嗘暟鏁扮殑鏂逛究

褰撶劧鎴戜滑榪樺彲浠ョ湅鐪婹PushButton鐨勫熀綾籕AbstractButton鐨勫厓鏁版嵁
static const uint qt_meta_data_QAbstractButton[] = {

 // content:
1,       // revision
0,       // classname
0,    0, // classinfo
12,   10, // methods
9,   70, // properties
0,    0, // enums/sets

 // signals: signature, parameters, type, tag, flags
17,   16,   16,   16, 0x05,
27,   16,   16,   16, 0x05,
46,   38,   16,   16, 0x05,
60,   16,   16,   16, 0x25,
70,   38,   16,   16, 0x05,

 // slots: signature, parameters, type, tag, flags
89,   84,   16,   16, 0x0a,
113,  108,   16,   16, 0x0a,
131,   16,   16,   16, 0x2a,
146,   16,   16,   16, 0x0a,
154,   16,   16,   16, 0x0a,
163,   16,   16,   16, 0x0a,
182,  180,   16,   16, 0x1a,

 // properties: name, type, flags
202,  194, 0x0a095103,
213,  207, 0x45095103,
224,  218, 0x15095103,
246,  233, 0x4c095103,
260,  255, 0x01095103,
38,  255, 0x01195103,
270,  255, 0x01095103,
281,  255, 0x01095103,
295,  255, 0x01094103,

       0        // eod
};

static const char qt_meta_stringdata_QAbstractButton[] = {
"QAbstractButton\0\0pressed()\0released()\0checked\0clicked(bool)\0"
"clicked()\0toggled(bool)\0size\0setIconSize(QSize)\0msec\0"
"animateClick(int)\0animateClick()\0click()\0toggle()\0setChecked(bool)\0"
"b\0setOn(bool)\0QString\0text\0QIcon\0icon\0QSize\0iconSize\0"
"QKeySequence\0shortcut\0bool\0checkable\0autoRepeat\0autoExclusive\0"
"down\0"
};

QAbstractButton00pressed()0released()0checked0clicked(bool)0clicked()0toggled(bool)0size0setIconSize(QSize)0msec0animateClick(int)0animateClick()0click()0toggle()0setChecked(bool)0b0setOn(bool)0QString0text0QIcon0icon0QSize0iconSize0QKeySequence0shortcut0bool0checkable0autoRepeat0autoExclusive0down0

鍩烘湰涓婇兘鏄ぇ鍚屽皬寮傜殑

  QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
涓嬮潰寮濮嬬湅淇″彿鍜屾Ы榪炴帴鐨勬簮鐮佷簡

// connect鐨勬簮鐮?br>connect鍑芥暟鏄繛鎺ヤ俊鍙峰拰妲界殑妗ユ錛岄潪甯稿叧閿?br>bool QObject::connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method,
Qt::ConnectionType type)
{
#ifndef QT_NO_DEBUG
bool warnCompat = true;
#endif
if (type == Qt::AutoCompatConnection) {
type = Qt::AutoConnection;
#ifndef QT_NO_DEBUG
warnCompat = false;
#endif
}

 // 涓嶅厑璁哥┖杈撳叆
if (sender == 0 || receiver == 0 || signal == 0 || method == 0) {
#ifndef QT_NO_DEBUG
qWarning("Object::connect: Cannot connect %s::%s to %s::%s",
sender ? sender->metaObject()->className() : "(null)",
signal ? signal+1 : "(null)",
receiver ? receiver->metaObject()->className() : "(null)",
method ? method+1 : "(null)");
#endif
return false;
}
QByteArray tmp_signal_name;

#ifndef QT_NO_DEBUG
// 媯鏌ユ槸鍚︽槸淇″彿鏍囪
if (!check_signal_macro(sender, signal, "connect", "bind"))
return false;
#endif
// 寰楀埌鍏冩暟鎹被
const QMetaObject *smeta = sender->metaObject();
++signal; //skip code璺寵繃淇″彿鏍囪,鐩存帴寰楀埌淇″彿鏍囪瘑
// 寰楀埌淇″彿鐨勭儲寮?br>int signal_index = smeta->indexOfSignal(signal);
if (signal_index < 0) {
// check for normalized signatures
tmp_signal_name = QMetaObject::normalizedSignature(signal).prepend(*(signal - 1));
signal = tmp_signal_name.constData() + 1;
signal_index = smeta->indexOfSignal(signal);
if (signal_index < 0) {
#ifndef QT_NO_DEBUG
err_method_notfound(QSIGNAL_CODE, sender, signal, "connect");
err_info_about_objects("connect", sender, receiver);
#endif
return false;
}
}

    QByteArray tmp_method_name;
int membcode = method[0] - '0';

#ifndef QT_NO_DEBUG
// 媯鏌ユ槸鍚︽槸妲?鐢≦SLOT_CODE 1鏍囪
if (!check_method_code(membcode, receiver, method, "connect"))
return false;
#endif
++method; // skip code

  // 寰楀埌鍏冩暟鎹被
const QMetaObject *rmeta = receiver->metaObject();
int method_index = -1;
// 榪欓噷鏄竴涓猚ase,淇″彿鍗沖彲浠ュ拰淇″彿榪炴帴涔熷彲浠ュ拰妲借繛鎺?br>switch (membcode) {
case QSLOT_CODE:
// 寰楀埌妲界殑绱㈠紩
method_index = rmeta->indexOfSlot(method);
break;
case QSIGNAL_CODE:
// 寰楀埌淇″彿鐨勭儲寮?br>method_index = rmeta->indexOfSignal(method);
break;
}
if (method_index < 0) {
// check for normalized methods
tmp_method_name = QMetaObject::normalizedSignature(method);
method = tmp_method_name.constData();
switch (membcode) {
case QSLOT_CODE:
method_index = rmeta->indexOfSlot(method);
break;
case QSIGNAL_CODE:
method_index = rmeta->indexOfSignal(method);
break;
}
}

    if (method_index < 0) {
#ifndef QT_NO_DEBUG
err_method_notfound(membcode, receiver, method, "connect");
err_info_about_objects("connect", sender, receiver);
#endif
return false;
}
#ifndef QT_NO_DEBUG
// 媯鏌ュ弬鏁?淇″彿鍜屾Ы鐨勫弬鏁板繀欏諱竴鑷?妲界殑鍙傛暟涔熷彲浠ュ皬浜庝俊鍙風殑鍙傛暟
if (!QMetaObject::checkConnectArgs(signal, method)) {
qWarning("Object::connect: Incompatible sender/receiver arguments"
"\n\t%s::%s --> %s::%s",
sender->metaObject()->className(), signal,
receiver->metaObject()->className(), method);
return false;
}
#endif

    int *types = 0;
if (type == Qt::QueuedConnection
&& !(types = ::queuedConnectionTypes(smeta->method(signal_index).parameterTypes())))
return false;

#ifndef QT_NO_DEBUG
{
// 寰楀埌鏂規硶鐨勫厓鏁版嵁
QMetaMethod smethod = smeta->method(signal_index);
QMetaMethod rmethod = rmeta->method(method_index);
if (warnCompat) {
if(smethod.attributes() & QMetaMethod::Compatibility) {
if (!(rmethod.attributes() & QMetaMethod::Compatibility))
qWarning("Object::connect: Connecting from COMPAT signal (%s::%s).", smeta->className(), signal);
} else if(rmethod.attributes() & QMetaMethod::Compatibility && membcode != QSIGNAL_CODE) {
qWarning("Object::connect: Connecting from %s::%s to COMPAT slot (%s::%s).",
smeta->className(), signal, rmeta->className(), method);
}
}
}
#endif
// 璋冪敤鍏冩暟鎹被鐨勮繛鎺?br>QMetaObject::connect(sender, signal_index, receiver, method_index, type, types);
// 鍙戦佽繛鎺ョ殑閫氱煡,鐜板湪鐨勫疄鐜版槸絀虹殑
const_cast<QObject*>(sender)->connectNotify(signal - 1);
return true;
}

媯鏌ヤ俊鍙鋒爣璁板叾瀹炴瘮杈冪畝鍗?灝辨槸鐢╯ignal鐨勭涓涓瓧絎﹀拰鐢≦SIGNAL_CODE=2鐨勬爣璁版瘮杈冭屽凡
static bool check_signal_macro(const QObject *sender, const char *signal,
const char *func, const char *op)
{
int sigcode = (int)(*signal) - '0';
if (sigcode != QSIGNAL_CODE) {
if (sigcode == QSLOT_CODE)
qWarning("Object::%s: Attempt to %s non-signal %s::%s",
func, op, sender->metaObject()->className(), signal+1);
else
qWarning("Object::%s: Use the SIGNAL macro to %s %s::%s",
func, op, sender->metaObject()->className(), signal);
return false;
}
return true;
}

寰楀埌淇″彿鐨勭儲寮曞疄闄呬笂瑕佷緷嬈℃壘姣忎釜鍩虹被鐨勫厓鏁版嵁,寰楀埌鐨勫亸縐諱篃鏄墍鏈夊厓鏁版嵁琛ㄥ姞鍦ㄤ竴璧峰悗鐨勪竴涓儲寮?br>int QMetaObject::indexOfSignal(const char *signal) const
{
int i = -1;
const QMetaObject *m = this;
while (m && i < 0) {
// 鏍規嵁鏂規硶鐨勬暟鐩掑簭鐨勬煡鎵?br>for (i = priv(m->d.data)->methodCount-1; i >= 0; --i)
// 寰楀埌璇ユ柟娉曠殑綾誨瀷
if ((m->d.data[priv(m->d.data)->methodData + 5*i + 4] & MethodTypeMask) == MethodSignal
&& strcmp(signal, m->d.stringdata
// 寰楀埌鏂規硶鍚嶇О鐨勫亸縐?br>+ m->d.data[priv(m->d.data)->methodData + 5*i]) == 0) {
//濡傛灉鎵懼埌浜嗘紜殑鏂規硶,鍐嶅鍔犳墍鏈夊熀綾葷殑鏂規硶鍋忕Щ閲?br>i += m->methodOffset();
break;
}
// 鍦ㄧ埗綾諱腑緇х畫鎵?br>m = m->d.superdata;
}
#ifndef QT_NO_DEBUG
// 鍒ゆ柇鏄惁浜庡熀綾諱腑鐨勫啿紿?br>if (i >= 0 && m && m->d.superdata) {
int conflict = m->d.superdata->indexOfMethod(signal);
if (conflict >= 0)
qWarning("QMetaObject::indexOfSignal:%s: Conflict with %s::%s",
m->d.stringdata, m->d.superdata->d.stringdata, signal);
}
#endif
return i;
}

// 榪欓噷鏄墍鏈夊熀綾葷殑鏂規硶鍋忕Щ閲忕畻娉?灝辨槸绱姞鍩虹被鎵鏈夌殑鏂規硶鏁扮洰
int QMetaObject::methodOffset() const
{
int offset = 0;
const QMetaObject *m = d.superdata;
while (m) {
offset += priv(m->d.data)->methodCount;
m = m->d.superdata;
}
return offset;
}

// 寰楀埌鏂規硶鐨勫厓鏁版嵁
QMetaMethod QMetaObject::method(int index) const
{
int i = index;
// 瑕佸噺鍘誨熀綾葷殑鍋忕Щ
i -= methodOffset();
// 濡傛灉鏈被鎵句笉鍒?灝卞埌鍩虹被涓幓鎵?br>if (i < 0 && d.superdata)
return d.superdata->method(index);

 // 濡傛灉鎵懼埌浜?灝卞~鍏匭MetaMethod緇撴瀯
QMetaMethod result;
if (i >= 0 && i < priv(d.data)->methodCount) {
// 榪欓噷鏄被鐨勫厓鏁版嵁
result.mobj = this;
// 榪欓噷鏄柟娉曠浉鍏蟲暟鎹湪data鏁扮粍涓殑鍋忕Щ閲?br>result.handle = priv(d.data)->methodData + 5*i;
}
return result;
}

bool QMetaObject::connect(const QObject *sender, int signal_index,
const QObject *receiver, int method_index, int type, int *types)
{
// 寰楀埌鍏ㄥ眬鐨勮繛鎺ュ垪琛?br>QConnectionList *list = ::connectionList();
if (!list)
return false;
QWriteLocker locker(&list->lock);
// 澧炲姞涓涓繛鎺?br>list->addConnection(const_cast<QObject *>(sender), signal_index,
const_cast<QObject *>(receiver), method_index, type, types);
return true;
}

void QConnectionList::addConnection(QObject *sender, int signal,
QObject *receiver, int method,
int type, int *types)
{
// 鏋勯犱竴涓繛鎺?br>QConnection c = { sender, signal, receiver, method, 0, 0, types };
c.type = type; // don't warn on VC++6
int at = -1;
// 濡傛灉鏈変腑闂磋鍒犻櫎鐨勮繛鎺?鍙互閲嶇敤榪欎釜絀洪棿
for (int i = 0; i < unusedConnections.size(); ++i) {
if (!connections.at(unusedConnections.at(i)).inUse) {
// reuse an unused connection
at = unusedConnections.takeAt(i);
connections[at] = c;
break;
}
}
if (at == -1) {
// append new connection
at = connections.size();
// 鍔犲叆涓涓繛鎺?br>connections << c;
}
// 鏋勯爏ender,receiver榪炴帴鐨勫搱甯岃〃,鍔犻熸悳绱㈤熷害
sendersHash.insert(sender, at);
receiversHash.insert(receiver, at);
}

閫氳繃connect鍑芥暟,鎴戜滑寤虹珛浜嗕俊鍙峰拰妲界殑榪炴帴,騫朵笖鎶婁俊鍙風被+淇″彿绱㈠紩+妲界被,妲界儲寮曚綔涓鴻褰曞啓鍒頒簡鍏ㄥ眬鐨刢onnect鍒楄〃涓?/p>

涓鏃︽垜浠彂閫佷簡淇″彿,灝卞簲璇ヨ皟鐢ㄧ浉鍏蟲Ы涓殑鏂規硶浜?榪欎釜榪囩▼鍏跺疄灝辨槸鏌ユ壘鍏ㄥ眬鐨刢onnect鍒楄〃鐨勮繃紼?褰撶劧榪樿娉ㄦ剰鍏朵腑瑕佸鐩稿叧鐨勫弬鏁版墦鍖呭拰瑙e寘

// emit鏄彂閫佷俊鍙風殑浠g爜
void Foo::setValue(int v)
{
if (v != val)
{
val = v;
emit valueChanged(v);
}
}

// 鍙戦佷俊鍙風殑鐪熸瀹炵幇鍦╩oc閲岄潰
// SIGNAL 0
void Foo::valueChanged(int _t1)
{
// 棣栧厛鎶婂弬鏁版墦鍖?br>void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
// 璋冪敤鍏冩暟鎹被鐨勬縺媧?br>QMetaObject::activate(this, &staticMetaObject, 0, _a);
}

void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_signal_index,
void **argv)
{
// 澧炲姞涓涓熀綾誨亸縐婚噺
int offset = m->methodOffset();
activate(sender, offset + local_signal_index, offset + local_signal_index, argv);
}

void QMetaObject::activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv)
{
// 榪欓噷寰楀埌鐨勬槸QObject鐨勬暟鎹?棣栧厛鍒ゆ柇鏄惁涓洪樆濉炶緗?br>if (sender->d_func()->blockSig)
return;

 // 寰楀埌鍏ㄥ眬閾捐〃
QConnectionList * const list = ::connectionList();
if (!list)
return;

    QReadLocker locker(&list->lock);

    void *empty_argv[] = { 0 };
if (qt_signal_spy_callback_set.signal_begin_callback != 0) {
locker.unlock();
qt_signal_spy_callback_set.signal_begin_callback(sender, from_signal_index,
argv ? argv : empty_argv);
locker.relock();
}

 // 鍦╯ender鐨勫搱甯岃〃涓緱鍒皊ender鐨勮繛鎺?br>QConnectionList::Hash::const_iterator it = list->sendersHash.find(sender);
const QConnectionList::Hash::const_iterator end = list->sendersHash.constEnd();

    if (it == end) {
if (qt_signal_spy_callback_set.signal_end_callback != 0) {
locker.unlock();
qt_signal_spy_callback_set.signal_end_callback(sender, from_signal_index);
locker.relock();
}
return;
}

    QThread * const currentThread = QThread::currentThread();
const int currentQThreadId = currentThread ? QThreadData::get(currentThread)->id : -1;

 // 璁板綍sender榪炴帴鐨勭儲寮?br>QVarLengthArray<int> connections;
for (; it != end && it.key() == sender; ++it) {
connections.append(it.value());
// 鎵撲笂浣跨敤鏍囪,鍥犱負鍙兘鏄斁鍦ㄩ槦鍒椾腑
list->connections[it.value()].inUse = 1;
}

    for (int i = 0; i < connections.size(); ++i) {
const int at = connections.constData()[connections.size() - (i + 1)];
QConnectionList * const list = ::connectionList();
// 寰楀埌榪炴帴
QConnection &c = list->connections[at];
c.inUse = 0;
if (!c.receiver || (c.signal < from_signal_index || c.signal > to_signal_index))
continue;

  // 鍒ゆ柇鏄惁鏀懼埌闃熷垪涓?br>// determine if this connection should be sent immediately or
// put into the event queue
if ((c.type == Qt::AutoConnection
&& (currentQThreadId != sender->d_func()->thread
|| c.receiver->d_func()->thread != sender->d_func()->thread))
|| (c.type == Qt::QueuedConnection)) {
::queued_activate(sender, c, argv);
continue;
}

  // 涓簉eceiver璁劇疆褰撳墠鍙戦佽?br>const int method = c.method;
QObject * const previousSender = c.receiver->d_func()->currentSender;
c.receiver->d_func()->currentSender = sender;
list->lock.unlock();

        if (qt_signal_spy_callback_set.slot_begin_callback != 0)
qt_signal_spy_callback_set.slot_begin_callback(c.receiver, method, argv ? argv : empty_argv);

#if defined(QT_NO_EXCEPTIONS)
c.receiver->qt_metacall(QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
#else
try {
// 璋冪敤receiver鐨勬柟娉?br>c.receiver->qt_metacall(QMetaObject::InvokeMetaMethod, method, argv ? argv : empty_argv);
} catch (...) {
list->lock.lockForRead();
if (c.receiver)
c.receiver->d_func()->currentSender = previousSender;
throw;
}
#endif

        if (qt_signal_spy_callback_set.slot_end_callback != 0)
qt_signal_spy_callback_set.slot_end_callback(c.receiver, method);

        list->lock.lockForRead();
if (c.receiver)
c.receiver->d_func()->currentSender = previousSender;
}

    if (qt_signal_spy_callback_set.signal_end_callback != 0) {
locker.unlock();
qt_signal_spy_callback_set.signal_end_callback(sender, from_signal_index);
locker.relock();
}
}

// 鍝嶅簲淇″彿涔熸槸鍦╩oc閲屽疄鐜扮殑
int Foo::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
// 棣栧厛鍦ㄥ熀綾諱腑璋冪敤鏂規硶,榪斿洖鐨刬d宸茬粡鍙樻垚褰撳墠綾葷殑鏂規硶id浜?br>_id = QObject::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
// 榪欓噷灝辨槸鐪熸鐨勮皟鐢ㄦ柟娉曚簡,娉ㄦ剰鍙傛暟鐨勮В鍖呯敤娉?br>case 0: valueChanged(*reinterpret_cast< int(*)>(_a[1])); break;
case 1: setValue(*reinterpret_cast< int(*)>(_a[1])); break;
}
_id -= 2;
}
return _id;
}


]]>Android 鐨勬秷鎭槦鍒楁ā鍨嬶紙杞級http://m.shnenglu.com/Walker/articles/145869.html婕鑰吤?amp;鈥︹?錕?/dc:creator>婕鑰吤?amp;鈥︹?錕?/author>Fri, 06 May 2011 23:53:00 GMThttp://m.shnenglu.com/Walker/articles/145869.htmlhttp://m.shnenglu.com/Walker/comments/145869.htmlhttp://m.shnenglu.com/Walker/articles/145869.html#Feedback0http://m.shnenglu.com/Walker/comments/commentRss/145869.htmlhttp://m.shnenglu.com/Walker/services/trackbacks/145869.html鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/ghj1976/archive/2011/05/06/6398896.aspx

Android鏄弬鑰僕indows鐨勬秷鎭驚鐜満鍒舵潵瀹炵幇Android鑷韓鐨勬秷鎭驚鐜殑銆?
Android閫氳繃Looper銆丠andler鏉ュ疄鐜版秷鎭驚鐜満鍒訛紝Android娑堟伅寰幆鏄拡瀵圭嚎紼嬬殑錛堟瘡涓嚎紼嬮兘鍙互鏈夎嚜宸辯殑娑堟伅闃熷垪鍜屾秷鎭驚鐜級銆?
Android緋葷粺涓紝Looper璐熻矗綆$悊綰跨▼鐨勬秷鎭槦鍒楀拰娑堟伅寰幆銆傛垜浠彲浠ラ氳繃Loop.myLooper()寰楀埌褰撳墠綰跨▼鐨凩ooper瀵硅薄錛岄氳繃Loop.getMainLooper()鍙互鑾峰緱褰撳墠榪涚▼鐨勪富綰跨▼鐨凩ooper瀵硅薄銆?
涓涓嚎紼嬪彲浠ュ瓨鍦紙褰撶劧涔熷彲浠ヤ笉瀛樺湪錛変竴涓秷鎭槦鍒楀拰涓涓秷鎭驚鐜紙Looper錛夈?
Activity鏄竴涓猆I綰跨▼錛岃繍琛屼簬涓葷嚎紼嬩腑錛孉ndroid緋葷粺鍦ㄥ惎鍔ㄧ殑鏃跺欎細涓篈ctivity鍒涘緩涓涓秷鎭槦鍒楀拰娑堟伅寰幆錛圠ooper錛夈?
Handler鐨勪綔鐢ㄦ槸鎶婃秷鎭姞鍏ョ壒瀹氱殑錛圠ooper錛夋秷鎭槦鍒椾腑錛屽茍鍒嗗彂鍜屽鐞嗚娑堟伅闃熷垪涓殑娑堟伅銆傛瀯閫燞andler鐨勬椂鍊欏彲浠ユ寚瀹氫竴涓狶ooper瀵硅薄錛屽鏋滀笉鎸囧畾鍒欏埄鐢ㄥ綋鍓嶇嚎紼嬬殑Looper鍒涘緩銆?
Activity銆丩ooper銆丠andler錛孴hread鐨勫叧緋誨涓嬪浘鎵紺猴細

 

涓涓狝ctivity涓彲浠ュ垱寤哄涓伐浣滅嚎紼嬫垨鑰呭叾浠栫殑緇勪歡錛屽鏋滆繖浜涚嚎紼嬫垨鑰呯粍浠舵妸浠栦滑鐨勬秷鎭斁鍏ctivity鐨勪富綰跨▼娑堟伅闃熷垪錛岄偅涔堣娑堟伅灝變細鍦ㄤ富綰跨▼涓鐞嗕簡銆?/p>

鍥犱負涓葷嚎紼嬩竴鑸礋璐g晫闈㈢殑鏇存柊鎿嶄綔錛屽茍涓擜ndroid緋葷粺涓殑widget涓嶆槸綰跨▼瀹夊叏鐨勶紝鎵浠ヨ繖縐嶆柟寮忓彲浠ュ緢濂界殑瀹炵幇Android鐣岄潰鏇存柊銆傚湪Android緋葷粺涓繖縐嶆柟寮忔湁鐫騫挎硾鐨勮繍鐢ㄣ?

閭d箞涓涓嚎紼嬫庢牱鎶婃秷鎭斁鍏ヤ富綰跨▼鐨勬秷鎭槦鍒楀憿錛熺瓟妗堟槸閫氳繃Handle瀵硅薄錛屽彧瑕丠andler瀵硅薄浠ヤ富綰跨▼鐨凩ooper鍒涘緩錛岄偅涔堣皟鐢℉andler鐨剆endMessage絳夋帴鍙o紝灝嗕細鎶婃秷鎭斁鍏ラ槦鍒楅兘灝嗘槸鏀懼叆涓葷嚎紼嬬殑娑堟伅闃熷垪銆傚茍涓斿皢浼氬湪Handler涓葷嚎紼嬩腑璋冪敤璇andler鐨刪andleMessage鎺ュ彛鏉ュ鐞嗘秷鎭?/p>

鏇村Android娑堟伅闃熷垪鐨勪俊鎭鍙傜湅錛?http://my.unix-center.net/~Simon_fu/?p=652

涓嬮潰榪欎釜鍥句粠鍙﹀涓涓搴︽弿榪頒簡浠栦滑鐨勫叧緋伙細

 

鍙傝冭祫鏂欙細

Android寮傛鍔犺澆鍥懼儚灝忕粨
http://blog.csdn.net/sgl870927/archive/2011/03/29/6285535.aspx

娣卞叆鐞嗚ВAndroid娑堟伅澶勭悊緋葷粺鈥斺擫ooper銆丠andler銆乀hread

http://my.unix-center.net/~Simon_fu/?p=652

Android綰跨▼妯″瀷錛圥ainless Threading錛?
http://android.group.iteye.com/group/blog/382683

android綰跨▼鎺у埗UI鏇存柊錛圚andler 銆乸ost()銆乸ostDelayed()銆乸ostAtTime錛?
http://lepeng.net/blogger/?p=21

Android – Multithreading in a UI environment
http://www.aviyehuda.com/2010/12/android-multithreading-in-a-ui-environment/

Android涓殑Handler, Looper, MessageQueue鍜孴hread
http://www.cnblogs.com/xirihanlin/archive/2011/04/11/2012746.html

Android Runnable
http://blog.csdn.net/michaelpp/archive/2010/06/30/5704682.aspx


 



]]>
Chrome鐨勫皬鑳$摐(Courgette) http://m.shnenglu.com/Walker/articles/145114.html婕鑰吤?amp;鈥︹?錕?/dc:creator>婕鑰吤?amp;鈥︹?錕?/author>Tue, 26 Apr 2011 23:54:00 GMThttp://m.shnenglu.com/Walker/articles/145114.htmlhttp://m.shnenglu.com/Walker/comments/145114.htmlhttp://m.shnenglu.com/Walker/articles/145114.html#Feedback0http://m.shnenglu.com/Walker/comments/commentRss/145114.htmlhttp://m.shnenglu.com/Walker/services/trackbacks/145114.htmlChrome鐨勫皬鑳$摐(Courgette) 鏀惰棌

杞嚜http://blog.csdn.net/xingtian713/archive/2009/08/25/4483810.aspx


鍦–hrome涓湁涓涓緢鏈夋剰鎬濈殑宸ュ叿courgette錛岀炕璇戞垚涓枃鏄皬鑳$摐鐨勬剰鎬濄傛垜寰堥毦鎶婅繖涓崟璇嶅拰榪欎釜灝忓伐鍏瘋仈緋誨湪涓璧鳳紝涔熻浣滆呮瘮杈冨亸鐖辮繖涓敩鑿滃惂錛?

鑳屾櫙
鎴戜滑鐢–++緙栧啓紼嬪簭鏃訛紝緇忓父浼氬嚭鐜頒慨鏀逛簡涓琛屼唬鐮侊紝閲嶆柊緙栬瘧涓涓嬩箣鍚庯紝鍐嶅幓瀵規瘮涓涓嬫柊鐨勪簩榪涘埗鏂囦歡錛屽氨鍙互鍙戠幇鍗冨樊涓囧埆浜嗐傚線寰鍑虹幇鎴戜滑瑕佸彂甯冧竴涓慨鏀逛簡涓琛屼唬鐮佺殑琛ヤ竵錛岄渶瑕佹浛鎹㈡暣涓狣LL鎴栬匛XE銆傝繖瀵逛簬Chrome涓被浼間簬Chrome.dll錛?0M宸﹀彸錛夋枃浠舵潵璇達紝鍗囩駭涓嬈$殑浠d環榪樻槸鎸洪珮鐨勩傛湰浜哄湪鍘誨勾涓嬪崐騫磋礋璐g殑涓涓崌綰ф湇鍔″櫒欏圭洰涓紝灝辨浘鍔ㄨ繃蹇靛ご錛屾槸鍚︽湁涓縐嶆柟娉曞彲浠ュ鎵懼嚭涓や釜浜岃繘鍒舵枃浠剁殑宸紓錛屽皢榪欎釜宸紓鎵撴垚涓涓ˉ涓侊紝鐢ㄦ埛涓嬭澆鍚庯紝鍙互閫氳繃榪欎釜琛ヤ竵錛屽彲浠ヨ嚜鍔ㄧ敓鎴愭柊鐨凞LL銆傚彲鎯滃姛鍔涗笉澶燂紝鏈鍚庢斁寮冧簡銆傛渶榪戣Chrome鐨勪唬鐮佹椂錛屽彂鐜癈hrome宸茬粡瀹炵幇浜嗚鍔熻兘銆傝繖涓氨鏄疌ourgette鐨勫姛鍔充簡銆?

Courgette鍋氫粈涔堢殑錛?
Courgette涓昏鐢ㄤ簬Chrome鐨勫崌綰ц繃紼嬶紝浠栫殑涓昏浣滅敤鏄紝閽堝涓や釜鐗堟湰涓嶅悓鐨勪簩榪涘埗鏂囦歡(Binary File)錛屽鎵懼叾涓尯鍒紝鐢熸垚琛ヤ竵鏂囦歡錛涘彟澶栧氨鏄牴鎹繖涓ˉ涓佹枃浠跺姞涓婃棫鐗堟湰鐨勪簩榪涘埗鏂囦歡鐢熸垚鏂扮増鏈殑浜岃繘鍒舵枃浠剁殑榪樺師榪囩▼浜嗐傜被浼間簬鍔犺В瀵嗘祦紼嬨?

Courgette鐨勫疄鐜板師鐞嗭紵
Courgette鏋勫緩鍦ㄤ竴涓紑婧愪唬鐮乥sdiff鍜宐spatch 鍩虹涓婄殑銆傚茍鍦╞sdiff鐨勫熀紜涓婂仛浜嗕竴浜涗紭鍖栥?

鏈漢鏄崐璺嚭瀹剁殑浜猴紝瀵圭紪璇戝師鐞嗗拰姹囩紪浜嗚В涓嶆繁錛屾寜鐓ф垜瀵筨sdiff鐨勭畻娉?鐞嗚В錛屼竴涓簩榪涘埗鏂囦歡閲岄潰錛屽寘鍚簡浠g爜閮ㄥ垎錛堝嚱鏁幫紝鏁版嵁錛夛紝鎸囧悜榪欎簺鍑芥暟鐨勬寚閽堝垪琛紙緙栬瘧閾炬帴浜х敓錛屽寘鍚簡濡備綍瀹氫綅鍑芥暟絳変俊鎭級錛岀敱浜庤繖浜涘湴鍧鏄唴閮ㄧ殑鐩稿鍦板潃錛屽嵆浣挎洿鏀逛簡涓灝忚浠g爜錛岄噸鏂扮紪璇戝悗錛屽嚱鏁扮殑鍦板潃灝嗗彂鐢熷彉鍖栦簡錛屾寚鍚戣繖浜涘嚱鏁扮殑鎸囬拡鍊間篃鍏ㄩ儴鍙樺寲浜嗐傚洜姝わ紝鍗充嬌鏇存敼浜嗕竴涓皬灝忕殑鍙橀噺錛屼篃浼氬鑷村緢澶氶儴鍒嗙殑淇敼銆俠sdiff鐨勫師鐞嗗氨鏄浜岃繘鍒舵枃浠惰繘琛屽弽姹囩紪錛屽皢涓婇潰鎵璇寸殑涓ら儴鍒嗚繘琛屽垎鍒鐞嗭紝瀵逛簬浠g爜閮ㄥ垎錛屽叾瀹炲氨鍜屾櫘閫氱殑鏂囨湰鏂囦歡綾諱技浜嗭紝鏀瑰彉涓嶄細澶ぇ錛岃繖閮ㄥ垎浣撶Н鍩烘湰涓婂崰鍘諱簡鏁翠釜浜岃繘鍒舵枃浠剁殑80%宸﹀彸銆傜劧鍚庡鍔ㄦ佹寚閽堥儴鍒嗚繘琛屼竴浜涙洿鏂板鐞嗭紝灝卞熀鏈笂杈懼埌浜嗘墦琛ヤ竵鐨勭洰鏍囦簡銆?

    server:

        diff = bsdiff(original, update)

        transmit diff


    client:

        receive diff

        update = bspatch(original, diff)
澶ц嚧嫻佺▼濡備笂錛屽埗浣滆ˉ涓佹椂璋冪敤bsdiff鍑芥暟錛屾牴鎹袱涓笉鍚岀増鏈殑浜岃繘鍒舵枃浠訛紝鐢熸垚琛ヤ竵鏂囦歡銆傚鎴風涓嬭澆琛ヤ竵鍚庯紝璋冪敤bspatch鍑芥暟錛屾牴鎹棫鐗堟湰浜岃繘鍒舵枃浠跺拰琛ヤ竵鐢熸垚鏂扮殑浜岃繘鍒舵枃浠躲?/p>

Chrome鍦╞sdiff鐨勫熀紜涓婂仛浜嗕竴浜涗紭鍖栵紝涓昏浣撶幇鍦ㄥ姩鎬佹寚閽堝垪琛ㄩ儴鍒嗭紝chrome瀵逛唬鐮侀儴鍒嗙殑姣忎竴涓ā鍧楀湴鍧鍒嗛厤浜嗕竴涓爣絳撅紙Label錛夛紝榪欎簺鏍囩閮芥槸鏁存暟錛屽茍鎶婅繖浜涙爣絳句繚瀛樺埌涓涓暟緇勪腑錛岀劧鍚庢寚閽堝垪琛ㄤ腑鏄犲皠鐨勫湴鍧鏀逛負鎸囧悜鏁扮粍鐨勭儲寮曪紝鐢變簬涓浜涘嚱鏁板湴鍧琚皟鐢ㄥ嬈★紝閫氳繃榪欑鏂規硶紜疄鍙互鍑忓皯涓浜涗綋縐傚仛浜嗕竴浜涗紭鍖栧悗錛屽湪bsdiff鐨勫熀紜涓婂張鍑忓皯浜?0%宸﹀彸鍚э紙榪欐槸google鐨勮娉曪紝鎴戞病楠岃瘉榪囷級銆?
    server:
        asm_old = disassemble(original)
        asm_new = disassemble(update)
        asm_new_adjusted = adjust(asm_new, asm_old)
        asm_diff = bsdiff(asm_old, asm_new_adjusted)
        transmit asm_diff


    client:
        receive asm_diff
        asm_old = disassemble(original)
        asm_new_adjusted = bspatch(asm_old, asm_diff)
        update = assemble(asm_new_adjusted)
Chrome鐨勫ぇ鑷村鐞嗘祦紼嬪涓婏紝鍜宐sdiff嫻佺▼綾諱技錛屽浜?asm_new_adjusted = adjust(asm_new, asm_old)榪欎竴涓楠わ紝榪欎釜姝ラ涓昏灝辨槸涓婇潰璇寸殑瀵瑰湴鍧鏍囩鍖栫殑榪囩▼銆?/p>

]]>
chrome 婧愮爜鍒嗘瀽http://m.shnenglu.com/Walker/articles/145113.html婕鑰吤?amp;鈥︹?錕?/dc:creator>婕鑰吤?amp;鈥︹?錕?/author>Tue, 26 Apr 2011 23:52:00 GMThttp://m.shnenglu.com/Walker/articles/145113.htmlhttp://m.shnenglu.com/Walker/comments/145113.htmlhttp://m.shnenglu.com/Walker/articles/145113.html#Feedback0http://m.shnenglu.com/Walker/comments/commentRss/145113.htmlhttp://m.shnenglu.com/Walker/services/trackbacks/145113.html
涓轟簡瀵瑰簽澶х殑婧愮爜欏圭洰榪涜鍒嗘瀽錛屽厛瀵規簮鐮佺洰褰曟爲浣滀竴涓畝鍗曠殑浠嬬粛錛岀矖鐣ョ殑浜嗚В涓涓嬪悇涓ā鍧楃殑鍔熻兘鍒嗗竷鎯呭喌錛宑hrome婧愪唬鐮乻rc鐩綍涓嬬殑緇撴瀯濡備笅鍥撅細

銆銆app錛氳鐩綍涓嬬殑浠g爜涓昏鏄拰鍚勪釜鎿嶄綔緋葷粺騫沖彴鐩稿叧鐨勫簲鐢ㄤ笂灞備唬鐮佺殑鎻愮偧銆備笉鍚屾搷浣滅郴緇熷彲鑳藉搴斾笉鍚岀殑c++瀹炵幇鏂囦歡銆傛瘮濡傝鍓澘鎿嶄綔銆佹搷浣滅郴緇熸暟鎹氦鎹㈡帴鍙c佽祫婧愮鐞嗙瓑銆備唬鐮侀噺涓嶅ぇ銆?/p>

銆銆base錛氬熀紜璁炬柦浠g爜錛岃鐩綍涓嬬殑浠g爜瀵圭悊瑙hrome鐨勫熀紜鏋舵瀯璁捐鏄繀涓嶅彲灝戠殑錛岃繖閲岄潰鏄ぇ閲忕殑宸ュ叿鎬с佹鏋舵т唬鐮佸疄鐜幫紝姣斿瀵硅繘紼嬨佺嚎紼嬨佹秷鎭驚鐜殑緇熶竴灝佽錛屽瀛楃涓插鐞嗐乧++瀵硅薄鐢熷懡鍛ㄦ湡綆$悊銆乯son瑙f瀽銆佽礬寰勬湇鍔°佹棩鏈熸椂闂淬佹棩蹇楁鏋剁瓑銆?/p>

銆銆breakpad錛氬穿婧冩湇鍔℃鏋跺簱錛屽湪紼嬪簭鍙戠敓寮傚父鏃訛紝瀵瑰紓甯歌繘琛屾崟鑾峰悗鍙互灝嗗穿婧冪幇鍦烘暟鎹彂閫佺粰google榪涜鍒嗘瀽銆?/p>

銆銆build錛氱紪璇戞瀯寤虹浉鍏崇殑宸ュ叿鏀寔銆?/p>

銆銆chrome錛氭祻瑙堝櫒涓葷▼搴忓疄鐜頒唬鐮侊紝鍖呮嫭浜哢I瀹炵幇鍜孯ender閮ㄥ垎涓ゅぇ閮ㄥ垎錛屽綋鐒惰繖涓ら儴鍒嗗張鏄互澶ч噺鐨勫叾浠栧熀紜璁炬柦浠g爜涓哄熀紜鐨勶紝姣斿Render閮ㄥ垎鏄webkit鐨勫皝瑁呫傝繖閮ㄥ垎浠g爜閲忓緢澶э紝google鑷駭浠g爜錛岄綣佺殑鏀瑰姩浠g爜涓昏闆嗕腑鍦ㄨ繖閲屻?/p>

銆銆chrome_frame錛氳繖鏄痝oogle閽堝IE寮鍙戠殑涓涓彃浠訛紝浣垮緱IE鍙互浣跨敤chrome鐨勬覆鏌撳紩鎿庢潵鏄劇ず緗戦〉銆?/p>

銆銆courgette錛氬皬鑳$摐錛岃繖涓」鐩槸涓涓拡瀵瑰崌綰т嬌鐢ㄧ殑錛岀洰鐨勬槸鍑忓皯鍗囩駭榪囩▼涓暟鎹笅杞界殑澶у皬銆傛瘮濡傜増鏈崌綰у彲鑳介渶瑕佹洿鏂版煇涓狣LL鏂囦歡錛岃岃繖涓枃浠跺彲鑳芥湁10M澶у皬錛岃屾柊鐗堟湰鍙兘鍙槸瀵硅DLL鏀瑰姩浜嗕竴琛屼唬鐮併傞氳繃courgette鍙互鎵懼嚭榪欎袱涓狣LL涔嬮棿鐨勫樊寮傞儴鍒嗭紝浣垮緱涓嶉渶瑕佷笅杞?0M澶у皬錛岃屽彲鑳藉彧闇瑕佷笅杞藉嚑鍗並鐨勫樊寮傛弿榪版暟鎹嵆鍙畬鎴愬崌綰с?/p>

銆銆gears錛氭槸涓涓敤鏉ュ紑鍙戠綰跨綉緇滃簲鐢ㄧ殑宸ュ叿錛屾槸涓涓狫avaScript搴旂敤緙栫▼鎺ュ彛錛岄氳繃Google Gears鍙互鍏佽澶氱Web搴旂敤紼嬪簭鑴辨満榪愯錛屽彲浠ヨ鐢ㄦ埛鍦ㄤ笂綰挎垨鑰呯綰跨姸鎬佷笅榪愯緗戠粶紼嬪簭銆傜綰垮氨闇瑕佷綔鏈湴瀛樺偍錛岃屽湪html5涓氨鏈夋湰鍦板瓨鍌ㄧ浉鍏崇殑鎺ュ彛瑙勮寖錛屽洜姝oogle灝嗘斁寮僩ears鑰岄噰鐢╤tml5鐨勬柟寮忋?/p>

銆銆google_update錛歡oogle鏇存柊錛岀敤浜庤嚜鍔ㄥ崌綰с?/p>

銆銆googleurl錛歡oogle瀹炵幇鐨刄RL瑙f瀽杈呭姪宸ュ叿搴撱?/p>

銆銆ipc錛氶潪甯擱噸瑕佺殑榪涚▼閫氫俊鍩虹璁炬柦搴撱俢hrome鏄榪涚▼鏋舵瀯錛岃岃繘紼嬮棿鐨勯氫俊灝辨槸浠pc搴撲綔涓哄熀紜鏀寔鐨勩傚叿浣撳湪windows涓嬬殑瀹炵幇鏂瑰紡鏄懡鍚嶇閬撱佸紓姝O錛堝畬鎴愮鍙o級銆佸叡浜唴瀛樻潵瀹炵幇榪涚▼闂撮珮鏁堢殑鏁版嵁浼犺緭銆俰pc涓嶄粎灝佽浜咺O鏈哄埗錛岃屼笖榪樺畾涔変簡緇熶竴鐨勬秷鎭紶杈撴牸寮忋?/p>

銆銆media錛氬濯掍綋闊抽瑙嗛瑙g爜鐩稿叧鐨勫唴瀹廣?/p>

銆銆native_client錛氬湪嫻忚鍣ㄤ腑榪愯native浠g爜鐨勬妧鏈紝鏄竴涓彃浠躲俷ative_client欏圭洰琚涓哄井杞疉ctiveX鎶鏈殑緇т換鑰呫傞」鐩叿浣撶粏鑺傚彲鍙傝?a target=_blank>native client瀹樼綉銆?/p>

銆銆net錛氱綉緇滃崗璁疄鐜板熀紜搴擄紝鍖呮嫭ftp銆乭ttp絳夊鎴風鍗忚鏍堢殑瀹炵幇浠g爜銆?/p>

銆銆o3d錛氫竴涓彃浠訛紝鍙湪嫻忚鍣ㄤ腑鍒涘緩涓板瘜鐨勪氦浜掑紡涓夌淮搴旂敤紼嬪簭錛屼互鍚庡湪嫻忚鍣ㄤ腑鐜?D娓告垙灝嗕笉鍐嶉仴榪溿傚叿浣撶粏鑺傚弬鑰?a target=_blank>o3d欏圭洰瀹樼綉銆?/p>

銆銆printing錛氭墦鍗版柟闈㈢殑鍐呭銆?/p>

銆銆rlz錛氱敤鎴瘋涓鴻拷韙紝榪欎釜娌℃湁婧愮爜錛岃繖涓簱鐨勭洰鐨勫氨鏄皢鐢ㄦ埛琛屼負鏀墮泦鎶ュ憡緇檊oogle銆傝櫧鐒惰繖瀵逛駭鍝佺殑鏀瑰杽鏈夊緢澶х殑甯姪錛屼絾涔熷瓨鍦ㄩ殣縐侀棶棰樸?/p>

銆銆sandbox錛氭矙鐩掑畨鍏ㄦ妧鏈紝鍦ㄦ祻瑙堢綉欏電殑鏃跺欙紝淇濇姢璁$畻鏈轟笉琚伓鎰忎唬鐮佷鏡鍏ャ?/p>

銆銆sdch錛氫竴縐嶆柊鐨勫帇緙╂妧鏈傛祻瑙堝櫒鍦╤ttp璇鋒眰鏃跺彲浠ュ啓鎴怉ccept-Encoding: sdch, gzip銆傛湇鍔″櫒濡傛灉鏀寔鐨勮瘽錛屽氨鍙互榪斿洖sdch鏍煎紡鐨勫帇緙╂暟鎹粰嫻忚鍣ㄣ?/p>

銆銆site_scons錛氫竴涓伐鍏鳳紝閲岄潰鏄竴涓猵ython鑴氭湰鏂囦歡錛屽叿浣撶敤澶勮繕鏈繁鍏ヤ簡瑙c?/p>

銆銆skia錛歡oogle鏀惰喘鐨勪竴瀹跺叕鍙告彁渚涚殑2D鍥懼艦娓叉煋搴擄紝鍥懼艦搴撶殑浼樺姡鍐沖畾浜嗘祻瑙堝櫒鐨勬樉紺烘晥鏋溿傛嵁璇碔E9灝嗛噰鐢℅PU鏄懼崱娓叉煋錛屼及璁℃祻瑙堝櫒閲囩敤GPU娓叉煋灝嗗緢蹇櫘鍙娿?/p>

銆銆testing錛歝++鍗曞厓嫻嬭瘯妗嗘灦搴撱?/p>

銆銆third_party錛氳鐩綍涓嬫槸澶ч噺鐨勭涓夋柟寮婧愭敮鎸佸簱錛屾渶閲嶈鐨勫綋鐒舵槸webkit鍐呮牳浜嗐?/p>

銆銆v8錛歡oogle寮鍙戠殑楂樻晥鐨刯avascript寮曟搸錛屾槸chrome鐨勯噸瑕佸唴鏍稿簱銆?/p>

銆銆views錛氱晫闈㈡帶浠跺厓绱犲簱錛屽涓嶅悓鎿嶄綔緋葷粺騫沖彴鐨刄I浜嬩歡浜や簰鏈哄埗銆佸悇縐嶆帶浠跺鎸夐挳銆佽彍鍗曘佹爲銆乧heckbox絳夎繘琛屼簡緇熶竴鐨勫皝瑁呫傜晫闈㈢粯鍒墮噰鐢╯kia鏉ュ疄鐜般?/p>

銆銆webkit錛歡oogle瀵箇ebkit鍐呮牳鐨勫皝瑁呭眰錛屽叾鐩殑鏄湪webkit鍐呮牳鍜屼笂灞傝皟鐢ㄤ箣闂存彁渚涗竴涓腑闂村眰銆傝鐩綍涓嬫湁涓涓噸瑕佺殑glue宸ョ▼銆傛槸鍚嶅壇鍏跺疄鐨?#8216;鑳舵按’灞傘?/p>

銆銆鏁翠釜婧愮爜宸ョ▼铏界劧搴炲ぇ錛屼絾鍏剁粨鏋勬槸闈炲父娓呮櫚鐨勶紝浠g爜椋庢牸寰堢粺涓錛屽氨璞℃槸涓涓漢鍐欑殑涓鏍楓傚熷姪vs2008寮哄ぇ鐨勫彲瑙嗗寲璋冭瘯錛屾垜浠彧瑕佹帉鎻″ソ綺掑害錛屼粠綺楀埌緇嗭紝浠庢暣浣撳埌灞閮ㄩ愭笎娣卞叆錛屽甫鐫闂鍘昏窡韙皟璇曪紝寰堝揩灝變細涓婃墜榪涘叆鐘舵併?/p>

]]>
婧愪唬鐮佸垎鏋愪箣濡備綍瀹炵幇鑷畾涔夌殑鏍囬鏍?/title><link>http://m.shnenglu.com/Walker/articles/143886.html</link><dc:creator>婕鑰吤?amp;鈥︹?錕?/dc:creator><author>婕鑰吤?amp;鈥︹?錕?/author><pubDate>Sun, 10 Apr 2011 13:06:00 GMT</pubDate><guid>http://m.shnenglu.com/Walker/articles/143886.html</guid><wfw:comment>http://m.shnenglu.com/Walker/comments/143886.html</wfw:comment><comments>http://m.shnenglu.com/Walker/articles/143886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/Walker/comments/commentRss/143886.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/Walker/services/trackbacks/143886.html</trackback:ping><description><![CDATA[<p>鏈枃涓昏鍒嗘瀽Visual Studio Samples\1033\C++\MFC\Visual C++ 2008 Feature Pack\MSMoneyDemo榪欎釜Sample<br>涓鑸獥鍙g殑鏍囬鏍忎笂闈㈤兘鏄彧鏈夊浐瀹氱殑鏈灝忓寲錛屾仮澶嶏紝鏈澶у寲鎸夐挳錛岃繖浜涙寜閽殑澶у皬錛屽浘鏍囬兘鏄郴緇熻嚜瀹氫箟鐨勶紝<br>鏈枃鍒嗘瀽VS2008 sp1 鐨勪簨渚嬩唬鐮佸疄鐜拌嚜宸辯殑鏍囬鏍忋?br>CMSMCaptionBar瀹炵幇浜嗭紝鑷畾涔夌殑鏍囬鏍忕獥鍙o紝綾誨畾涔夊涓嬨?br>class CMSMCaptionBar : public CPane<br>{<br> DECLARE_DYNCREATE(CMSMCaptionBar)</p> <p>// Construction<br>public:<br> CMSMCaptionBar ();</p> <p> virtual ~CMSMCaptionBar ();<br> <br> virtual void SetIcon (HICON hIcon);</p> <p> void SetCaptionHeight (int nHeight);</p> <p> int GetCaptionHeight () const;</p> <p> void SetCaptionFont (const LOGFONT& lf);</p> <p> HFONT GetCaptionFont () const;</p> <p> virtual COLORREF GetCaptionTextColor () const;</p> <p> void SetParentActive (BOOL bParentActive = true);</p> <p> BOOL IsParentActive () const;</p> <p> void SetParentMaximize (BOOL bParentMaximize = true);</p> <p> BOOL IsParentMaximize () const;</p> <p>// Attributes<br>public:</p> <p>// Operations<br>public:</p> <p>// Overrides<br>public:<br> virtual BOOL Create(CWnd* pParentWnd, UINT nID = uiCaprionBarID);<br> virtual BOOL CreateEx(CWnd* pParentWnd, UINT nID = uiCaprionBarID);<br> virtual CSize CalcFixedLayout(BOOL, BOOL);<br>protected:<br> virtual BOOL PreCreateWindow(CREATESTRUCT& cs);<br> virtual void DoPaint(CDC* pDCPaint);<br> virtual BOOL PreTranslateMessage(MSG* pMsg);<br> virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);</p> <p>protected:<br> afx_msg LRESULT OnSetText(WPARAM, LPARAM lParam);<br> afx_msg void OnSize(UINT nType, int cx, int cy);<br> afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);<br> afx_msg void OnSysCommand(UINT nID, LPARAM lParam);</p> <p> DECLARE_MESSAGE_MAP()</p> <p> virtual UINT HitTest (const CPoint& pt) const;<br> virtual void ShowSysMenu (const CPoint& point);</p> <p>public:<br> CString      m_strCaption;</p> <p> HICON      m_hIcon;<br> CSize      m_szIcon;</p> <p> BOOL      m_bParentActive;<br> BOOL      m_bParentMaximize;</p> <p> int       m_SystemHeight;<br> int       m_CaptionHeight;<br> CFont      m_CaptionFont;</p> <p> CMSMCaptionBarButton m_BtnMinimize;<br> CMSMCaptionBarButton m_BtnMaximize;<br> CMSMCaptionBarButton m_BtnClose;<br>};</p> <p>涓嬮潰鏄被鐨勬淳鐢熷叧緋誨浘錛?br>CObject <br>   CCmdTarget<br>      CWnd<br>         CBasePane<br>            CPane<br>       CMSMCaptionBar<br>浠庤繖涓浘涓婂彲浠ョ湅鍑猴細CMSMCaptionBar涔熸槸涓涓獥鍙o紝錛堜粠CWnd綾繪淳鐢熺殑閮芥槸涓涓獥鍙Indow錛夈?/p> <p>2 濡備綍璁捐璁捐涓涓狢aption Window<br>涓涓獥鍙d富瑕佺敱UI閮ㄥ垎浠ュ強娑堟伅鍝嶅簲閮ㄥ垎緇勬垚銆?br>UI閮ㄥ垎閫氫織鐨勮灝辨槸紿楀彛鐨勫瑙傛弿榪幫紝閫氳繃澶栬鎻忚堪鍙互緇樺埗鍑虹獥鍙c?br>娑堟伅鍝嶅簲閮ㄥ垎灝辨槸璇ョ獥鍙d細澶勭悊鍝簺娑堟伅銆傛瘮濡傚弻鍑繪椂鏈澶у寲榪樻槸鎭㈠錛岀偣鍑諱笂闈㈢殑鍏抽棴鎸夐挳錛岀▼搴忓叧闂瓑絳夛紝涓嬮潰浼氳緇嗘弿榪般?br>2.1 Caption Window鐨勭粍鎴?br>1錛夊厓绱犵粍鎴愶細鏍囬鍥炬爣錛岀獥鍙f爣棰橈紝鏈灝忓寲鎸夐挳錛屾仮澶嶆寜閽紝鏈澶у寲鎸夐挳銆?br>鎻忚堪榪欎簺鍏冪礌闇瑕佺浉搴旂殑鎴愬憳鍙橀噺錛屼篃灝辨槸CMSMCaptionBar鐨刾ublic鎴愬憳錛?br> CString      m_strCaption;//紿楀彛鏍囬<br> CFont      m_CaptionFont;//鏍囬瀛椾綋<br> <br> HICON      m_hIcon;//鏍囬鍥炬爣<br> CSize      m_szIcon;//鍥炬爣澶у皬</p> <p> </p> <p> //鏈灝忓寲鎸夐挳錛屾仮澶嶆寜閽紝鏈澶у寲鎸夐挳銆?br> CMSMCaptionBarButton m_BtnMinimize;<br> CMSMCaptionBarButton m_BtnMaximize;<br> CMSMCaptionBarButton m_BtnClose;</p> <p>瀵逛簬Caption Window錛岃繕鏈夎嚜宸辯殑涓浜涘睘鎬э紝姣斿紿楀彛楂樺害銆?/p> <p> int       m_SystemHeight;<br> int       m_CaptionHeight;//鏍囬鏍忛珮搴?br> <br>2錛夊浣曠粯鍒跺厓绱?br>涓轟簡淇濊瘉紿楀彛鎺ユ敹鍙屽嚮浜嬩歡錛岄渶瑕佺粍鎴怱_DBLCLKS椋庢牸鐨勭獥鍙c?br>LPCTSTR lpszClass = AfxRegisterWndClass(CS_DBLCLKS, ::LoadCursor(NULL, IDC_ARROW),<br>  (HBRUSH)(COLOR_BTNFACE+1), NULL);</p> <p>Create->CreateEx<br>鍒涘緩紿楀彛<br>CWnd::Create(lpszClass, NULL, dwStyle | WS_CLIPSIBLINGS, rect, pParentWnd, nID)<br>鍒涘緩濂界獥鍙d箣鍚庤繕蹇呴』鍔犲叆鍒扮獥鍙g殑涓涓狿ane鐨勫垪琛ㄤ腑鍘?br>if (pParentWnd->IsKindOf (RUNTIME_CLASS (CFrameWndEx)))<br> {<br>  ((CFrameWndEx*) pParentWnd)->AddPane (this);<br> }<br> <br> <br>鍔犺澆Capation Icon錛岃緗瓹aption 鏍囬<br>SetIcon (hIcon);<br>SetWindowText (strCaption);<br>鍒涘緩鏈灝忓寲鎸夐挳錛屾仮澶嶆寜閽紝鏈澶у寲鎸夐挳<br> m_BtnClose.Create (_T(""), BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, <br>                 rt, this, SC_CLOSE);<br> m_BtnClose.SetTooltip (_T("Close"));</p> <p> m_BtnMaximize.Create (_T(""), BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, <br>                 rt, this, SC_MAXIMIZE);<br> m_BtnMaximize.SetTooltip (_T("Maximize"));</p> <p> m_BtnMinimize.Create (_T(""), BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, <br>                 rt, this, SC_MINIMIZE);<br> m_BtnMinimize.SetTooltip (_T("Minimize"));</p> <p>瀵逛簬鎸夐挳涓婂浘鐗囩殑璁劇疆涓庡姞杞芥槸鍦–MSMVisualManager涓緗殑錛岃繖鏄湪VS2008 Sp1涓湁鐨勫彲浠ヨ緗縐峌I涓婚椋庢牸錛岀被浼間簬鎹㈢毊鑲ゃ?br>涓嬮潰鍒楀嚭浜嗕笌Caption Window鐩稿叧鐨勫嚱鏁般?br>class CMSMVisualManager : public CMFCVisualManagerOffice2003<br>{<br>BOOL CMSMVisualManager::LoadMSMCaptionButtonsIcons (LPCTSTR lpszID);<br> virtual void MSMDrawCaptionButton (CDC* pDC, CRect rect, AFX_BUTTON_STATE state, UINT id);<br> BOOL LoadMSMCaptionButtonsIcons (LPCTSTR lpszID);</p> <p> const CSize& GetMSMCaptionButtonsSize () const;<br> <br> virtual void OnFillBarBackground (CDC* pDC, CBasePane* pBar,<br> CRect rectClient, CRect rectClip, BOOL bNCArea = FALSE);<br>      <br> CImageList m_CaptionButtonIconst;<br> CSize    m_CaptionButtonSize;<br>}<br>閫氳繃榪欎簺鍑芥暟鍙互璁劇疆Button鐨勫浘鐗囦互鍙奀aption Windowd鐨勮儗鏅?/p> <p><br>閫氳繃涓婇潰灝辨妸紿楀彛UI鍏冪礌鐢誨ソ浜嗭紝涓嬮潰浠嬬粛娑堟伅鐨勫鐞?/p> <p>3錛塁aption Windows澶勭悊鐨勬秷鎭張鍝簺錛?br> 榧犳爣宸﹂敭鍗曞嚮錛堥渶瑕佸垽鏂槸鏈灝忓寲錛屾渶澶у寲錛屾仮澶嶏紝榪樻槸鍏抽棴錛夛紱<br> 榧犳爣鍙抽敭鍗曞嚮錛堝脊鍑哄府鍔╄彍鍗曪級<br> 榧犳爣宸﹂敭鍙屽嚮錛堟渶澶у寲鎴栬呮仮澶嶏級<br> WM_SIZE娑堟伅錛屽綋紿楀彛澶у皬鍙樺寲鏃訛紝闇瑕佺Щ鍔ㄦ渶灝忓寲錛屾渶澶у寲錛屾仮澶嶆寜閽殑浣嶇疆銆?br> <br> 涔熷氨鏄笅闈㈢殑涓浜涙秷鎭?br> ON_MESSAGE(WM_SETTEXT, OnSetText)<br> ON_WM_SIZE()<br> ON_WM_CONTEXTMENU()<br> ON_WM_SYSCOMMAND()<br> <br> <br>4錛夊浜庢寜閽秷鎭殑澶勭悊WM_XXX搴斿綋杞寲鎴怶M_NCXXX錛屼篃灝辨槸璇村鎴風娑堟伅瑕佽漿鍖栨垚闈炲鎴風娑堟伅銆傚洜涓哄浜庡崟鏂囨。紼嬪簭鏉ヨ錛?br>鏍囬鏍忓睘浜庨潪瀹㈡埛鍖恒?/p> <p>BOOL CMSMCaptionBar::PreTranslateMessage (MSG* pMsg) <br>鍦ㄥ叾涓皟鐢℉itTest鍑芥暟鍒ゆ柇榧犳爣鐨勪綅緗紝濡傛灉鏄湪Caption window涓偣鍑伙紝鍒?br>鍒ゆ柇uiHit = HTCAPTION;榪樻槸uiHit = HTSYSMENU;<br>鍐?br>   switch (pMsg->message)<br>   {<br>   case WM_LBUTTONDOWN:<br>    message = WM_NCLBUTTONDOWN;<br>    break;<br>   case WM_LBUTTONUP:<br>    message = WM_NCLBUTTONUP;<br>    break;<br>   case WM_LBUTTONDBLCLK:<br>    message = WM_NCLBUTTONDBLCLK;<br>    break;<br>   }</p> <p>   if (message != 0)<br>   {<br>    if (message == WM_NCLBUTTONDOWN && uiHit == HTSYSMENU)<br>    {<br>     CRect rt;<br>     GetWindowRect (rt);</p> <p>     ShowSysMenu (CPoint (rt.left, rt.bottom));<br>    }<br>    else<br>    {<br>     pParentWnd->SendMessage (message, wParam, lParam);<br>    }<br>   }</p> <p>瀵逛簬Caption Window涓嶆劅鍏磋叮鐨勬秷鎭細鍙戦佺粰鐖剁獥鍙e鐞嗐?br> <br>5錛塛M_SIZE娑堟伅鐨勫鐞?/p> <p>瀵筗M_SIZE鐨勬秷鎭鐞嗗氨鏄Щ鍔ㄦ渶涓嬪寲錛屾渶澶у寲錛屼互鍙婃仮澶嶆寜閽?/p> <p><br>3錛変嬌鐢–aption Window<br>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) <br>璁劇疆椋庢牸錛屽幓鎺塛S_CAPTION | FWS_ADDTOTITLE錛屽嵆鍒涘緩涓嶅甫Caption鐨凪ainframe,<br>鍥犱負Caption鏄垜浠嚜宸辮鍒涘緩鐨勶紝鑰屼笉鏄嚜鍔ㄥ垱寤?/p> <p> ModifyStyle (WS_CAPTION | FWS_ADDTOTITLE, 0);<br>鍘繪帀紿楀彛鐨勮竟妗?br> ModifyStyleEx (WS_EX_CLIENTEDGE, 0);<br>璁劇疆紿楀彛椋庢牸<br> CMFCVisualManager::SetDefaultManager (RUNTIME_CLASS (CMSMVisualManager));</p> <img src ="http://m.shnenglu.com/Walker/aggbug/143886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/Walker/" target="_blank">婕鑰吤?鈥︹?錕?/a> 2011-04-10 21:06 <a href="http://m.shnenglu.com/Walker/articles/143886.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>錛堣漿錛塻trlen婧愮爜鍓栨瀽 http://m.shnenglu.com/ant/archive/2007/10/12/32886.htmlhttp://m.shnenglu.com/Walker/articles/82347.html婕鑰吤?amp;鈥︹?錕?/dc:creator>婕鑰吤?amp;鈥︹?錕?/author>Sat, 09 May 2009 01:50:00 GMThttp://m.shnenglu.com/Walker/articles/82347.htmlhttp://m.shnenglu.com/Walker/comments/82347.htmlhttp://m.shnenglu.com/Walker/articles/82347.html#Feedback0http://m.shnenglu.com/Walker/comments/commentRss/82347.htmlhttp://m.shnenglu.com/Walker/services/trackbacks/82347.html闃呰鍏ㄦ枃

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              久久国产视频网| 国产精品免费一区二区三区观看| 久久久久久久久蜜桃| 欧美日韩一区精品| 91久久精品美女| 欧美成人久久| 久久乐国产精品| 韩国av一区二区三区在线观看 | 亚洲精品国产精品国自产观看| 久久久久久久999精品视频| 亚洲综合第一页| 国产精品美女久久| 欧美在线观看www| 亚洲自拍另类| 国产一区二区三区视频在线观看| 久久久久国产精品午夜一区| 欧美在线视频免费观看| 在线日韩精品视频| 亚洲国产综合视频在线观看 | 久久se精品一区精品二区| 欧美韩日精品| 久热精品视频在线免费观看| 亚洲第一主播视频| 欧美成人免费在线观看| 欧美成人69| 一本色道久久综合亚洲二区三区| 亚洲免费激情| 国产精品欧美经典| 久久久一本精品99久久精品66| 久久精品亚洲国产奇米99| 亚洲大片一区二区三区| 亚洲国产一区二区精品专区| 欧美色网一区二区| 久久九九免费| 欧美精品日韩www.p站| 亚洲女性喷水在线观看一区| 久久国产精品久久久久久久久久 | 麻豆91精品91久久久的内涵| 妖精成人www高清在线观看| 亚洲小说欧美另类婷婷| 激情成人av在线| 亚洲精品一区二区三| 国产女人精品视频| 亚洲国产精品久久久久秋霞影院 | 在线播放日韩欧美| 91久久久久久| 国产三级欧美三级日产三级99| 欧美α欧美αv大片| 欧美三级小说| 免费不卡在线观看| 国产精品丝袜xxxxxxx| 欧美激情精品久久久久久| 国产精品久久久久久久久借妻| 看欧美日韩国产| 国产精品户外野外| 亚洲国产精品精华液2区45| 国产热re99久久6国产精品| 亚洲激情不卡| 狠狠色综合色区| 亚洲在线日韩| 一区二区三区偷拍| 欧美高清视频一二三区| 久久婷婷影院| 国产视频亚洲| 亚洲午夜一区二区三区| 9人人澡人人爽人人精品| 久久一区二区三区av| 久久精品国产第一区二区三区| 欧美日韩在线一区| 亚洲人成网站精品片在线观看| 一区二区亚洲| 久久九九国产精品| 久久天天躁狠狠躁夜夜av| 国产毛片精品国产一区二区三区| 亚洲伦理在线免费看| 亚洲激情视频在线| 久久久久久久久蜜桃| 久久久久综合| 亚洲国产人成综合网站| 欧美一级视频免费在线观看| 欧美精品成人一区二区在线观看| 久久精品论坛| 国产日韩欧美视频| 亚洲欧美不卡| 性色一区二区三区| 国产女同一区二区| 欧美一级网站| 蜜桃久久精品一区二区| 亚洲第一区色| 免费亚洲电影| 亚洲国产日韩在线一区模特| 亚洲国内在线| 欧美日本一区二区视频在线观看 | 久久男人资源视频| 久久精品系列| 韩日精品视频| 美女视频黄a大片欧美| 欧美黑人在线观看| 日韩午夜三级在线| 国产精品jizz在线观看美国 | 国产一区二区三区四区三区四 | 乱中年女人伦av一区二区| 免费成人av在线| 亚洲电影免费观看高清完整版 | 中日韩在线视频| 欧美视频第二页| 亚洲欧美区自拍先锋| 久久久噜噜噜久久中文字免 | 日韩午夜电影在线观看| 国产精品99久久久久久白浆小说| 欧美手机在线| 午夜在线不卡| 欧美国产日韩一区二区在线观看| 亚洲激情精品| 国产精品美女久久久久av超清| 香蕉久久夜色精品| 亚洲第一视频| 亚洲欧美在线视频观看| 在线观看日韩欧美| 欧美日韩一区成人| 欧美在线亚洲一区| 亚洲人成久久| 久久成人18免费网站| 亚洲国产精品999| 国产精品免费一区二区三区在线观看| 久久国产精品亚洲va麻豆| 亚洲第一区中文99精品| 香蕉乱码成人久久天堂爱免费| 国产亚洲一级高清| 欧美精品日韩综合在线| 性欧美激情精品| 亚洲国产专区| 久久综合电影一区| 亚洲一区二区三区四区五区午夜 | 卡一卡二国产精品| 国产精品99久久99久久久二8 | 久久国产精品久久久久久电车| 亚洲丰满在线| 亚洲午夜久久久久久久久电影网| 久久国产精品99国产精| 欧美系列一区| 久久综合狠狠综合久久综合88 | 男人的天堂亚洲在线| 久久人人爽国产| 另类av一区二区| 欧美电影免费观看大全| 亚洲国产精品毛片| 亚洲精品男同| 一区二区三区高清不卡| 亚洲午夜在线观看| 欧美一区二区三区四区在线| 久久国产精品久久久久久电车| 久久久久青草大香线综合精品| 久久尤物电影视频在线观看| 男同欧美伦乱| 欧美日韩一级黄| 国产日韩综合一区二区性色av| 在线国产日韩| 一本色道久久综合精品竹菊| 亚洲欧美视频一区二区三区| 久久久久久久999| 亚洲高清不卡在线| 亚洲天堂免费观看| 久久精品人人做人人爽电影蜜月| 久久深夜福利免费观看| 欧美激情综合五月色丁香| 国产精品草草| 亚洲丶国产丶欧美一区二区三区 | 另类酷文…触手系列精品集v1小说| 蜜臀av在线播放一区二区三区| 欧美久久综合| 国产精品一区免费视频| 欲色影视综合吧| 亚洲一区二区三区在线播放| 久久久久久成人| 亚洲精品1234| 欧美一区二区日韩一区二区| 欧美福利视频在线| 国产日本亚洲高清| 99国产精品久久| 久久久久久精| 在线亚洲一区二区| 久久综合狠狠综合久久综合88| 欧美体内谢she精2性欧美| 又紧又大又爽精品一区二区| 亚洲永久网站| 亚洲国产日韩精品| 欧美专区一区二区三区| 欧美日韩一区二区三区高清| 一区二区在线视频观看| 亚洲欧美国产另类| 亚洲国内欧美| 久久亚洲不卡| 国产亚洲精品美女| 亚洲综合视频网| 亚洲激情成人网| 久久综合色一综合色88| 国产亚洲精品久久久久婷婷瑜伽| 在线亚洲美日韩| 亚洲国产精品成人|