锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久午夜夜伦鲁鲁片免费无码影视,青青草原综合久久大伊人,久久精品国产AV一区二区三区 http://www.shnenglu.com/Ipedo/zh-cn Wed, 07 May 2025 13:51:10 GMT Wed, 07 May 2025 13:51:10 GMT 60 Pass鍦⊿DK2004閲岃鏀規垚BeginPass浜?/title> http://www.shnenglu.com/Ipedo/archive/2006/04/14/5516.htmlIpedo Ipedo Fri, 14 Apr 2006 02:28:00 GMT http://www.shnenglu.com/Ipedo/archive/2006/04/14/5516.html http://www.shnenglu.com/Ipedo/comments/5516.html http://www.shnenglu.com/Ipedo/archive/2006/04/14/5516.html#Feedback 0 http://www.shnenglu.com/Ipedo/comments/commentRss/5516.html http://www.shnenglu.com/Ipedo/services/trackbacks/5516.html for( number of passes ) { 聽pDevice->BeginPass(); 聽pDevice->CommitChanges(); 聽// 鍦ㄨ繖閲岀粯鍒跺満鏅?br />聽//銆傘傘傘傘?br />聽pDevice->EndPass(); } ]]> 鍐滃巻--緗戦〉鏄劇ず http://www.shnenglu.com/Ipedo/archive/2006/01/06/2463.htmlIpedo Ipedo Fri, 06 Jan 2006 04:04:00 GMT http://www.shnenglu.com/Ipedo/archive/2006/01/06/2463.html http://www.shnenglu.com/Ipedo/comments/2463.html http://www.shnenglu.com/Ipedo/archive/2006/01/06/2463.html#Feedback 1 http://www.shnenglu.com/Ipedo/comments/commentRss/2463.html http://www.shnenglu.com/Ipedo/services/trackbacks/2463.html <script language="javascript"> <!-- var bsYear; var bsDate; var bsWeek; var arrLen=8; //鏁扮粍闀垮害 var sValue=0; //褰撳勾鐨勭鏁?BR>var dayiy=0; //褰撳勾絎嚑澶?BR>var miy=0; //鏈堜喚鐨勪笅鏍?BR>var iyear=0; //騫翠喚鏍囪 var dayim=0; //褰撴湀絎嚑澶?BR>var spd=86400; //姣忓ぉ鐨勭鏁?/P>
var year1999="30;29;29;30;29;29;30;29;30;30;30;29"; //354 var year2000="30;30;29;29;30;29;29;30;29;30;30;29"; //354 var year2001="30;30;29;30;29;30;29;29;30;29;30;29;30"; //384 var year2002="30;30;29;30;29;30;29;29;30;29;30;29"; //354 var year2003="30;30;29;30;30;29;30;29;29;30;29;30"; //355 var year2004="29;30;29;30;30;29;30;29;30;29;30;29;30"; //384 var year2005="29;30;29;30;29;30;30;29;30;29;30;29"; //354 var year2006="30;29;30;29;30;30;29;29;30;30;29;29;30";
var month1999="姝f湀;浜屾湀;涓夋湀;鍥涙湀;浜旀湀;鍏湀;涓冩湀;鍏湀;涔濇湀;鍗佹湀;鍗佷竴鏈?鍗佷簩鏈? var month2001="姝f湀;浜屾湀;涓夋湀;鍥涙湀;闂板洓鏈?浜旀湀;鍏湀;涓冩湀;鍏湀;涔濇湀;鍗佹湀;鍗佷竴鏈?鍗佷簩鏈? var month2004="姝f湀;浜屾湀;闂頒簩鏈?涓夋湀;鍥涙湀;浜旀湀;鍏湀;涓冩湀;鍏湀;涔濇湀;鍗佹湀;鍗佷竴鏈?鍗佷簩鏈? var month2006="姝f湀;浜屾湀;涓夋湀;鍥涙湀;浜旀湀;鍏湀;涓冩湀;闂頒竷鏈?鍏湀;涔濇湀;鍗佹湀;鍗佷竴鏈?鍗佷簩鏈? var Dn="鍒濅竴;鍒濅簩;鍒濅笁;鍒濆洓;鍒濅簲;鍒濆叚;鍒濅竷;鍒濆叓;鍒濅節;鍒濆崄;鍗佷竴;鍗佷簩;鍗佷笁;鍗佸洓;鍗佷簲;鍗佸叚;鍗佷竷;鍗佸叓;鍗佷節;浜屽崄;寤夸竴;寤夸簩;寤夸笁;寤垮洓;寤夸簲;寤垮叚;寤夸竷;寤垮叓;寤夸節;涓夊崄";
var Ys=new Array(arrLen); Ys[0]=919094400;Ys[1]=949680000;Ys[2]=980265600; Ys[3]=1013443200;Ys[4]=1044028800;Ys[5]=1074700800; Ys[6]=1107878400;Ys[7]=1138464000;
var Yn=new Array(arrLen); //鍐滃巻騫寸殑鍚嶇О Yn[0]="宸卞嵂騫?;Yn[1]="搴氳景騫?;Yn[2]="杈涘煩騫?; Yn[3]="澹崍騫?;Yn[4]="鐧告湭騫?;Yn[5]="鐢茬敵騫?; Yn[6]="涔欓厜騫?;Yn[7]="涓欐垖騫?; var D=new Date(); var yy=D.getYear(); var mm=D.getMonth()+1; var dd=D.getDate(); var ww=D.getDay(); if (ww==0) ww="<font color=RED>鏄熸湡鏃?; if (ww==1) ww="鏄熸湡涓"; if (ww==2) ww="鏄熸湡浜?; if (ww==3) ww="鏄熸湡涓?; if (ww==4) ww="鏄熸湡鍥?; if (ww==5) ww="鏄熸湡浜?; if (ww==6) ww="<font color=RED>鏄熸湡鍏?; ww=ww; var ss=parseInt(D.getTime() / 1000); if (yy<100) yy="19"+yy;
for (i=0;i<arrLen;i++) if (ss>=Ys[i]){ iyear=i; sValue=ss-Ys[i]; //褰撳勾鐨勭鏁?BR> } dayiy=parseInt(sValue/spd)+1; //褰撳勾鐨勫ぉ鏁?/P>
var dpm=year1999; if (iyear==1) dpm=year2000; if (iyear==2) dpm=year2001; if (iyear==3) dpm=year2002; if (iyear==4) dpm=year2003; if (iyear==5) dpm=year2004; if (iyear==6) dpm=year2005; if (iyear==7) dpm=year2006; dpm=dpm.split(";");
var Mn=month1999; if (iyear==2) Mn=month2001; if (iyear==5) Mn=month2004; if (iyear==7) Mn=month2006; Mn=Mn.split(";");
var Dn="鍒濅竴;鍒濅簩;鍒濅笁;鍒濆洓;鍒濅簲;鍒濆叚;鍒濅竷;鍒濆叓;鍒濅節;鍒濆崄;鍗佷竴;鍗佷簩;鍗佷笁;鍗佸洓;鍗佷簲;鍗佸叚;鍗佷竷;鍗佸叓;鍗佷節;浜屽崄;寤夸竴;寤夸簩;寤夸笁;寤垮洓;寤夸簲;寤垮叚;寤夸竷;寤垮叓;寤夸節;涓夊崄"; Dn=Dn.split(";");
dayim=dayiy;
var total=new Array(13); total[0]=parseInt(dpm[0]); for (i=1;i<dpm.length-1;i++) total[i]=parseInt(dpm[i])+total[i-1]; for (i=dpm.length-1;i>0;i--) if (dayim>total[i-1]){ dayim=dayim-total[i-1]; miy=i; } bsWeek=ww; bsDate=yy+"騫?+mm+"鏈?; bsDate2=dd; bsYear="鍐滃巻"+Yn[iyear]; bsYear2=Mn[miy]+Dn[dayim-1]; if (ss>=Ys[7]||ss<Ys[0]) bsYear=Yn[7]; /* 淇敼涓嬮潰鐨勮〃鏍煎睘鎬?/ function CAL(){ document.write("<table border='1' cellspacing='3' width='120' bordercolor='#009B00' bgcolor='#FFFFFF' height='110' cellpadding='2'"); document.write("<tr><td align='center'><b><font color=#008040>"+bsDate+"</font><br><font face='Arial' size='6' color=#FF8040>"+bsDate2+"</font><br><font color=#008040><span style='FONT-SIZE: 10.5pt'>"); document.write(bsWeek+"</span><br>"+"<br></b><font color=#9B4E00>"); document.write(bsYear+"<br>"+bsYear2+"</td></tr></table>"); } //--> </script><script language="javascript">CAL();</script>
]]>鍏充簬C++涓璕TTI鐨勭紪鐮佸疄鐜?/title> http://www.shnenglu.com/Ipedo/archive/2005/12/12/1699.htmlIpedo Ipedo Mon, 12 Dec 2005 11:39:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/12/12/1699.html http://www.shnenglu.com/Ipedo/comments/1699.html http://www.shnenglu.com/Ipedo/archive/2005/12/12/1699.html#Feedback 0 http://www.shnenglu.com/Ipedo/comments/commentRss/1699.html http://www.shnenglu.com/Ipedo/services/trackbacks/1699.html 鎽樿錛?/font> 銆銆RTTI
(Run-Time Type
Identification)鏄潰鍚戝璞$▼搴忚璁′腑涓縐嶉噸瑕佺殑鎶鏈傜幇琛岀殑C++鏍囧噯瀵筊TTI宸茬粡鏈変簡鏄庣‘鐨勬敮鎸併備笉榪囧湪鏌愪簺鎯呭喌涓嬪嚭浜庣壒孌婄殑寮鍙戦渶
瑕侊紝鎴戜滑闇瑕佽嚜宸辯紪鐮佹潵瀹炵幇銆傛湰鏂囦粙緇嶄簡涓浜涘叧浜嶳TTI鐨勫熀紜鐭ヨ瘑鍙婂叾鍘熺悊鍜屽疄鐜般傘銆RTTI闇姹傦細 銆
銆鍜屽緢澶氬叾浠栬璦涓鏍鳳紝C++鏄竴縐嶉潤鎬佺被鍨嬭璦銆傚叾鏁版嵁綾誨瀷鏄湪緙栬瘧鏈熷氨紜畾鐨勶紝涓嶈兘鍦ㄨ繍琛屾椂鏇存敼銆傜劧鑰岀敱浜庨潰鍚戝璞$▼搴忚璁′腑澶氭佹х殑瑕佹眰錛孋++涓?
鐨勬寚閽堟垨寮曠敤(Reference)鏈韓鐨勭被鍨嬶紝鍙兘涓庡畠瀹為檯浠h〃(鎸囧悜鎴栧紩鐢?鐨勭被鍨嬪茍涓嶄竴鑷淬傛湁鏃舵垜浠渶瑕佸皢涓涓鎬佹寚閽堣漿鎹負鍏跺疄闄呮寚鍚戝璞$殑綾?
鍨嬶紝灝遍渶瑕佺煡閬撹繍琛屾椂鐨勭被鍨嬩俊鎭紝榪欏氨浜х敓浜嗚繍琛屾椂綾誨瀷璇嗗埆鐨勮姹傘?br> 銆銆C++瀵筊TTI鐨勬敮鎸?/font>錛?/b> 銆銆C++鎻愪緵浜嗕袱涓叧閿瓧typeid鍜宒ynamic_cast鍜屼竴涓猼ype_info綾繪潵鏀寔RTTI錛?br> 銆銆dynamic_cast鎿嶄綔絎︼細 瀹冨厑璁稿湪榪愯鏃跺埢榪涜綾誨瀷杞崲錛屼粠鑰屼嬌紼嬪簭鑳藉鍦ㄤ竴涓被灞傛緇撴瀯瀹夊叏鍦拌漿鎹㈢被鍨嬨俤ynamic_cast鎻愪緵浜嗕袱縐嶈漿鎹㈡柟寮忥紝鎶婂熀綾繪寚閽堣漿鎹㈡垚媧劇敓綾繪寚閽堬紝鎴栬呮妸鎸囧悜鍩虹被鐨勫乏鍊艱漿鎹㈡垚媧劇敓綾葷殑寮曠敤銆傝涓嬩緥璁茶堪錛?br>
void company::payroll(employee *pe) { //瀵規寚閽堣漿鎹㈠け璐ワ紝dynamic_cast榪斿洖NULL if(programmer *pm=dynamic_cast(pe)){ pm->bonus(); } } void company::payroll(employee &re) { try{ //瀵瑰紩鐢ㄨ漿鎹㈠け璐ョ殑璇濓紝鍒欎細浠ユ姏鍑哄紓甯告潵鎶ュ憡閿欒 programmer &rm=dynamic_cast(re); pm->bonus(); } catch(std::bad_cast){ } }
銆銆榪欓噷bonus鏄痯rogrammer鐨勬垚鍛樺嚱鏁幫紝鍩虹被employee涓嶅叿澶囪繖涓壒鎬с傛墍浠ユ垜浠繀欏諱嬌鐢ㄥ畨鍏ㄧ殑鐢卞熀綾誨埌媧劇敓綾葷被鍨嬭漿鎹紝璇嗗埆鍑簆rogrammer鎸囬拡銆?br> 銆銆typeid鎿嶄綔絎︼細 瀹冩寚鍑烘寚閽堟垨寮曠敤鎸囧悜鐨勫璞$殑瀹為檯媧劇敓綾誨瀷銆?br> 銆銆渚嬪錛?br>
employee* pe=new manager; typeid(*pe)==typeid(manager) //true
銆銆typeid鍙互鐢ㄤ簬浣滅敤浜庡悇縐嶇被鍨嬪悕錛屽璞″拰鍐呯疆鍩烘湰鏁版嵁綾誨瀷鐨勫疄渚嬨佹寚閽堟垨鑰呭紩鐢紝褰撲綔鐢ㄤ簬鎸囬拡鍜屽紩鐢ㄥ皢榪斿洖瀹冨疄闄呮寚鍚戝璞$殑綾誨瀷淇℃伅銆倀ypeid鐨勮繑鍥炴槸type_info綾誨瀷銆?br> 銆銆type_info綾伙細榪欎釜綾葷殑紜垏瀹氫箟鏄笌緙栬瘧鍣ㄥ疄鐜扮浉鍏崇殑錛屼笅闈㈡槸銆奀++ Primer銆嬩腑緇欏嚭鐨勫畾涔?鍙傝冭祫鏂橻2]涓皥鍒扮紪璇戝櫒蹇呴』鎻愪緵鐨勬渶灝忎俊鎭噺)錛?br>
class type_info { private: type_info(const type_info&); type_info& operator=( const type_info& ); public: virtual ~type_info(); int operator==( const type_info& ) const; int operator!=( const type_info& ) const; const char* name() const; };瀹炵幇鐩爣錛?/font> 銆銆瀹炵幇鐨勬柟妗?/b> 銆銆鏂規涓錛氬埄鐢ㄥ鎬佹潵鍙栧緱鎸囬拡鎴栧簲鐢ㄧ殑瀹為檯綾誨瀷淇℃伅 銆銆榪欐槸涓涓渶綆鍗曠殑鏂規硶錛屼篃鏄綔鑰呯洰鍓嶆墍閲囩敤鐨勫姙娉曘?br> 銆銆瀹炵幇錛?br>
enum ClassType{ UObjectClass, URectViewClass, UDialogClass, 鈥︹?br>}; class UObject{ virtual char* GetClassName() const { return "UObject"; }; virtual ClassType TypeOfClass(){ return UObjectClass; }; }; class UDialog{ virtual char* GetClassName() const { return "UDialog"; }; virtual ClassType TypeOfClass(){ return UDialogClass; }; };
銆銆紺轟緥錛?br>
UObject po=new UObject; UObject pr=new URectView; UObject pd=new UDialog; cout << "po is a " << po->GetClassName() << endl; cout << "pr is a " << pr->GetClassName() << endl; cout << "pd is a " << pd->GetClassName() << endl; cout<TypeOfClass()==UObjectClass< cout<TypeOfClass()==URectViewClass< cout<TypeOfClass()==UDialogClass< cout<TypeOfClass()==UObjectClass< cout<TypeOfClass()==UDialogClass<< td>
銆銆杈撳嚭錛?br>
po is a UObjectClass pr is a URectViewClass pd is a UDialogClass true true true false false
銆銆榪欑瀹炵幇鏂規硶涔熷氨鏄湪鍩虹被涓彁渚涗竴涓鎬佺殑鏂規硶錛岃繖涓柟娉曡繑鍥炰竴涓被鍨嬩俊鎭傝繖鏍鋒垜浠兘澶熺煡閬撲竴涓寚閽堟墍鎸囧悜瀵硅薄鐨勫叿浣撶被鍨嬶紝鍙互婊¤凍涓浜涚畝鍗曠殑瑕佹眰銆?br> 銆銆浣嗘槸寰堟樉鐒訛紝榪欐牱鐨勬柟娉曞彧瀹炵幇浜唗ypeid鐨勯儴鍒嗗姛鑳斤紝榪樺瓨鍦ㄥ緢澶氱己鐐癸細 銆銆1銆?鐢ㄦ埛姣忓鍔犱竴涓被蹇呴』瑕嗙洊GetClassName鍜孴ypeOfClass涓や釜鏂規硶錛屽鏋滃繕浜嗭紝浼氬鑷寸▼搴忛敊璇?br> 銆銆2銆?榪欓噷鐨勭被鍚嶅拰綾繪爣璇嗕俊鎭笉瓚充互瀹炵幇dynamic_cast鐨勫姛鑳斤紝浠庤繖涓剰涔変笂鑰岃█姝ゆ柟妗堟牴鏈笉鑳界О涓篟TTI銆?br> 銆銆3銆?鐢ㄦ埛蹇呴』鎵嬪伐緇存姢姣忎釜綾葷殑綾誨悕涓庢爣璇嗭紝榪欓檺鍒朵簡浠ュ簱鐨勬柟寮忔彁渚涚粰鐢ㄦ埛鐨勫彲鑳姐?br> 銆銆4銆?鐢ㄦ埛蹇呴』鎵嬪伐娣誨姞GetClassName鍜孴ypeOfClass涓や釜鏂規硶錛屼嬌鐢ㄥ茍涓嶆柟渚褲?br> 銆銆鍏朵腑涓婇潰鐨勯儴鍒嗛棶棰樻垜浠彲浠ラ噰鐢–/C++涓殑瀹忔妧宸?Macro Magic)鏉ヨВ鍐籌紝榪欎釜鍙互鍦ㄦ垜浠殑鏈緇堣В鍐蟲柟妗堢殑浠g爜涓湅鍒般備笅闈㈤噰鐢ㄦ柟妗堜簩涓皢浜堜互瑙e喅涓婅堪闂銆?br> 銆銆鏂規浜岋細浠ヤ竴涓被鍨嬭〃鏉ュ瓨鍌ㄧ被鍨嬩俊鎭?/b> 銆銆榪欑鏂規硶鑰冭檻浣跨敤涓涓被緇撴瀯錛岄櫎浜嗕繚鐣欏師鏈夌殑鏁村瀷綾籌D錛岀被鍚嶅瓧絎︿覆澶栵紝澧炲姞浜嗕竴涓寚鍚戝熀綾籘ypeInfo鎴愬憳鐨勬寚閽堛?br>
struct TypeInfo { char* className; int type_id; TypeInfo* pBaseClass; operator== (const TypeInfo& info){ return this==&info; } operator!= (const TypeInfo& info){ return this!=&info; } };
銆
銆浠庤繖閲屽彲浠ョ湅鍒幫紝浠ヨ繖縐嶆柟寮忓疄鐜扮殑RTTI涓嶆敮鎸佸閲嶇戶鎵褲傛墍騫稿閲嶇戶鎵垮湪紼嬪簭璁捐涓茍闈炲繀欏伙紝鑰屼笖涔熶笉鎺ㄨ崘銆備笅闈㈢殑浠g爜涓紝鎴戝皢涓篋P9900杞歡欏?
鐩粍涓被灞傛緇撴瀯涓殑鍑犱釜綾繪坊鍔燫TTI鍔熻兘銆侱P9900欏圭洰涓紝緇濆ぇ閮ㄥ垎鐨勭被閮戒互鍗曠戶鎵挎柟寮忎粠UObject榪欎釜鏍圭被鐩存帴鎴栭棿鎺ョ戶鎵胯屾潵銆傝繖鏍鋒垜浠氨
鍙互浠嶶Object寮濮嬶紝鍔犲叆鎴戜滑RTTI鏀寔鎵闇瑕佺殑鏁版嵁鍜屾柟娉曘?br>
class UObject { public: bool IsKindOf(TypeInfo& cls); //鍒ゅ埆鏌愪釜瀵硅薄鏄惁灞炰簬鏌愪竴涓被 public: virtual int GetTypeID(){return rttiTypeInfo.type_id;} virtual char* GetTypeName(){return rttiTypeInfo.className;} virtual TypeInfo& GetTypeInfo(){return rttiTypeInfo;} static TypeInfo& GetTypeInfoClass(){return rttiTypeInfo;} private: static TypeInfo rttiTypeInfo; }; //渚濇涓篶lassName銆乼ype_id銆乸BaseClass璧嬪?br>TypeInfo UObject::rttiTypeInfo={"UObject",0,NULL};
銆
銆鑰冭檻浠嶶Object灝嗚繖涓猅ypeInfo綾諱綔涓烘瘡涓涓柊澧炵被鐨勯潤鎬佹垚鍛橈紝榪欐牱涓涓被鐨勬墍鏈夊璞″皢鍏變韓TypeInfo鐨勫敮涓瀹炰緥銆傛垜浠笇鏈涜兘澶熷湪紼?
搴忚繍琛屼箣鍓嶅氨涓簍ype_id,className鍋氬ソ鍒濆鍖栵紝騫惰pBaseClass鎸囧悜鍩虹被鐨勮繖涓猅ypeInfo銆?br> 銆銆姣忎釜綾葷殑TypeInfo鎴愬憳綰﹀畾浣跨敤rttiTypeInfo鐨勫懡鍚嶏紝涓轟簡閬垮厤鍛藉悕鍐茬獊錛屾垜浠皢鍏朵綔涓簆rivate鎴愬憳銆傛湁浜嗗熀綾葷殑鏀寔騫朵笉澶燂紝褰撶敤鎴烽渶瑕丷TTI鏀寔錛岃繕闇瑕佽嚜宸辨潵鍋氫竴浜涗簨鎯咃細 銆銆1銆?媧劇敓綾婚渶瑕佷粠UObject緇ф壙銆?br> 銆銆2銆?娣誨姞rttiTypeInfo鍙橀噺銆?br> 銆銆3銆?鍦ㄧ被澶栨紜垵濮嬪寲rttiTypeInfo闈欐佹垚鍛樸?br> 銆銆4銆?瑕嗙洊GetTypeID銆丟etTypeName銆丟etTypeInfo銆丟etTypeInfoClass鍥涗釜鎴愬憳鍑芥暟銆?br> 銆銆濡備笅鎵紺猴細
class UView:public UObject { public: virtual int GetTypeID(){return rttiTypeInfo.type_id;} virtual char* GetTypeName(){return rttiTypeInfo.className;} virtual TypeInfo& GetTypeInfo(){return rttiTypeInfo;} static TypeInfo& GetTypeInfoClass(){return rttiTypeInfo;} private: static TypeInfo rttiTypeInfo; };
銆銆鏈変簡鍓嶄笁姝ワ紝榪欐牱鎴戜滑灝卞彲浠ュ緱鍒頒竴涓笉綆楀お澶嶆潅鐨勯摼琛ㄢ曗曡繖鏄竴媯電被鍨嬩俊鎭瀯鎴愮殑"鏍?錛屼笌鏁版嵁緇撴瀯涓殑鏍戠殑鍞竴宸埆灝辨槸鍏舵寚閽堟柟鍚戠浉鍙嶃?br> 銆銆榪欐牱錛屼粠浠諱綍涓涓猆Object鐨勫瓙綾伙紝欏虹潃pBaseClass寰涓婃壘錛屾昏兘閬嶅巻瀹冪殑鎵鏈夌埗綾伙紝鏈緇堝埌杈綰Object銆?br> 銆銆鍦ㄨ繖涓摼琛ㄧ殑鍩虹涓婏紝瑕佸垽鍒煇涓璞℃槸鍚﹀睘浜庢煇涓涓被灝卞緢綆鍗曘備笅闈㈢粰鍑篣Object::IsKindOf()鐨勫疄鐜般?br>
bool UObject::IsKindOf(TypeInfo& cls) { TypeInfo* p=&(this->GetTypeInfo()); while(p!=NULL){ if(p->type_id==cls.type_id) return true; p=p->pBaseClass; } return false; }
銆銆鏈変簡IsKindOf鐨勬敮鎸侊紝dynamic_cast鐨勫姛鑳戒篃灝卞彲浠ョ敤涓涓畝鍗曠殑safe_cast鏉ュ疄鐜幫細
template inline T* safe_cast(UObject* ptr,TypeInfo& cls) { return (ptr->IsKindOf(cls)?(T*)ptr:NULL); }
銆
銆鑷蟲錛屾垜浠凡緇忚兘澶熶粠鍔熻兘涓婂畬鎴愬墠闈㈢殑鐩爣浜嗭紝涓嶈繃鐢ㄦ埛瑕佷嬌鐢ㄨ繖涓被搴撶殑RTTI鍔熻兘榪樺緢楹葷儲錛岃鏁插叆涓澶у爢瀵逛粬浠鏃犳剰涔夌殑鍑芥暟浠g爜錛岃鍦ㄥ垵濮嬪寲
rttiTypeInfo闈欐佹垚鍛樻椂鎵嬪伐璁劇疆綾籌D涓庣被鍚嶃傚叾瀹炶繖浜涢夯鐑﹀畬鍏ㄤ笉蹇呬氦緇欐垜浠殑鐢ㄦ埛錛岄傚綋閲囩敤涓浜涘畯鎶宸?Macro
Magic)錛屽氨鍙互璁〤++鐨勯澶勭悊鍣ㄦ潵鏇挎垜浠啓寰堝鏋嚗鐨勪唬鐮併傚叧浜庡畯涓嶆槸鏈枃鐨勯噸鐐癸紝浣犲彲浠ヤ粠鏈緇堜唬鐮佹竻鍗曠湅鍒板畠浠備笅闈㈠啀璋堣皥鍏充簬綾籌D鐨勯棶棰樸?br> 銆銆綾籌D 銆銆涓轟簡浣夸笉鍚岀被鍨嬬殑瀵硅薄鍙尯鍒嗭紝鐢ㄤ竴涓粰姣忎釜TypeInfo瀵硅薄涓涓被ID鏉ヤ綔涓烘瘮杈冪殑渚濇嵁鏄繀瑕佺殑銆?br>鍏?
瀹炲浜庢垜浠繖閲岀殑闇姹傚拰瀹炵幇鏂規硶鑰岃█錛屽叾瀹炵被ID騫朵笉鏄繀欏葷殑銆傛瘡涓涓敮鎸丷TTI鐨勭被閮藉寘鍚簡涓涓潤鎬乀ypeInfo瀵硅薄錛岃繖涓璞$殑鍦板潃灝辨槸鍦ㄨ繘紼?
涓叏灞鍞竴銆備絾鑰冭檻鍒板叾浠栦竴浜涙妧鏈錛氬姩鎬佸璞″垱寤恒佸璞″簭鍒楀寲絳夛紝瀹冧滑鍙兘浼氳姹俁TTI緇欏嚭涓涓潤鎬佷笉鍙樼殑ID銆傚湪鏈枃鐨勫疄鐜頒腑錛屽姝や綔浜嗘湁鐩婄殑灝?
璇曘?br> 銆銆棣栧厛澹版槑涓涓敤鏉ヤ駭鐢熼掑綾籌D鐨勫叏灞鍙橀噺銆傚啀澹版槑濡備笅涓涓粨鏋勶紝娌℃湁鏁版嵁鎴愬憳錛屽彧鏈変竴涓瀯閫犲嚱鏁扮敤浜庡垵濮嬪寲TypeInfo鐨勭被ID錛?br>
extern int TypeInfoOrder=0; struct InitTypeInfo { InitTypeInfo(TypeInfo* info) { info->type_id=TypeInfoOrder++; } };
銆銆涓篣Object娣誨姞涓涓猵rivate鐨勯潤鎬佹垚鍛樺強鍏跺垵濮嬪寲錛?br>
class UObject { //鈥︹?br>private: static InitTypeInfo initClassInfo; }; InitTypeInfo UObject::initClassInfo(&(UObject::rttiTypeInfo));
銆
銆騫朵笖瀵規瘡涓涓粠UObject媧劇敓鐨勫瓙綾諱篃榪涜鍚屾牱鐨勬坊鍔犮傝繖鏍鋒偍灝嗙湅鍒幫紝鍦–++涓誨嚱鏁版墽琛屽墠錛屽惎鍔ㄤ唬鐮佸皢鏇挎垜浠皟鐢ㄦ瘡涓涓被鐨?
initClassInfo鎴愬憳鐨勬瀯閫犲嚱鏁癐nitTypeInfo::InitTypeInfo(TypeInfo*
info)錛岃屾鏄繖涓嚱鏁版浛鎴戜滑浜х敓騫惰緗簡綾籌D銆侷nitTypeInfo鐨勬瀯閫犲嚱鏁拌繕鍙互鏇挎垜浠仛鍏朵粬涓浜涙湁鐢ㄧ殑鍒濆鍖栧伐浣滐紝姣斿灝嗘墍鏈夌殑
TypeInfo淇℃伅鐧誨綍鍒頒竴涓〃鏍奸噷錛岃鎴戜滑鍙互寰堟柟渚跨殑閬嶅巻瀹冦?br> 銆銆浣嗗疄璺典笌鏌ラ槄璧勬枡璁╂垜浠彂鐜幫紝鐢變簬C++涓闈欐佹垚鍛樺垵濮嬪寲鐨勯『搴忔病鏈夋槑紜殑瑙勫畾錛屾墍浠ヨ繖鏍風殑鏂瑰紡浜х敓鍑烘潵鐨勭被ID騫墮潪瀹屽叏闈欐侊紝鎹竴涓紪璇戝櫒緙栬瘧鎵ц浜х敓鐨勭粨鏋滃彲鑳藉畬鍏ㄤ笉鍚屻?br> 銆銆榪樻湁涓涓彲浠ヨ冭檻鐨勬柟妗堟槸閲囩敤鏌愮鏃犲啿紿丠ASH綆楁硶錛屽皢綾誨悕杞崲鎴愪負涓涓敮涓鏁存暟銆備嬌鐢ㄦ爣鍑咰RC32綆楁硶浠庣被鍨嬪悕璁$畻鍑轟竴涓暣鏁頒綔涓虹被ID涔熻鏄釜涓嶉敊鐨勬兂娉昜3]銆?br> 銆銆紼嬪簭娓呭崟
// URtti.h #ifndef __URTTI_H__ #define __URTTI_H__ class UObject; struct TypeInfo { char* className; int type_id; TypeInfo* pBaseClass; operator== (const TypeInfo& info){ return this==&info; } operator!= (const TypeInfo& info){ return this!=&info; } }; inline std::ostream& operator<< (std::ostream& os,TypeInfo& info) { return (os<< "[" << &info << "]" << "\t" << info.type_id << ":" << info.className << ":" << info.pBaseClass << std::endl); } extern int TypeInfoOrder; struct InitTypeInfo { InitTypeInfo(/*TypeInfo* base,*/TypeInfo* info) { info->type_id=TypeInfoOrder++; } }; #define TYPEINFO_OF_CLASS(class_name) (class_name::GetTypeInfoClass()) #define TYPEINFO_OF_OBJ(obj_name) (obj_name.GetTypeInfo()) #define TYPEINFO_OF_PTR(ptr_name) (ptr_name->GetTypeInfo()) #define DECLARE_TYPEINFO(class_name) \ public: \ virtual int GetTypeID(){return TYPEINFO_MEMBER(class_name).type_id;} \ virtual char* GetTypeName(){return TYPEINFO_MEMBER(class_name).className;} \ virtual TypeInfo& GetTypeInfo(){return TYPEINFO_MEMBER(class_name);} \ static TypeInfo& GetTypeInfoClass(){return TYPEINFO_MEMBER(class_name);} \ private: \ static TypeInfo TYPEINFO_MEMBER(class_name); \ static InitTypeInfo initClassInfo; \ #define IMPLEMENT_TYPEINFO(class_name,base_name) \ TypeInfo class_name::TYPEINFO_MEMBER(class_name)= \ {#class_name,0,&(base_name::GetTypeInfoClass())}; \ InitTypeInfo class_name::initClassInfo(&(class_name::TYPEINFO_MEMBER(class_name))); #define DYNAMIC_CAST(object_ptr,class_name) \ safe_cast(object_ptr,TYPEINFO_OF_CLASS(class_name)) #define TYPEINFO_MEMBER(class_name) rttiTypeInfo class UObject { public: bool IsKindOf(TypeInfo& cls); public: virtual int GetTypeID(){return TYPEINFO_MEMBER(UObject).type_id;} virtual char* GetTypeName(){return TYPEINFO_MEMBER(UObject).className;} virtual TypeInfo& GetTypeInfo(){return TYPEINFO_MEMBER(UObject);} static TypeInfo& GetTypeInfoClass(){return TYPEINFO_MEMBER(UObject);} private: static TypeInfo TYPEINFO_MEMBER(UObject); static InitTypeInfo initClassInfo; }; template inline T* safe_cast(UObject* ptr,TypeInfo& cls) { return (ptr->IsKindOf(cls)?(T*)ptr:NULL); } #endif // URtti.cpp #include "urtti.h" extern int TypeInfoOrder=0; TypeInfo UObject::TYPEINFO_MEMBER(UObject)={"UObject",0,NULL}; InitTypeInfo UObject::initClassInfo(&(UObject::TYPEINFO_MEMBER(UObject))); bool UObject::IsKindOf(TypeInfo& cls) { TypeInfo* p=&(this->GetTypeInfo()); while(p!=NULL){ if(p->type_id==cls.type_id) return true; p=p->pBaseClass; } return false; } // mail.cpp #include #include "urtti.h" using namespace std; class UView:public UObject { DECLARE_TYPEINFO(UView) }; IMPLEMENT_TYPEINFO(UView,UObject) class UGraph:public UObject { DECLARE_TYPEINFO(UGraph) }; IMPLEMENT_TYPEINFO(UGraph,UObject) void main() { UObject* po=new UObject; UView* pv=new UView; UObject* pg=new UGraph; if(DYNAMIC_CAST(po,UView)) cout << "po => UView succeed" << std::endl; else cout << "po => UView failed" << std::endl; if(DYNAMIC_CAST(pv,UView)) cout << "pv => UView succeed" << std::endl; else cout << "pv => UView failed" << std::endl; if(DYNAMIC_CAST(po,UGraph)) cout << "po => UGraph succeed" << std::endl; else cout << "po => UGraph failed" << std::endl; if(DYNAMIC_CAST(pg,UGraph)) cout << "pg => UGraph succeed" << std::endl; else cout << "pg => UGraph failed" << std::endl; }
銆銆瀹炵幇緇撴灉 銆銆鏈枃瀹炵幇浜嗗涓嬪嚑涓畯鏉ユ敮鎸丷TTI錛屽畠浠殑浣跨敤鏂規硶閮藉彲浠ュ湪涓婇潰鐨勪唬鐮佷腑鎵懼埌錛?br>銆銆
瀹忓嚱鏁?/td>
鍔熻兘鍙婂弬鏁拌鏄?/td>
DECLARE_TYPEINFO(class_name)
涓虹被娣誨姞RTTI鍔熻兘鏀懼湪綾誨0鏄庣殑璧峰浣嶇疆
IMPLEMENT_TYPEINFO(class_name,base)
鍚屼笂錛屾斁鍦ㄧ被瀹氫箟浠諱綍浣嶇疆
TYPEINFO_OF_CLASS(class_name)
鐩稿綋浜巘ypeid(綾誨悕)
TYPEINFO_OF_OBJ(obj_name)
鐩稿綋浜巘ypeid(瀵硅薄)
TYPEINFO_OF_PTR(ptr_name)
鐩稿綋浜巘ypeid(鎸囬拡)
DYNAMIC_CAST(object_ptr,class_name)
鐩稿綋浜巇ynamic_castobject_ptr
銆銆鎬ц兘嫻嬭瘯 銆銆嫻嬭瘯浠g爜錛?/b> 銆銆榪欓噷浣跨敤鐩稿悓嬈℃暟鐨凞YNAMIC_CAST鍜宒ynamic_cast榪涜瀵規瘮嫻嬭瘯錛屽湪VC6.0涓嬬紪璇戣繍琛岋紝浣跨敤榛樿鐨凴elease緙栬瘧閰嶇疆閫夐」銆備負浜嗛伩鍏嶇紪璇戝櫒浼樺寲瀵艱嚧鐨勪笉鍏鉤嫻嬭瘯緇撴灉錛屾垜鍦ㄥ驚鐜腑鍔犲叆浜嗘棤鎰忎箟鐨勮鏁版搷浣溿?br>
void main() { UObject* po=new UObject; UView* pv=new UView; UObject* pg=new UGraph; int a,b,c,d; a=b=c=d=0; const int times=30000000; cerr << "鏃墮棿嫻嬭瘯杈撳嚭錛? << endl; cerr << "start my DYNAMIC_CAST at: " << time(NULL) << endl; for(int i=0;i if(DYNAMIC_CAST(po,UView)) a++; else a--; if(DYNAMIC_CAST(pv,UView)) b++; else b--; if(DYNAMIC_CAST(po,UGraph)) c++; else c--; if(DYNAMIC_CAST(pg,UGraph)) d++; else d--; } cerr << "end my DYNAMIC_CAST at: " << time(NULL) << endl; cerr << "start c++ dynamic_cast at: " << time(NULL) << endl; for(i=0;i if(dynamic_cast(po)) a++; else a--; if(dynamic_cast(pv)) b++; else b--; if(dynamic_cast(po)) c++; else c--; if(dynamic_cast(pg)) d++; else d--; } cerr << "end c++ dynamic_cast at: " << time(NULL) << endl; cerr << a << b << c << d << endl; }
銆銆榪愯緇撴灉錛?br>
start my DYNAMIC_CAST at: 1021512140 end my DYNAMIC_CAST at: 1021512145 start c++ dynamic_cast at: 1021512145 end c++ dynamic_cast at: 1021512160
銆銆榪欐槸涓婅堪鏉′歡涓嬬殑嫻嬭瘯杈撳嚭錛屾垜浠彲浠ョ湅鍒幫紝鏈枃瀹炵幇鐨勮繖涓簿綆RTTI鏂規榪愯DYNAMIC_CAST鐨勬椂闂村紑閿鍙湁dynamic_cast鐨?/3銆備負浜嗗緱鍒版洿鍏ㄩ潰鐨勬暟鎹紝榪樿繘琛屼簡DEBUG緙栬瘧閰嶇疆閫夐」涓嬬殑嫻嬭瘯銆?br> 銆銆杈撳嚭錛?br>
start my DYNAMIC_CAST at: 1021512041 end my DYNAMIC_CAST at: 1021512044 start c++ dynamic_cast at: 1021512044 end c++ dynamic_cast at: 1021512059
銆
銆榪欑鎯呭喌涓婦YNAMIC_CAST榪愯閫熷害瑕佹瘮dynamic_cast鎱竴鍊嶅乏鍙熾傚鏋滃湪Release緙栬瘧閰嶇疆閫夐」涓嬪皢UObject::
IsKindOf鏂規硶鏀規垚濡備笅inline鍑芥暟錛屾垜浠皢寰楀埌鏇磋浜哄叴濂嬬殑緇撴灉錛圖YNAMIC_CAST榪愯鏃墮棿鍙湁dynamic_cast鐨?
1/5錛夈?br>
inline bool UObject::IsKindOf(TypeInfo& cls) { for(TypeInfo* p=&(this->GetTypeInfo());p!=NULL;p=p->pBaseClass) if(p==&cls) return true; return false; }
銆銆杈撳嚭錛?br>
start my DYNAMIC_CAST at: 1021512041 end my DYNAMIC_CAST at: 1021512044 start c++ dynamic_cast at: 1021512044 end c++ dynamic_cast at: 1021512059
銆銆緇撹錛?/b> 銆
銆鐢辨湰鏂囩殑瀹炶返鍙互寰楀嚭緇撹錛岃嚜宸卞姩鎵嬬紪鐮佸疄鐜癛TTI鏄畝鍗曞彲琛岀殑銆傝繖鏍風殑瀹炵幇鍙互鍦ㄧ紪璇戝櫒浼樼鐨勪唬鐮佷紭鍖栦腑琛ㄧ幇鍑烘瘮dynamic_cast鏇村ソ鐨勬?
鑳斤紝鑰屼笖娌℃湁甯︽潵榪囧鐨勫瓨鍌ㄥ紑閿銆傛湰鏂囩殑RTTI浠ユц兘涓轟富瑕佽璁$洰鏍囷紝鍦ㄥ疄鐜頒笂涓瀹氱▼搴︿笂鍙楀埌浜哅FC鐨勫獎鍝嶃傞備簬宓屽叆寮忕幆澧冦?/span>
]]> c錛嬶紜闅忕瑪1 http://www.shnenglu.com/Ipedo/archive/2005/12/06/1567.htmlIpedo Ipedo Tue, 06 Dec 2005 09:01:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/12/06/1567.html http://www.shnenglu.com/Ipedo/comments/1567.html http://www.shnenglu.com/Ipedo/archive/2005/12/06/1567.html#Feedback 0 http://www.shnenglu.com/Ipedo/comments/commentRss/1567.html http://www.shnenglu.com/Ipedo/services/trackbacks/1567.html 2銆佸綋鍑芥暟鍙傛暟鏄ぇ鐨勭粨鏋勭殑鏃跺欙紝灝介噺浣跨敤緇撴瀯鐨勬寚閽堟垨寮曠敤錛岄伩鍏嶅ぇ鐨勫唴瀛樻搷浣滐紙澶嶅埗鐨勫紑閿錛夛紝鍙傛暟浣跨敤鐨勬椂鍊欐敞鎰忎笉甯屾湜鍑芥暟鍐呮敼鍙樺師鏉ュ兼椂錛屽簲璇ュ姞涓奵onst淇グ絎﹀彿錛?BR>3銆佷嬌鐢ㄥ閲嶇戶鎵挎椂搴旇閬垮厤鍑虹幇DOD錛堥捇鐭沖瀷緇ф壙鏍戯級錛岃櫄緇ф壙鍙互瑙e喅榪欎釜闂錛屼絾鏄簲鐢ㄦ椂搴旇灝介噺閬垮厤榪欎簩鑰咃紱 4銆佸敖閲忓鐨勪嬌鐢╟onst錛?BR>5銆佸紩鐢ㄥ彧鑳借鍒濆鍖栦竴嬈★紝鎸囬拡鍙互琚嬈¤祴鍊鹼紝鍙互榪欎箞璇達紝寮曠敤鏄痗onst鎸囬拡錛涘紩鐢ㄥ繀欏誨湪鐢蟲槑鐨勬椂鍊欏垵濮嬪寲錛屾寚閽堝垯涓嶇敤錛屽紩鐢ㄤ笉鑳戒負NULL錛屼篃涓嶈兘new鍜宒elete錛屽畠鏇磋薄涓涓璞★紱 6銆佸洓縐峜錛嬶紜椋庢牸鐨勫己鍒惰漿鎹紝static_cast(瑙勫畾琚漿鎹㈢殑浜岃呭瓨鍦ㄨ仈緋伙紝鍦ㄥ悓涓緇ф壙浣撶郴鍐?錛宑onst_cast錛堝皢甯擱噺杞崲涓洪潪甯擱噺錛夛紝reinterpret_cast錛堣漿鎹換浣曠被鍨嬶紝鍚宑鐨勫己鍒惰漿鎹級錛宒ynamic_cast錛堝姩鎬佺被鍨嬭漿鎹紝闇瑕佺紪璇戝櫒鏀寔榪愯鏈熺被鍨嬩俊鎭疪TTI錛夈?img src ="http://www.shnenglu.com/Ipedo/aggbug/1567.html" width = "1" height = "1" /> ]]> 瀹炵敤瀹忥紞錛峷c錛嬶紜涓柟渚挎敞閲?/title> http://www.shnenglu.com/Ipedo/archive/2005/12/02/1495.htmlIpedo Ipedo Fri, 02 Dec 2005 06:46:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/12/02/1495.html http://www.shnenglu.com/Ipedo/comments/1495.html http://www.shnenglu.com/Ipedo/archive/2005/12/02/1495.html#Feedback 0 http://www.shnenglu.com/Ipedo/comments/commentRss/1495.html http://www.shnenglu.com/Ipedo/services/trackbacks/1495.html '娣誨姞鏂囦歡澶村畾涔?BR> Public Sub AddFileHead()
Dim objTextSelection As TextSelection Dim comment As String objTextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection) 'objTextSelection.LineUp() objTextSelection.NewLine() objTextSelection.Text = comment + "http://===================================================================" objTextSelection.NewLine() objTextSelection.Text = comment + "/** \file" objTextSelection.NewLine() objTextSelection.Text = comment + "* Filename: " + DTE.ActiveDocument.Name objTextSelection.NewLine() objTextSelection.Text = comment + "*" objTextSelection.NewLine() objTextSelection.Text = comment + "* Desc:" objTextSelection.NewLine() objTextSelection.Text = comment + "*" objTextSelection.NewLine() objTextSelection.Text = comment + "* His: Ipedo create @ " + Date.Now objTextSelection.NewLine() objTextSelection.Text = comment + "*/" objTextSelection.NewLine() objTextSelection.Text = comment + "http://==================================================================="
End Sub '娣誨姞鏂囦歡鍑芥暟瀹氫箟 Public Sub AddFunctionHead()
Dim objTextSelection As TextSelection Dim comment As String objTextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection) 'objTextSelection.LineUp() objTextSelection.NewLine() objTextSelection.Text = comment + "/** \brief" objTextSelection.NewLine() objTextSelection.Text = comment + " " + "* 鍑芥暟鍔熻兘錛? objTextSelection.NewLine() objTextSelection.Text = comment + "*" objTextSelection.NewLine() objTextSelection.Text = comment + "* 鍑芥暟璇存槑錛? objTextSelection.NewLine() objTextSelection.Text = comment + "*" objTextSelection.NewLine() objTextSelection.Text = comment + "* \param _f1 絎竴涓誕鐐瑰弬鏁?" objTextSelection.NewLine() objTextSelection.Text = comment + "* \param _f2 絎簩涓誕鐐瑰弬鏁?" objTextSelection.NewLine() objTextSelection.Text = comment + "* \return bool 榪斿洖涓や釜嫻偣鏁版槸鍚︾浉絳?榪斿洖true鏃惰〃紺虹浉絳?" objTextSelection.NewLine() objTextSelection.Text = comment + "*" objTextSelection.NewLine() objTextSelection.Text = comment + "* 綆楁硶鎻忚堪錛? objTextSelection.NewLine() objTextSelection.Text = comment + "* 錛堟弿榪板唴瀹癸級" objTextSelection.NewLine() objTextSelection.Text = comment + "*/"
End Sub Sub 鏂囦歡娉ㄩ噴() DTE.ActiveDocument.Selection.Text = "http://===================================================================" DTE.ActiveDocument.Selection.NewLine() DTE.ActiveDocument.Selection.Text = "/** \file " DTE.ActiveDocument.Selection.NewLine() 'DTE.ActiveDocument.Selection.Indent() DTE.ActiveDocument.Selection.Text = "* Filename : " + DTE.ActiveDocument.Name DTE.ActiveDocument.Selection.NewLine() DTE.ActiveDocument.Selection.Text = "* Desc : " DTE.ActiveDocument.Selection.NewLine() DTE.ActiveDocument.Selection.Text = "* His : Windy create @" + Date.Now DTE.ActiveDocument.Selection.NewLine() DTE.ActiveDocument.Selection.NewLine() DTE.ActiveDocument.Selection.DeleteLeft() DTE.ActiveDocument.Selection.Text = "*/" DTE.ActiveDocument.Selection.NewLine() DTE.ActiveDocument.Selection.Text = "http://===================================================================" DTE.ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText) End Sub
]]>BMP鏂囦歡緇撴瀯 http://www.shnenglu.com/Ipedo/archive/2005/11/12/1104.htmlIpedo Ipedo Sat, 12 Nov 2005 09:34:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/11/12/1104.html http://www.shnenglu.com/Ipedo/comments/1104.html http://www.shnenglu.com/Ipedo/archive/2005/11/12/1104.html#Feedback 2 http://www.shnenglu.com/Ipedo/comments/commentRss/1104.html http://www.shnenglu.com/Ipedo/services/trackbacks/1104.html ---- 1. BMP鏂囦歡緇勬垚
---- BMP鏂囦歡鐢辨枃浠跺ご銆佷綅鍥句俊鎭ご銆侀鑹蹭俊鎭拰鍥懼艦鏁版嵁鍥涢儴鍒嗙粍鎴愩?
---- 2. BMP鏂囦歡澶?
---- BMP鏂囦歡澶存暟鎹粨鏋勫惈鏈塀MP鏂囦歡鐨勭被鍨嬨佹枃浠跺ぇ灝忓拰浣嶅浘璧峰浣嶇疆絳変俊鎭?
---- 鍏剁粨鏋勫畾涔夊涓?
typedef struct tagBITMAPFILEHEADER
{
WORDbfType; // 浣嶅浘鏂囦歡鐨勭被鍨嬶紝蹇呴』涓築M
DWORD bfSize; // 浣嶅浘鏂囦歡鐨勫ぇ灝忥紝浠ュ瓧鑺備負鍗曚綅
WORDbfReserved1; // 浣嶅浘鏂囦歡淇濈暀瀛楋紝蹇呴』涓?
WORDbfReserved2; // 浣嶅浘鏂囦歡淇濈暀瀛楋紝蹇呴』涓?
DWORD bfOffBits; // 浣嶅浘鏁版嵁鐨勮搗濮嬩綅緗紝浠ョ浉瀵逛簬浣嶅浘
// 鏂囦歡澶寸殑鍋忕Щ閲忚〃紺猴紝浠ュ瓧鑺備負鍗曚綅
} BITMAPFILEHEADER;
---- 3. 浣嶅浘淇℃伅澶?
BMP浣嶅浘淇℃伅澶存暟鎹敤浜庤鏄庝綅鍥劇殑灝哄絳変俊鎭?
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 鏈粨鏋勬墍鍗犵敤瀛楄妭鏁?
LONGbiWidth; // 浣嶅浘鐨勫搴︼紝浠ュ儚绱犱負鍗曚綅
LONGbiHeight; // 浣嶅浘鐨勯珮搴︼紝浠ュ儚绱犱負鍗曚綅
WORD biPlanes; // 鐩爣璁懼鐨勭駭鍒紝蹇呴』涓?
WORD biBitCount// 姣忎釜鍍忕礌鎵闇鐨勪綅鏁幫紝蹇呴』鏄?(鍙岃壊),
// 4(16鑹?錛?(256鑹?鎴?4(鐪熷僵鑹?涔嬩竴
DWORD biCompression; // 浣嶅浘鍘嬬緝綾誨瀷錛屽繀欏繪槸 0(涓嶅帇緙?,
// 1(BI_RLE8鍘嬬緝綾誨瀷)鎴?(BI_RLE4鍘嬬緝綾誨瀷)涔嬩竴
DWORD biSizeImage; // 浣嶅浘鐨勫ぇ灝忥紝浠ュ瓧鑺備負鍗曚綅
LONGbiXPelsPerMeter; // 浣嶅浘姘村鉤鍒嗚鯨鐜囷紝姣忕背鍍忕礌鏁?
LONGbiYPelsPerMeter; // 浣嶅浘鍨傜洿鍒嗚鯨鐜囷紝姣忕背鍍忕礌鏁?
DWORD biClrUsed;// 浣嶅浘瀹為檯浣跨敤鐨勯鑹茶〃涓殑棰滆壊鏁?
DWORD biClrImportant;// 浣嶅浘鏄劇ず榪囩▼涓噸瑕佺殑棰滆壊鏁?
} BITMAPINFOHEADER;
---- 4. 棰滆壊琛?
---- 棰滆壊琛ㄧ敤浜庤鏄庝綅鍥句腑鐨勯鑹詫紝瀹冩湁鑻ュ共涓〃欏癸紝姣忎竴涓〃欏規槸涓涓猂GBQUAD綾誨瀷鐨勭粨鏋勶紝瀹氫箟涓縐嶉鑹層俁GBQUAD緇撴瀯鐨勫畾涔夊涓?
typedef struct tagRGBQUAD {
BYTErgbBlue;// 钃濊壊鐨勪寒搴?鍊艱寖鍥翠負0-255)
BYTErgbGreen; // 緇胯壊鐨勪寒搴?鍊艱寖鍥翠負0-255)
BYTErgbRed; // 綰㈣壊鐨勪寒搴?鍊艱寖鍥翠負0-255)
BYTErgbReserved;// 淇濈暀錛屽繀欏諱負0
} RGBQUAD;
棰滆壊琛ㄤ腑RGBQUAD緇撴瀯鏁版嵁鐨勪釜鏁版湁biBitCount鏉ョ‘瀹?
褰揵iBitCount=1,4,8鏃訛紝鍒嗗埆鏈?,16,256涓〃欏?
褰揵iBitCount=24鏃訛紝娌℃湁棰滆壊琛ㄩ」銆?
浣嶅浘淇℃伅澶村拰棰滆壊琛ㄧ粍鎴愪綅鍥句俊鎭紝BITMAPINFO緇撴瀯瀹氫箟濡備笅:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 浣嶅浘淇℃伅澶?
RGBQUAD bmiColors[1]; // 棰滆壊琛?
} BITMAPINFO;
---- 5. 浣嶅浘鏁版嵁
---- 浣嶅浘鏁版嵁璁板綍浜嗕綅鍥劇殑姣忎竴涓儚绱犲鹼紝璁板綍欏哄簭鏄湪鎵弿琛屽唴鏄粠宸﹀埌鍙?鎵弿琛屼箣闂存槸浠庝笅鍒頒笂銆備綅鍥劇殑涓涓儚绱犲兼墍鍗犵殑瀛楄妭鏁?
褰揵iBitCount=1鏃訛紝8涓儚绱犲崰1涓瓧鑺?
褰揵iBitCount=4鏃訛紝2涓儚绱犲崰1涓瓧鑺?
褰揵iBitCount=8鏃訛紝1涓儚绱犲崰1涓瓧鑺?
褰揵iBitCount=24鏃?1涓儚绱犲崰3涓瓧鑺?
Windows瑙勫畾涓涓壂鎻忚鎵鍗犵殑瀛楄妭鏁板繀欏繪槸 4鐨勫嶆暟(鍗充互long涓哄崟浣?,涓嶈凍鐨勪互0濉厖錛?
涓涓壂鎻忚鎵鍗犵殑瀛楄妭鏁拌綆楁柟娉? DataSizePerLine= (biWidth* biBitCount+31)/8;
// 涓涓壂鎻忚鎵鍗犵殑瀛楄妭鏁?DataSizePerLine= DataSizePerLine/4*4; // 瀛楄妭鏁板繀欏繪槸4鐨勫嶆暟
浣嶅浘鏁版嵁鐨勫ぇ灝?涓嶅帇緙╂儏鍐典笅): DataSize= DataSizePerLine* biHeight;
]]> 鍏充簬MFC瀵硅薄 http://www.shnenglu.com/Ipedo/archive/2005/11/12/1103.htmlIpedo Ipedo Sat, 12 Nov 2005 08:57:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/11/12/1103.html http://www.shnenglu.com/Ipedo/comments/1103.html http://www.shnenglu.com/Ipedo/archive/2005/11/12/1103.html#Feedback 0 http://www.shnenglu.com/Ipedo/comments/commentRss/1103.html http://www.shnenglu.com/Ipedo/services/trackbacks/1103.html 闃呰鍏ㄦ枃 ]]> 鍐呭瓨娉勯湶媯嫻?/title> http://www.shnenglu.com/Ipedo/archive/2005/10/27/867.htmlIpedo Ipedo Thu, 27 Oct 2005 07:49:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/10/27/867.html http://www.shnenglu.com/Ipedo/comments/867.html http://www.shnenglu.com/Ipedo/archive/2005/10/27/867.html#Feedback 4 http://www.shnenglu.com/Ipedo/comments/commentRss/867.html http://www.shnenglu.com/Ipedo/services/trackbacks/867.html 鏂囦歡寮濮嬪鍔犲叆涓嬪垪瀹氫箟 #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> 紼嬪簭閫鍑烘椂鍔犲叆浠ヤ笅鍑芥暟錛?BR> _CrtDumpMemoryLeaks(); 濡傛灉鏈夋硠婕忎細鏄劇ず e:\myproject\mltithrd.14\mltithrd.cpp(95) : {68} client block at 0x00372550, subtype c0, 144 bytes long. a CMultiDocTemplate object at $00372550, 144 bytes long ]]> 鍏充簬list control鎺т歡 http://www.shnenglu.com/Ipedo/archive/2005/10/26/861.htmlIpedo Ipedo Wed, 26 Oct 2005 06:44:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/10/26/861.html http://www.shnenglu.com/Ipedo/comments/861.html http://www.shnenglu.com/Ipedo/archive/2005/10/26/861.html#Feedback 1 http://www.shnenglu.com/Ipedo/comments/commentRss/861.html http://www.shnenglu.com/Ipedo/services/trackbacks/861.html m_list1.SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES ); LVS_EX_FULLROWSELECT琛ㄧず鍙互鐐逛腑琛屼腑鐨勪換鎰忎竴涓垪閫変腑榪欎竴鏉¤褰?BR>LVS_EX_GRIDLINES琛ㄧず鍒椾箣闂存湁鍒嗛殧絎﹀彿 LVS_EX_CHECKBOXES 琛ㄧず姣忎竴琛岀涓鍒楁槸checkbox ]]> 鏂扮殑寮濮?/title> http://www.shnenglu.com/Ipedo/archive/2005/10/26/857.htmlIpedo Ipedo Wed, 26 Oct 2005 01:47:00 GMT http://www.shnenglu.com/Ipedo/archive/2005/10/26/857.html http://www.shnenglu.com/Ipedo/comments/857.html http://www.shnenglu.com/Ipedo/archive/2005/10/26/857.html#Feedback 1 http://www.shnenglu.com/Ipedo/comments/commentRss/857.html http://www.shnenglu.com/Ipedo/services/trackbacks/857.html 闃呰鍏ㄦ枃 ]]>
色诱久久av |
久久精品一区二区影院 |
久久亚洲AV成人无码电影 |
久久99中文字幕久久 |
亚洲国产成人久久综合碰碰动漫3d |
久久久久国产精品三级网 |
久久99热这里只频精品6 |
国产亚洲欧美成人久久片 |
久久久无码精品午夜 |
91精品国产色综合久久 |
久久最新免费视频 |
久久美女人爽女人爽 |
亚洲AV日韩AV天堂久久 |
久久免费99精品国产自在现线
|
亚洲精品tv久久久久 |
少妇高潮惨叫久久久久久
|
国内精品久久久久久久久 |
亚洲va久久久噜噜噜久久 |
99久久免费国产精品 |
久久精品国产亚洲AV嫖农村妇女 |
久久久久人妻一区精品果冻 |
97久久超碰国产精品2021 |
国内精品久久久久影院老司 |
久久996热精品xxxx |
韩国三级大全久久网站 |
亚洲中文字幕久久精品无码APP |
午夜精品久久影院蜜桃
|
国产成人精品三上悠亚久久 |
久久影院亚洲一区 |
久久精品无码av |
国产精品日韩欧美久久综合 |
国产韩国精品一区二区三区久久
|
激情伊人五月天久久综合 |
久久无码专区国产精品发布 |
日产久久强奸免费的看 |
久久久久久国产a免费观看不卡 |
狠狠色综合网站久久久久久久 |
99久久精品国产一区二区三区 |
久久这里只精品国产99热 |
久久中文娱乐网 |
久久中文精品无码中文字幕 |