锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
=======================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?12. 榪涚▼涓庣嚎紼?br>=======================
鏍稿績(jī)瀵硅薄
鏍稿績(jī)瀵硅薄 浜х敓鏂規(guī)硶
event CreateEvent
mutex CreateMutex
semaphore CreateSemaphore
file CreateFile
file-mapping CreateFileMapping
process CreateProcess
thread CreateThread
榪涚▼鐨勭敓鍛藉懆鏈燂細(xì) 銆婃繁鍏ユ祬鍑篗FC銆婸39
1銆乻hell璋冪敤 CreateProcess 嬋媧?App.exe
2銆佺郴緇熶駭鐢熶竴涓繘紼嬫牳蹇?jī)瀵硅薄锛岃鏁板間負(fù)1.
3銆佺郴緇熷湪姝よ繘紼嬪緩绔嬩竴涓?GB鍦板潃絀洪棿銆?br> 4銆佸姞杞藉櫒灝嗗繀瑕佺殑浠g爜鍔犺澆鍒頒笂榪板湴鍧絀洪棿涓紝鍖呮嫭App.exe鐨勭▼搴忋佹暟鎹紝浠ュ強(qiáng)鎵闇鐨勫姩鎬侀摼鎺ュ嚱鏁板簱錛圖LLs錛夈?br> 5銆佺郴緇熶負(fù)姝よ繘紼嬪緩绔嬩竴涓嚎紼嬶紝鎴愪負(fù)涓葷嚎紼嬶紝鐜版垚鎵嶆槸CPU鏃墮棿鐨勫垎閰嶅璞°?br> 6銆佺郴緇熻皟鐢?C runtime 鍑芥暟搴撶殑 Startup code銆?br> 7銆乻tartup code 璋冪敤 App紼嬪簭鐨?WinMain鍑芥暟銆?br> 8銆丄pp寮濮嬭繍琛屻?br> 9銆佷嬌鐢ㄨ呭叧闂瑼pp涓葷獥鍙o紝鏄疻inMain娑堟伅寰幆緇撴潫錛學(xué)inMain緇撴潫
10銆佸洖鍒癝tartup code銆?br> 11銆佸洖鍒扮郴緇燂紝緋葷粺璋冪敤 ExitProcess緇撴潫榪涚▼
浜х敓瀛愯繘紼嬶細(xì)
CreateProcess錛?br> LPCSTR lpApplicationName, //鎸囧畾鍙墽琛屾枃浠跺悕
LPSTR lpCommandLine, //鎸囧畾嬈蹭紶緇欐柊榪涚▼鐨勫懡浠よ鍙傛暟
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles, //鎸囧畾3銆?鐨勫畨鍏ㄥ睘鎬ф槸鍚﹂渶瑕佽緇ф壙
DWORD dwCreationFlags, //鏍囪瘑緇勫悎
LPVOID lpEnvironment, //鎸囧畾榪涚▼鎵浣跨敤鐨勭幆澧冨彉閲忓尯錛孨ull鎴栫埗榪涚▼鐜鍙橀噺
LPCSTR lpCurrentDirectory, //璁懼畾瀛愯繘紼嬬殑宸ヤ綔鐩綍涓庡伐浣滈┍鍔ㄥ櫒錛岃嫢涓篘ULL錛岀戶鎵跨埗榪涚▼
LPSTARTUPINFO lpStartupInfo, //鎸囧悜涓涓?STARTUPINFO緇撴瀯鐨勬寚閽堬紝
LPPROCESS_INFORMATION lpProcessInformation
);
綰跨▼鐨勭敓鍛藉懆鏈燂細(xì) 銆婃繁鍏ユ祬鍑篗FC銆婸41
璋冪敤CreateThread浜х敓棰濆鐨勭嚎紼嬫椂錛岀郴緇熷畬鎴愪互涓嬪伐浣?br> 1銆侀厤緗?#8220;綰跨▼瀵硅薄”錛屽叾handle灝嗘垚涓?CreateThread 鐨勮繑鍥炲?br> 2銆佽瀹氳鏁板櫒涓?1.
3銆侀厤緗嚎紼?context銆?br> 4銆佷繚鐣欑嚎紼嬬殑鍫嗘爤銆?br> 5銆佸皢 context 涓殑鍫嗘爤鎸囬拡緙撳瓨鍣紙SS錛夊拰鎸囦護(hù)鎸囬拡緙撳瓨鍣紙IP錛夎瀹氬Ε褰撱?br>
CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, //瀹夊叏灞炴х殑璁懼畾鍙?qiáng)鐟翩?br> DWORD dwStackSize, //鍫嗘爤澶у皬
LPTHREAD_START_ROUTINE lpStartAddress, //璁懼畾“綰跨▼鍑芥暟”鐨勫悕縐?br> LPVOID lpParameter,
DWORD dwCreationFlags, //涓?錛屽垯綰跨▼绔嬪嵆寮濮嬫墽琛屻?br> LPDWORD lpThreadId //綰虹粐綰跨▼鐨勶緝錛?br> );
unsigned long _beginthreadex ( 銆婃繁鍏ユ祬鍑篗FC銆婸42
void* security,
unsigned stack_size,
unsigned (__stdcall *start_address) (void *),
void *arglist,
unsigned initflag,
unsigned* thrdaddr
);
======================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?11. MFC 瀹炵幇 COM
======================
COM ( Component Object Model,緇勪歡瀵硅薄妯″瀷錛?br> OLE 鏄井杞殑瀵硅薄鎶鏈殑鍚嶅瓧錛屾槸涓縐嶆暣鍚堣蔣浠剁殑緇熶竴鏂規(guī)硶錛屼嬌寰楄蔣浠跺彲浠ラ殢鏃墮棿鑰屾紨鍙橈紝鏄竴縐嶆暣鍚堟妧鏈?br> 浠庢椂闂寸殑瑙掑害璁詫紝OLE鏄渶鏃╁嚭鐜扮殑錛岀劧鍚庢槸COM鍜?ActiveX錛?br> 浠庝綋緋葷粨鏋勮搴﹁錛孫LE鍜孉ctiveX鏄緩绔嬪湪COM涔嬩笂鐨勶紝鎵浠OM鏄熀紜錛?br> OLE鐨勪富瑕佺洰鏍囨槸浣垮緱搴旂敤紼嬪簭琚鐣屾墍璁よ瘑鍜岀悊瑙c?br> 浣跨敤COM緙栫▼鐨勭洰鐨勬槸浣垮緱杞歡浠庢簮浠g爜浠ュ強(qiáng)鐨勯噸鐢ㄤ笂鍗囧埌浜岃繘鍒朵竴綰х殑閲嶇敤銆?br>
緇勪歡鏄竴涓彲閲嶇敤鐨勬ā鍧楋紝鐢變竴緇勫鐞嗚繃紼嬨佹暟鎹皝瑁呭拰鐢ㄦ埛鎺ュ彛緇勬垚鐨勪笟鍔″璞★紙Rules Object錛夈傜粍浠剁湅璧鋒潵鍍忓璞°傚畠浠殑涓昏鍖哄埆鏄細(xì)
銆銆1錛夌粍浠跺彲浠ュ湪鍙︿竴涓О涓哄鍣紙鏈夋椂涔熺О涓烘壙杞借呮垨瀹夸富錛夌殑搴旂敤紼嬪簭涓嬌鐢紝涔熷彲浠ヤ綔涓虹嫭绔嬭繃紼嬩嬌鐢紱
銆銆2錛夌粍浠跺彲浠ョ敱涓涓被鏋勬垚錛屼篃鍙互鐢卞涓被緇勬垚錛屾垨鑰呮槸涓涓畬鏁寸殑搴旂敤紼嬪簭錛?br>銆銆3錛夌粍浠朵負(fù)妯″潡閲嶇敤錛岃屽璞′負(fù)浠g爜閲嶇敤銆?br>銆銆緇勪歡妯″瀷鏈塁OM錛圕omponent Object Model錛屽璞$粍浠舵ā鍨嬶級(jí)/DCOM錛圖istributed COM錛屽垎甯冨紡瀵硅薄緇勪歡妯″瀷錛夊拰CORBA錛圕ommon Object Request Broker Architecture錛屽叕鍏卞璞¤姹備唬鐞嗕綋緋葷粨鏋勶級(jí)銆?
銆銆
銆銆
=================
COM
------------------------
COM 綾?br> COM 鎵鍋氱殑鍏ㄩ儴宸ヤ綔灝辨槸鍦ㄤ簩榪涘埗涓綰у叡浜蔣浠躲?br>
C++ 綾?鍜?COM 綾?br> 1銆丆++浣跨敤鎿嶄綔絎ew鏉ュ疄渚嬪寲涓涓璞★紝鑰孋OM瀵硅薄閫氳繃API鐨勫嚱鏁版潵鍒涘緩銆?br> 2銆丆++浣跨敤delete鏉ュ垹闄や竴涓璞★紝COM浣跨敤寮曠敤璁℃暟鏉ユ帶鍒跺璞$殑鐢熷瓨鏈燂紝寮曠敤璁℃暟涓?錛岃嚜鍔ㄥ垹闄ゃ?br> 3銆丆++浣跨敤鐗規(guī)畩鐨勬満鍒舵潵鎺у埗榪愯鏃剁被鍨嬩俊鎭紙run-time type info錛夊拰綾誨瀷杞寲錛坱ypecasting錛夛紝鑰孋OM綾婚氳繃鎴愬憳鍑芥暟鏉ユ敮鎸?br> 4銆丆++綾繪彁渚涙垚鍛樺嚱鏁板拰鏁版嵁浠ヤ緵澶栭儴璁塊棶錛孋OM涓紝綾誨彧鎻愪緵鎴愬憳鍑芥暟銆?br> 5銆丆OM綾繪病鏈夊叿浣撹瀹氱殑甯冨眬銆?br> 6銆丆OM寮曞叆浜?jiǎn)涓濂楁帴鍙g殑瑙勮寖鏉ュ艦寮忓寲瀵硅薄鎸囬拡鐨勬蹇點(diǎn)?br> 浣跨敤COM瀵硅薄錛?br> 鈶犮佺粰鎿嶄綔緋葷粺鍙戦佸疄渚嬪寲涓涓狢OM鐨勮姹傦紱
鈶°佸緱鍒板璞$殑涓涓帴鍙f寚閽?br> 鈶€佷嬌鐢ㄦ帴鍙o紱 鈶c侀噴鏀炬帴鍙?br>
------------------------
COM 鎺ュ彛
涓涓帴鍙e氨鏄竴緇勭瓑寰呰瀹炵幇鐨勭函铏氬嚱鏁?br>
GUID
Globally Unique Identifier 128浣嶆暟瀛?br>
COM 綾葷殑ID鐢?"CLSID"浣滀負(fù)鍓嶇紑錛?br> 鎺ュ彛 ID 鐢紓IID錛備綔涓哄墠緙
=================
IUnknown鎺ュ彛
struct IUnknown{
virtual HRESULT QueryInterface ( IID& iid, void** ppvObj ) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
}
-------
瀵硅薄鐢熷瓨鏈熺鐞?br> COM瀵硅薄鑷繁鎺у埗鐢熷瓨鏈熴?br> COM 瀵硅薄鐨勫紩鐢ㄨ鏁扮敱 IUnknown 鎺ュ彛鐨?AddRef() 鍜孯elease() 榪欎袱涓嚱鏁版潵綆$悊銆?br> --------
鎺ュ彛鍗忓晢錛坣egotiation錛岃繍琛屾椂鍙戠幇鍔熻兘錛?br> 褰撲竴涓鎴鋒嫢鏈変簡(jiǎn)涓涓狢OM瀵硅薄鐨勪竴涓帴鍙f寚閽堬紝灝辮兘澶熼氳繃 QueryInterface() 鍙戠幇榪欎釜瀵硅薄鎵鏀寔鐨勫埆鐨勬帴鍙?br> HRESULT QueryInterface ( REFIID riid, LPVOID far* ppvObj );
riid鐢ㄦ潵鏍囪瘑鎵瑕佸緱鍒扮殑鎺ュ彛鐨?GUID銆?br> ppvObj 鐢ㄦ潵瀛樻斁鎺ュ彛鎸囬拡
瀹炵幇 IUnknown::QueryInterface鐨勪竴涓柟娉曪細(xì)
HRESULT CoSomeObject::QueryInterface ( IID& riid, void FAR** ppvObj ){
HRESULT hr = ResultFromSCode ( E_NOINTERFACE )錛?br> *ppvObj = NULL;
if ( riid == IID_IUnknown ){
*ppvObj = ( IPersist * ) this;
hr = NOERROR;
} else if (riid == IID_IPersist ) {
*ppvObj = ( IPersist * ) this;
hr = NOERROR;
}
return hr;
}
-------------
璋冪敤 銆?浣跨敤 銆侀噴鏀俱?br> 1銆佽皟鐢ㄦ煇涓柟娉曞緱鍒頒竴涓帴鍙o紙閫氳繃鍒濆鍖栦竴涓璞℃垨鑰呴氳繃涓涓瓨鍦ㄧ殑鎺ュ彛璋冪敤 QueryInterface()錛夈?br> 2銆佷嬌鐢ㄦ帴鍙e唴鐨勫嚱鏁般?br> 3銆佽皟鐢≧elease() 瀵瑰璞″紩鐢ㄨ鏁板噺1.
========================
COM 瀵硅薄鏈嶅姟鍣?br>
COM綾誨瓨鍦ㄤ簬鏈嶅姟鍣ㄤ箣涓侰OM鏈嶅姟鍣ㄥ垎涓轟袱縐嶏細(xì) 榪涚▼鍐呮湇鍔″櫒(in-proc)鍜岃繘紼嬪鏈嶅姟鍣紙out-proc錛夈?br> in-proc server 鏄?DLL褰㈠紡鐨勶紝浠栦滑涓庡鎴峰湪鍚屼竴涓繘紼嬬┖闂村唴銆?br> out-proc server 鏄綔涓?EXE鏂囦歡褰㈠紡瀛樺湪錛屽拰瀹㈡埛鍦ㄤ笉鍚岀殑榪涚▼絀洪棿鍐咃紙鐢氳嚦鍦ㄤ笉鍚屾満鍣級(jí).
榪涚▼鍐呮湇鍔″櫒錛圖LL錛?br> 榪涚▼澶栨湇鍔″櫒錛圗XE錛?br> 鏈夋洿寮虹殑椴佹鎬э紝榪涚▼澶栨湇鍔″櫒闇瑕佷粯鍑洪澶栫殑浠d環(huán)錛屽垪闆嗭紙marshaling錛夈?br> 涓涓繘紼嬬┖闂村唴鐨勫湴鍧錛堟暟鎹湴鍧銆佸嚱鏁版寚閽堬級(jí)鍦ㄥ彟涓涓繘紼嬬┖闂村唴涓嶈搗浣滅敤錛岄渶瑕佺敤榪滅▼榪囩▼璋冪敤錛圧PC錛夊拰鍒楅泦錛坢arshaling錛夈?br> marshaling錛?br> 姣忎竴涓帴鍙o紝鍦ㄥ鎴蜂唬鐮佷腑鏈変竴涓唬鐞嗭紙proxy錛夛紝涓涓唬鐞嗘槸涓涓帴鍙g殑榪涚▼鍐呭疄鐜般?br> 鏈嶅姟绔腑錛屾瘡涓涓壒瀹氱殑鎺ュ彛閮藉緩绔嬩簡(jiǎn)涓浠藉瓨鏍癸紙stub錛変唬鐮侊紙鍦ㄦ湇鍔″櫒榪涚▼絀洪棿鍐咃級(jí)銆傚瓨鏍規(guī)槸RPC浼犺緭鐨勬帴鏀剁錛?br> 瀹冩妸浠g悊浼犺繃鏉ョ殑鍑芥暟璋冪敤鍜屽弬鏁頒紶閫掓槧灝勪負(fù)鏄犲皠涓烘湇鍔″櫒榪涚▼鍐呯殑鍑芥暟璋冪敤鍜屽弬鏁頒紶閫掋?br> 瀹㈡埛閫氳繃鎺ュ彛榪涜鍑芥暟璋冪敤鏃訛紝浠g悊灝嗗弬鏁版墦鍖呬負(fù)涓涓?2浣嶅彲縐繪鐨勬暟鎹粨鏋勩傛墦鍖呭畬鍚庯紝瀵規(guī)湇鍔″櫒榪涚▼浜х敓涓涓繙紼嬭繃紼嬭皟鐢ㄣ?br> 鏈嶅姟鍣ㄧ錛屽瓨鏍逛繚瀛樼湡姝g殑鎺ュ彛鎸囬拡銆佸嚱鏁板拰鐩稿叧鐨勬暟鎹粨鏋勩傚瓨鏍瑰皢鍙傛暟浠庡寘涓В寮浠ュ湪鏈繘紼嬬┖闂村唴璋冪敤銆?br> 涓涓嚱鏁拌皟鐢ㄨ繑鍥炴椂錛屽瓨鏍瑰皢榪斿洖鍊煎拰鍏朵粬榪斿洖淇℃伅鎵撳寘錛屽彂閫佸洖浠g悊銆備唬鐞嗚В鍖咃紝鍙栧嚭榪斿洖鍊間緵瀹㈡埛浣跨敤銆?br>
綾誨巶錛坈lass factory錛?br> COM閫氳繃綾誨巶鏉ュ垱寤哄璞★紝榪涚▼絀洪棿鍐呯殑姣忎竴涓狢OM綾婚兘鏈変竴涓被鍘備笌涔嬬浉瀵瑰簲銆傜被鍘備駭鐢熺殑鏄璞★紝涓嶆槸綾匯?br> 綾誨巶鏄竴涓壒孌奀OM綾匯?br> 涓涓噸瑕佺殑鎺ュ彛鏄?IClassFactory銆傚畠鍖呭惈涓や釜鍑芥暟錛欳reateInstance()鍜孡ockServer()銆?br> 瀹㈡埛閫氳繃璋冪敤CreateInstance鏉ュ垱寤篛LE綾葷殑瀹炰緥錛孡ockServer鏉ュ鍔犳暣涓湇鍔″櫒鐨勫紩鐢ㄨ鏁般?br> 姣忎竴涓狢OM綾誨湪婧愪唬鐮佷竴綰ч兘鏈夎嚜宸辯殑綾誨巶銆?br> 榪涚▼鍐呮湇鍔″櫒閫氳繃涓涓鍏堝畾涔夌殑鍑芥暟灝嗙被鍘傛彁渚涚粰瀹㈡埛錛?br> 榪涚▼澶栨湇鍔″櫒灝嗙被鍘傛敞鍐屽埌 Windows鐨勬敞鍐岃〃涓?br>
鍦ㄨ繘紼嬪唴鏈嶅姟鍣ㄦ彁渚涚被鍘?br> 閫氳繃瀵煎嚭鍑芥暟錛坋xported function錛夋潵鎻愪緵綾誨巶錛屽嚱鏁板悕涓猴細(xì)DLLGetClassObject()銆?br> 瀹㈡埛鍙互閫氳繃 CoGetClassObject() 鎴?CoCreateInstance() 鏉ュ垱寤轟竴涓?COM 瀵硅薄銆傚畠浠兘璋冪敤浜?jiǎn)DLLGetClassObject鏉ュ緱鍒扮浉搴擟OM綾葷殑綾誨巶鎺ュ彛鎸囬拡銆?br> 鐒跺悗鍙互璋冪敤綾誨巶鐨凜reateInstance() 鏉ュ垱寤轟竴涓被鐨勫疄渚嬪茍涓斿緱鍒頒竴涓帴鍙f寚閽堛?br> STDAPI DllGetClassObject ( REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv)
瑕佸緱鍒扮殑綾誨巶鐨凜OM綾葷殑GUID鍊鹼紝絎笁涓弬鏁?鏄竴涓寚鍚戞帴鍙f寚閽堢殑鎸囬拡錛岀敤鏉ュ瓨鏀捐姹傜殑鎺ュ彛鎸囬拡鐨勫湴鏂廣?br>
鍦ㄨ繘紼嬪鏈嶅姟鍣ㄤ腑鎻愪緵綾誨巶錛?br> 鍦ㄨ繍琛屾椂鍦ㄦ敞鍐岃〃閲屾敞鍐岀被鍘傦紝CoRegisterClassObject()錛?br> HRESULT CoRegisterClassObject ( REFCLSID clsid, // 瑕佹敞鍐岀殑綾葷殑GUID
IUnknown *pUnk, //瀵硅薄鐨?IUnknown 鎸囬拡
DWORD grfContext, //鍙傛暟鐢ㄦ潵鏍囪瘑鏈嶅姟鍣ㄧ殑鐜鈥斺斿彲鎵ц鐨勬湇鍔″櫒浠g爜鏄竴涓狣LL銆佷竴涓湰鍦版湇鍔″櫒榪樻槸涓涓繙紼嬫湇鍔″櫒
DWORD grfFlags, //鐢ㄦ潵琛ㄧず瀹㈡埛浣跨敤浣曠鏂瑰紡璺熸湇鍔″櫒寤虹珛榪炴帴
LPDWORD pdwRegister ); //鎸囧悜DWORD鐨勬寚閽堬紝鎵鎸囧悜鐨勫煎湪綾誨巶娉ㄥ唽鐨勬椂鍊欑敱COM鏉ュ~鍐欍傝鍊兼爣璇嗕簡(jiǎn)綾誨巶鐨勬敞鍐屼俊鎭紝鍙互閫氳繃
瀹冪劧鍚庤皟鐢?CoRevokeClassObject() 鏉ュ彇娑堢被鍘傜殑娉ㄥ唽銆?br>
鍗歌澆榪涚▼鍐呮湇鍔″櫒
璋冪敤COM涓殑 CoFreeUnusedLibraries() 鏉ュ疄鐜拌繖涓姛鑳斤紝璇ュ嚱鏁伴氳繃璋冪敤DLL鐨凞LLCanUnloadNow()鏉ヨ闂槸鍚﹁兘琚嵏杞姐?br> 鍗歌澆榪涚▼澶栨湇鍔″櫒
榪涚▼澶栨湇鍔″櫒鏄嚜宸卞嵏杞借嚜宸憋紝
· 褰撳鎴峰噺灝戞湇鍔″櫒鐨勫紩鐢ㄨ鏁幫紙閫氳繃璋冪敤IClassFactory::LockServer ( FALSE )錛岃屼笖澶栭儴娌℃湁瀵硅薄浜?jiǎn)銆?br> · 褰撳鎴烽噴鏀炬渶鍚庝竴涓璞$殑鏈鍚庝竴涓帴鍙f寚閽堬紝騫朵笖鏈嶅姟鍣ㄧ殑閿佽鏁版槸0.
========================================================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?10. MFC鐨凞LL涓庣嚎紼?br>========================================================
---------------------
姒傚康錛?br> 妯″潡錛?nbsp;
涓孌靛彲鎵ц鐨勭▼搴忥紙鍖呮嫭EXE鍜孌LL錛夛紝鍏剁▼搴忎唬鐮併佹暟鎹佽祫婧愯鍔犺澆鍒板唴瀛樹腑錛岀敱緋葷粺寤虹疆涓涓暟鎹粨鏋勬潵綆$悊瀹冿紝榪欏氨鏄竴涓ā鍧椼?br> 榪涚▼錛?br> 榪涚▼鏄竴鍫嗘嫢鏈夋潈錛坥wnership錛夌殑闆嗗悎錛岃繘鍦洪偅涓嫢鏈夊湴鍧絀洪棿錛屽姩鎬侀厤緗屾潵鐨勫唴瀛樸佹枃浠躲佺嚎紼嬪拰涓搴忓垪鐨勬ā鍧椼?br> 姒傝錛?br> · DLL涓庣嚎紼嬬殑瀹炵幇渚濊禆浜庡唴閮?MFC 鐘舵佺被錛孧FC鐨勭姸鎬佸皢鏁版嵁鍒嗗埌涓嶅悓鐨勯昏緫鑼冨洿涓紝浠庤屼嬌寰楃嚎紼嬪拰 DLL 涓嶄細(xì)鐮翠細(xì)瀵規(guī)柟鐨勬暟鎹?
· 鎵╁睍 DLL 浠呬粎鐢ㄦ潵鎵╁睍宸插瓨鍦ㄧ殑 MFC 搴旂敤紼嬪簭銆?br> · MFC涓紝鎵╁睍 DLL 琚垱寤烘椂瑕佷嬌鐢?_AFXDLL鏍囧織銆?br> · 鎵╁睍 DLL 鏈変竴浜涜祫婧愬拰鍏朵粬淇℃伅闇瑕佸湪榪愯鏃惰媯(gè)绱€侰DynLinkLibrary鏄畠鐨勮緟鍔╃被銆?br>
· 杈呭姪綰跨▼錛孶I綰跨▼ 閮芥槸鐢?_beginthreadex()鍒涘緩銆佷互_endthread()鏉ョ粨鏉熴?br> · CWinThread::CreateThread鍒涘緩綰跨▼錛屽茍涓斾嬌鐢╛AfxThreadEntry()鏉ヤ負(fù)綰跨▼鎻愪緵鎵ц璺緞銆?br> · 鏍稿績(jī)錛欳WinThread::Run()
--------------------
MFC鐘舵?/p>
3涓璏FC鐘舵佷俊鎭被鍨嬶細(xì)
妯″潡鐘舵併佽繘紼嬬姸鎬併佺嚎紼嬬姸鎬?br> win32涓紝涓涓ā鍧楀氨鏄嫭绔嬩簬搴旂敤紼嬪簭鍏朵粬閮ㄥ垎鑰屾搷浣滅殑鍙墽琛屼唬鐮併?br>
妯″潡鐘舵侊紝 鏃㈠彲浠ュ寘鍚湡姝g殑鍏ㄥ眬鐘舵侊紝涔熷彲浠ュ寘鍚繘紼嬪眬閮ㄦ垨鑰呯嚎紼嬪眬閮ㄧ殑鐘舵侊紝涓斿畠鍙互琚揩閫熷湴鍒囨崲銆?br> 鍙妸MFC鐘舵佺悊瑙f垚搴旂敤紼嬪簭涓嶅悓閮ㄥ垎鐨勫眬閮ㄦ暟鎹?br> 榪涚▼鐘舵佸寘鍚眬閮ㄤ簬榪涚▼鍜屾煇涓ā鍧楃殑鏁版嵁銆傛ā鍧楃殑鐘舵佷俊鎭寘鍚眬閮ㄤ簬璇ユā鍧楃殑鏁版嵁錛岀嚎紼嬬殑鐘舵佷俊鎭寘鍚眬閮ㄤ簬璇ョ嚎紼嬬殑鏁版嵁銆?br>
------------------------------
MFC榪涚▼鐘舵?nbsp;
AFX_MODULE_PROCESS_STATE鐨勫畾涔夛紝 AFXSTAT_.H 銆婃繁鍏ヨВ鏋怣FC銆婸301
· m_pfnFilterToolTipMessage 鈥斺?涓涓嚱鏁版寚閽堬紝鎸囧悜鐢ㄤ簬榪囨護(hù)宸ュ叿鎻愮ず娑堟伅鐨勫嚱鏁般?br> · CTypedSimpleList<CDynLinkLibrary*> m_libraryList 鈥斺?闄勫姞鐨凪FC鎵╁睍DLL閾捐〃
· HINSTANCE m_appLangDLL 鈥斺?褰撳墠琚眬閮ㄥ寲鐨勮祫婧愮殑瀹炰緥鍙ユ焺銆?br> · COccManager* m_pOccManager 鈥斺?鎸囧悜OLE鎺т歡綆$悊瀵硅薄鐨勬寚閽?br> · CTypedSimpleList<COleControlLock*> m_lockList 鈥斺?琚攣瀹氱殑 OLE 鎺т歡閾捐〃
------------------------------
MFC妯″潡鐘舵?/p>
AFX_MODULE_STATE 瀹氫箟錛?nbsp; AFXSTAT_.H 銆婃繁鍏ヨВ鏋怣FC銆?nbsp; P302
· CWinApp* m_pCurrentWinApp 鈥斺?鎸囧悜璇ユā鍧楃殑CWinApp瀵硅薄鐨勬寚閽?br> · HINSTANCE m_hCurrentInstanceHandle 鈥斺?妯″潡鐨勫疄渚嬪彞鏌?br> · HINSTANCE m_hCurrentResourceHandle 鈥斺?璧勬簮鐨勫疄渚嬪彞鏌?br> · LPCTSTR m_lpszCurrentAppName 鈥斺?褰撳墠搴旂敤紼嬪簭鐨勫悕縐?br> · BYTE m_bDLL 鈥斺?鎸囨槑璇ユā鍧楁槸鍚︽槸 DLL 鐨勪竴涓爣蹇椼?br> · BYTE m_bSystem 鈥斺?鎸囨槑璇ユā鍧楁槸鍚︽槸緋葷粺妯″潡鐨勪竴涓爣蹇?br> · short m_fRegisteredClasses 鈥斺?鐢ㄤ簬妯″潡鐨勫歡榪熸敞鍐岀被鐨勪綅鏍囪瘑銆?br> · CRuntimeClass* m_pClassInit 鈥斺?鎸囧悜絎竴涓被鐨?CRuntimeClass 淇℃伅鐨勬寚閽堬紙閫氬父鏄?m_classList鐨勫ご錛?br> · CTypedSimpleList<CRuntimeClass*> m_classList 鈥斺?妯″潡閲屽悇涓璞$殑 CRuntimeClass 淇℃伅閾捐〃
· COleObjectFactory* m_pFactoryInit 鈥斺?鎸囧悜絎竴涓?COleObjectFactory瀵硅薄鐨勬寚閽堬紙閫氬父鏄?m_factoryList 鐨勫ご錛?nbsp;
· CTypedSimpleList<COleObjectFactory*> m_factoryList 鈥斺?妯″潡閲屽悇涓璞$殑 COleObjectFactory 瀵硅薄鐨勯摼琛?br> · long m_nObjectCount 鈥斺?琚攣浣忕殑OLE瀵硅薄鐨勬暟鐩?br> · BOOl m_bUserCtrl 鈥斺?濡傛灉鐢ㄦ埛鏈夋帶鍒舵潈錛屽垯璁劇疆涓?TRUE錛屽惁鍒欎負(fù)FALSE
· TCHAR m_szUnregisterList 鈥斺?鏈娉ㄥ唽鐨勭被閾捐〃
· WNDPROC m_pfnAfxWndProc 鈥斺?鎸囧悜妯″潡鎵鏈夌殑 AfxWndProc 鐨勬寚閽?br> · DWORD m_dwVesion 鈥斺?妯″潡榪炴帴鎵浣跨敤鐨?MFC 鐗堟湰鍙?br> · m_process 鈥斺?榪涚▼鐘舵佷俊鎭?nbsp; PROCESS_LOCAL( AFX_MODULE_PROCESS_STATE, m_process )
· m_thread 鈥斺?綰跨▼鐘舵佷俊鎭?nbsp; THTEAD_LOCAL( AFX_MODULE_THREAD_STATE, m_thread )
-------------------------------
MFC 綰跨▼鐘舵佷俊鎭?nbsp; 銆婃繁鍏ヨВ鏋怣FC銆婸305
_AFX_THREAD_STATE
· AFX_MODULE_STATE* m_pModuleState 鈥斺?鎸囧悜褰撳墠妯″潡鐘舵佺殑鎸囬拡
· AFX_MODULE_STATE* m_pPrevModuleState 鈥斺?鎸囧悜涓嬩竴涓ā鍧楃姸鎬佺殑鎸囬拡
· void* m_pSafetyPoolBuffer 鈥斺?鎸囧悜瀹夊叏緙撳啿鍖虹殑鎸囬拡錛屽畠鏀寔寮哄.鐨勪復(fù)鏃跺璞″唴瀛樺垎閰?br> · AFX_EXCEPTION_CONTEXT m_exceptionContext 鈥斺?褰撳墠鐨勫紓甯哥幆澧冦?br> · CWnd* m_pWndInit 鈥斺?涓涓獥鍙f寚閽堬紝鎸囧悜鏈榪慼ook鐨勭獥鍙?br> · CWnd* m_pAlternateWndInit 鈥斺?鎸囧悜鏈榪戣hook鐨勫叕鐢ㄥ璇濇紿楀彛鐨勬寚閽?br> · DWORD m_dwPropStyle 鈥斺斿睘鎬ч〉鐨勯鏍?br> · DWORD m_dwPropExStyle 鈥斺?灞炴ч〉鐨勬墿灞曢鏍?br> · HWND m_hWndInit 鈥斺?m_pWndInit 鐨勫尮閰嶅彞鏌?br> · BOOL m_bDlgCreate 鈥斺?琛ㄦ槑鏌愪釜瀵硅瘽妗嗚鍒涘緩浜?jiǎn)锛孧FC涓哄璇濇緇樺埗涓庢櫘閫氱獥鍙d笉鍚岀殑鑳屾櫙棰滆壊
· HHOOK m_hHookOldSendMsg 鈥斺?鐢?:SetWindowsHookEx ( WH_CALLWNDPROC ) 榪斿洖鐨勫墠涓涓彞鏌勭殑鍙ユ焺
· HHOOK m_hHookOldCbtFilter 鈥斺?鐢?:SetWindowsHookEx ( WH_CBT )榪斿洖鐨勫墠涓鍙ュ茍鐨勫彞鏌勩?br> · HHOOK m_hHookOldMsgFilter 鈥斺?鐢?:SetWindowsHookEx ( WH_MSGFILTER 錛夎繑鍥炵殑鍓嶄竴涓彞鏌勭殑鍙ユ焺
· MSG m_lastSentMsg 鈥斺?鍙戦佺殑鏈鍚庝竴涓秷鎭?br> · HWND m_hTrackingWindow 鈥斺?褰撳墠璺熻釜紿楀彛鐨勫彞鏌?br> · HMENU m_hTrackingMenu 鈥斺?褰撳墠璺熻釜鑿滃崟鐨勫彞鏌?br> · TCHAR m_szTempClassName 鈥斺?鍦?AfxRegisterWndClass() 涓嬌鐢ㄧ殑緙撳啿鍖?br> · HWND m_hLockoutNotifyWindow 鈥斺?鍦ㄩ攣瀹氾紙娌℃湁OLE鎺т歡錛夌殑紿楀彛鍙ユ焺錛屽鏋滃瓨鍦ㄤ竴涓殑璇濄?br> · BOOL m_bInMsgFilter 鈥斺?琛ㄦ槑璇ョ嚎紼嬪湪涓涓秷鎭繃婊ゅ櫒涓殑鏍囧織銆?br> · CView* m_pRoutingView 鈥斺?鍦ㄥ皢娑堟伅鍙戦佺粰鏂囨。涔嬪墠錛岃鍥炬墍鍏堝皢鑷繁淇濆瓨鍒拌鍙橀噺涓?br> · CFrameWnd* m_bWaitForDataSource 鈥斺?涔嬪悕 ODBC 姝e湪絳夊緟鐨勬暟鎹?br> · CToolTipCtrl* m_pToolTip 鈥斺?鎸囧悜褰撳墠CToolTipCtrl鐨勬寚閽?br> · CWnd* m_pLastHit 鈥斺?鎸囧悜鎷ユ湁宸ュ叿鎻愮ず鎺т歡鐨勬渶鍚庝竴涓獥鍙g殑鎸囬拡
· int m_nLastHit 鈥斺?鏈鍚庣殑鐐瑰嚮嫻嬭瘯浠g爜錛堢敤浜庡伐鍏鋒彁紺虹偣鍑?yán)L祴璇曪級(jí)
· TOOLINFO m_lastInfo 鈥斺?鏈鍚庣殑宸ュ叿鎻愮ず TOOLINFO緇撴瀯
· int m_nLastStatus 鈥斺?鏈鍚庣殑嫻姩鐘舵佷唬鐮?br> · CControlBar* m_pLastStatus 鈥斺?鎸囧悜鏈鍚庣殑嫻姩鐘舵佹帶鍒舵潯鐨勬寚閽?br>
----------------------------------------------
MFC鐘舵佷箣闂寸殑鑱旂郴 銆婃繁鍏ヨВ鏋怣FC銆婸305
褰揗FC闇瑕佸埌杈懼綋鍓嶇殑 _AFX_THREAD_STATE鏃訛紝璋冪敤 AfxGetThreadState()
THREAD_LOCAL( _AFX_THREAD_STATE, _afxThreadState )
榪欒浠g爜涓烘瘡涓嚎紼嬬殑 TLS 鍒涘緩涓涓悕涓?_afxThreadState 鐨?_AFX_THREAD_STATE 綾伙紝鍙氳繃璋冪敤 AfxGetThreadState錛堬級(jí)鏉ヨ闂?br> _AFX_THREAD_STATE 璁板綍浜?jiǎn)鎸囧悜褰撳墠妯″潡鐘舵佺殑鎸囬拡錛屽悕涓?m_pModuleState銆傚彲閫氳繃璋冪敤 AfxGetModuleState()寰楀埌銆?br> · 澶氭暟鎯呭喌浼?xì)寰楀?_afxThreadState.m_pModuleState 鐨?AFX_MODULE_STATE
· 濡傛灉涓篘ULL錛屽皢鏈変竴涓叏灞鐨勮繘紼嬪眬閮ㄦā鍧楃姸鎬侊紝PROCESS_LOCAL( _AFX_BASE_MODULE_STATE, _afxBaseModuleState )
褰揗FC鏄竴涓狣LL鏃訛紝浼?xì)閫氳繃璋冪敤 AfxSetModuleState() 鏉ユ敼鍙樻ā鍧楃殑鐘舵併?/p>
=================
MFC鐨凞LL
---------------------------銆婃繁鍏ヨВ鏋怣FC銆婸307
USRDLL 涓?nbsp; AFXDLL
USRDLL錛?br> 鍙闈?rùn)鎬?#8220;綺樿創(chuàng)”鍒癉LL涓婏紝鍙互鍐岲LL浣跨敤MFC錛岃屼笉蹇呰姹備嬌鐢ㄨDLL鐨勫簲鐢ㄧ▼搴忎篃鏄敤MFC鍐欑殑銆?nbsp;
AFXDLL :
鏄嬌鐢ㄤ簡(jiǎn)MFC鐨凞LL錛屽彧鑳界敤浜嶮FC紼嬪簭銆?/p>
---------------------------
DLL 鐨勮祫婧愰棶棰?br>
DLL 閲屾湁 3 縐嶇被鍨嬬殑淇℃伅錛?nbsp;
璧勬簮銆?nbsp; 闈?rùn)鎬佺殑CRuntimeClass鎸囬拡銆?nbsp; OLE瀵硅薄鍘傦紙object factory錛?br> MFC 鐨?DLL 鐗堟湰紼嬪簭璧風(fēng)偣鍦?DllMain()錛堝綋DLL琚杞芥椂璇ュ嚱鏁拌璋冪敤錛?br>
AfxInitExtensionModule( coreDLL, hInstance );
CDynLinkLibrary* pDLL = new CDynLinkLibrary ( coreDLL, TRUE );
瑁呰澆璧勬簮鏃訛紝閫氳繃璋冪敤 AfxFindResourceHandle() 鏉ュ疄鐜?br> AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule )
{
//only initialize once
if ( state.bInitialized ){ //鑻ヨ妯″潡宸茬粡鍒濆鍖栵紝AfxInitLocalData()琚皟鐢ㄦ潵鏇存柊 TLS 浣跨敤鐨勬ā鍧楀彞鏌勩?br> AfxInitLocalData( hModule 錛夛紱
return TRUE;
}
state.bInitialized = TRUE;
// save the current HMODULE info for resource loading
state.hModule = hModule;
state.hResource = hModule;
// save the start of the runtime class list
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
state.pFirstSharedClass = pModuleState->m_classList.GetHead();
pModuleState->m_classList.m_pHead = pModuleState->m_pClassInit;
//save the start of the class factory list
state.pFirstSharedFactory = pModuleState->m_factoryList.GetHead();
pModuleState->m_factoryList.m_pHead = pModuleState->m_pFactoryInit;
return TRUE;
}
--------------------------------
鍓栨瀽 CDynLinkLibrary 銆婃繁鍏ヨВ鏋怣FC銆婸310
class CDynLinkLibrary : public CCmdTarget
{
HMODULE m_hModule; //
HMODULE m_hResource; //for shared resources
CTypedSimpleList<CRuntimeClass* > m_classList;
CTypedSimpleList<COleObjectFactory*> m_factoryList;
BOOL m_bSystem; // TRUE only for MFC DLLs
CDynLinkLibrary* m_pNextDLL; //simple singly linked list
//implementation
CDynLinkLibrary::CDynLinkLibrary ( AFX_EXTENSION_MODULE& state, BOOL bSystem ){
m_factoryList.Construct( offsetof ( COleObjectFactory, m_pNextFactory ) );
m_classList.Construct( offsetof ( CRuntimeClass, m_pNextClass ) );
//copy info from AFX_EXTENSION_MODULE
m_hResource = state.hResource;
m_classList.m_pHead = state.pFirstSharedClass;
m_factoryList.m_pHead = state.pFirstSharedFactory;
m_bSystem = bSystem;
//insert at the end of the list ( extensions will go in front of core DLL )
AFX_MODULE_PROCESS_STATE* pState = AfxGetModuleProcessState();
AfxLockGlobals ( CRIT_DYNLINKLIST );
pState->m_libraryList.AddHead ( this );
AfxUnlockGlobals ( CRIT_DYNLINKLIST );
}
}
--------------------------------
鍓栨瀽 AfxFindResourceHandle() 銆婃繁鍏ヨВ鏋怣FC銆婸311
AfxFindResourceHandle() "DLLINIT.CPP"
棣栧厛錛屽鏋滃綋鍓嶆ā鍧椾笉鏄郴緇熸ā鍧楋紝鍦ㄥ綋鍓嶆ā鍧楃殑璧勬簮鍙ユ焺錛堢敱AfxGetResourceHandle() 鍑芥暟榪斿洖錛夐噷鏌ユ壘璧勬簮銆?br> 鎺ョ潃錛屽湪榪涚▼鐘舵?m_libraryList 閲岄亶鍘?CDynLinkLibrary 閾捐〃銆傝嫢鎵╁睍DLL涓嶆槸緋葷粺 DLL錛孎indResource() 琚皟鐢ㄣ?br> 鐒跺悗鍦ㄨ榪涚▼鐘舵佹寚鍚戠殑涓庣壒瀹氳璦鐩稿叧鐨凞LL閲屽鎵捐淇℃伅銆?br> 鎺ョ潃錛屾鏌ュ綋鍓嶇殑妯″潡鏄惁鏄郴緇熸ā鍧楋紝璋冪敤FindResource() 鎼滅儲(chǔ)璧勬簮錛屾渶鍚庡啀嬈¢亶鍘?CDynLinkLibrary閾捐〃錛屽湪緋葷粺鎵╁睍DLL閲屾煡鎵捐璧勬簮
鑻ユ病鏈夊彂鐜頒換浣曚笢瑗匡紝榪斿洖 AfxGetResourceHandle()錛屽嵆榪斿洖浜?jiǎn)杩浗E嬬殑褰撳墠璧勬簮鍙ユ焺銆?br>
--------------------------------
鎵╁睍 DLL 鍒濆鍖栦笌娓呴櫎
AFXDLL 涓?瀹?br> DECLARE_DYNAMIC錛?DLL鐗?鍜?闈濪LL鐗堟湰錛?nbsp; 錛圓FX.H錛?nbsp; 銆婃繁鍏ヨВ鏋怣FC銆婸312
IMPLEMENT_DYNAMIC 錛圓FX.H錛?br>
DLL 鍜?闈濪LL涔嬮棿鐨勫樊鍒細(xì)
MFC蹇呴』璋冪敤鑳借繑鍥為潤(rùn)鎬?CRuntimeClass鎴愬憳鍦板潃鐨勫嚱鏁幫紝鑰屼笉鏄洿鎺ュ瓨鍌ㄣ佽闂潤(rùn)鎬丆RuntimeClass鏁版嵁鎴愬憳鐨勫湴鍧銆?br>
=========================
MFC 綰跨▼
杈呭姪綰跨▼ UI 綰跨▼
AfxBeginThread()
杈呭姪綰跨▼錛氬皢涓涓?CWinThread瀵硅薄鍜屼竴涓寚閽堜紶閫掔粰鎺у埗鍑芥暟錛堟帶鍒跺嚱鏁拌礋璐e伐浣滅殑瀹屾垚錛?br> UI 綰跨▼錛?nbsp; 鍒涘緩涓涓?CWinThread錛屽皢浠栫殑 CRuntimeClass 淇℃伅浼犻掔粰 AfxBeginThread()銆?br>
--------------------------
MFC 鐨勮緟鍔╃嚎紼?nbsp;
AfxBeginThread(){
CWinThread* pThread = new CWinThread ( pfnThreadProc, pParam );
if ( !pThread->CreateThread ( dwCreateFlags | CREATE_SUSPENDED, nStackSize, lpSecurityAttrs ) ){
pThread->Delete(); return NULL;
}
VERIFY ( pThread->SetThreadPriority ( nPriority ) );
if( !(dwCreateFlags & CREATE_SUSPENDED )
VERIFY ( pThread->ResumeThread() != (DWORD) - 1);
return pThread;
}
=========================
CWinThread 銆婃繁鍏ヨВ鏋怣FC銆婸316
鏁版嵁鎴愬憳錛?br> · CWnd* m_pMainWnd 鈥斺?鎸囧悜搴旂敤紼嬪簭涓葷獥鍙g殑鎸囬拡錛?CWinThread闇瑕佺敤璇ユ寚閽堟潵姝g‘鍦扮敤紼嬪簭鐨勪富紿楀彛銆?br> · CWnd* m_bActiveWnd 鈥斺?褰揙LE 鏈嶅姟鍣ㄥ湪鏌愪釜鍦版柟澶勪簬媧誨姩鐘舵佹椂錛岃鎸囬拡鎸囧悜鍖呭惈搴旂敤紼嬪簭鐨勪富紿楀彛銆?br> · BOOL m_bAutoDelete 鈥斺?褰撹鍙橀噺涓?TRUE鏃訛紝 CWinThread浼?xì)鍦ňU跨▼緇撴潫鏃跺垹闄よ嚜宸便?br> · HANDLE m_hThread 鈥斺?琚?CWinThread灝佽鐨刉in32綰跨▼鐨勫彞鏌?br> · DWORD m_hThreadID 鈥斺?琚獵WinThread 灝佽鐨勭嚎紼嬬殑 Win32 綰跨▼ ID銆?br> · MSG m_msgCur 鈥斺?緙撳啿褰撳墠姝h CWinThread 娑堟伅鍙戦佸叾鎵澶勭悊鐨勬秷鎭?br> · LPVOID m_pThreadParams 鈥斺?淇濆瓨pParam鍙傛暟錛屼粬浼?xì)鐟艟l紶閫掔粰杈呭姪鍑芥暟錛坵orker function錛夈?br> · AFX_THREADPROC m_pfnThreadProc 鈥斺?鎸囧悜杈呭姪鍑芥暟鐨勬寚閽?br> · CPoint m_ptCursorLast 鈥斺?鏈鍚庨紶鏍囩Щ鍔ㄦ秷鎭腑鐨?CPoint銆傝鐢ㄦ潵鍦?CWinThread 鐨勭┖闂叉椂鍒昏繃婊ゆ帀澶氫笌鐨勯紶鏍囩Щ鍔ㄤ俊鎭?br> · UINT m_nMsgLast 鈥斺?鐢ㄦ潵鎺㈡祴涓や釜榪炵畫鐨勬秷鎭?br>
· CommonConstruct() 鈥斺?渚涙瀯閫犲嚱鏁拌皟鐢紝浠呬粎灝嗘暟鎹垚鍛樿緗垚姝g‘鐨勯粯璁ゅ?br> · Delete() 鈥斺?濡傛灉 m_bAutoDelete涓篢RUE錛屽垯璋冪敤鍒犻櫎鑷韓銆?br>
----------------------. 銆婃繁鍏ヨВ鏋怣FC銆婸317
綰跨▼鐨勫垱寤衡斺?nbsp; “THRDCORE.CPP”
CWinThread::CreateThread() 絎竴閮ㄥ垎錛?nbsp;
BOOL CWinThread::CreateThread ( DWORD dwCreateFlags, UINT nStackSize, LPSECURITY_ATTRIBUTES lpSecurityAttrs ){
//setup startup structure for thread initialization
_AFX_THREAD_STARTUP startup;
memset ( &startup, 0, sizeof( startup) );
startup.pThreadState = AfxGetThreadState(); //_AFX_THREAD_STATE
startup.pThread = this; //鎸囧悜 CWinThread 鐨勫悗鍚戞寚閽?錛坆ack pointer錛?br> startup.hEvent = ::CreateEvent ( NULL, TRUE, FALSE, NULL); //綰跨▼琚垚鍔熷垱寤哄悗錛宧Event琚Е鍙?br> startup.hEvent2 = ::CreateEvent ( NULL, TRUE, FALSE, NULL); //綰跨▼琚噸鏂板惎鍔紝hEvent2 琚Е鍙?br> startup.dwCreateFlags = dwCreateFlags; //鎸囧畾綰跨▼鏄惁搴旇琚寕璧蜂互鍙?qiáng)鍏朵粬淇℃伅鐨勫垱寰忔爣蹇椼?br> //**some event checking and cleanup omitted for brevity
//create the thread (it may or may not start to run)
m_hThread = (HANDLE) _beginthreadex ( lpSecurityAttrs, nStackSize, &_AfxThreadEntry, &startup,
dwCreateFlags | CREATE_SUSPENDED, (UINT* ) &m_nThreadID );
if( m_hThread ==NULL)
return FALSE;
}
綰跨▼鍒涘緩涔嬪悗錛?br> //CWinThread::CreateThread() continued...
鈶?ResumeThread();
::WaitForSingleObject ( startup.hEvent, INFINITE );
鈶?::CloseHandle ( startup.hEvent );
//if created suspended , suspend it until resum thread wakes it up
if( dwCreateFlags & CREATE_SUSPENDED )
::SuspendThread ( m_hThread );
if( startup.bError )
//**Error cleanup omitted - lots of frees and closes <g>
// allow thread to continue, once resumed (it may already be resumed)
::SetEvent ( startup.hEvent2 );
return TRUE;
涓涓渶鍒濊皟鐢–reateThread() 寰楀埌鐨勭嚎紼嬶紙鐖剁嚎紼嬶級(jí)錛屽彟涓涓鍦ㄥ辜紼氭湡鐨勭嚎紼嬨?br> 鍒扳憼鏃惰皟鐢?:ResumeThread( m_hThread ),榪欐槸鐖惰繘紼嬫殏鍋滐紝瀹冪瓑寰卂AFX_THREAD_START::hEvent銆?br> 騫肩鏈熺嚎紼嬪紑濮嬭繍琛岋紝寮濮嬬殑浣嶇疆鍦?_beginthreadex()璋冪敤鍛婅瘔鐨勪綅緗細(xì)_AfxThreadEntry()
鈯欙箯鈯檅 _AfxThreadEntry 綆縐頒負(fù) “_ATE” 銆婃繁鍏ヨВ鏋怣FC銆婸319
1銆乢ATE灝嗗畠鐨?_AFX_THREAD_STARTUP 鍙傛暟鐨?pThread 鍩熶繚瀛樺埌鐪熸鐨?CWinThread 鎸囬拡閲屻?br> 2銆佺劧鍚庤皟鐢?AfxGetThreadState()錛屽畠浼?xì)杩斿洖鐖毒U跨▼鐨勭姸鎬侊紝澶嶅埗澶ч儴鍒嗙埗綰跨▼鐨勭姸鎬佷俊鎭紝鐢╛AFX_THREAD_STARTUP鐨勫弬鏁版潵淇敼妯″潡鐘舵併?br> 鏂扮殑瀛愮嚎紼嬩粠鐖剁嚎紼嬮偅閲?#8221;緇ф壙“鍒頒簡(jiǎn)妯″潡鐘舵佷俊鎭?br> 3銆佸啀璋冪敤 AfxInitThread()錛岃鍑芥暟涓鴻綰跨▼鍒涘緩浜?jiǎn)涓涓秷鎭槦鍒椾互鍙?qiáng)涓浜涙秷鎭繃婊ゅ櫒銆?br> 4銆佸湪AfxInitThread()鎵ц瀹屾垚鍚庯紝_ATE鍒涘緩涓涓眬閮ㄧ殑 CWnd瀵硅薄錛屽茍灝嗗畠璐撮檮鍒板綋鍓嶇殑涓葷獥鍙i噷銆?br> 鍗沖皢瀹冭創(chuàng)闄勫埌 CWinApp::m_pMainWnd::m_hWnd錛岀劧鍚庝嬌寰?CWinThread::m_pMainWnd鎸囬拡鎸囧悜瀹冪殑鍦板潃銆?br> 5銆乭Event2鍙ユ焺琚粠 _AFX_STARTUP_THREAD鎸囬拡閲屾嫹璐濆嚭鏉ャ?br> 6銆佸噯澶囬氱煡鐖剁嚎紼嬪瓙綰跨▼宸插噯澶囧ソ錛屼俊鍙瘋杞崲鎴愭椂闂達(dá)紝浣垮緱鐖剁嚎紼嬮噷鐨?::WaitForSingleObject() 琚惎鍔ㄣ傜湡姝g殑鍑芥暟璋冪敤鏄?::SetEvent(startup->hEvent)
7銆乢ATE璋冪敤 ::WaitForSingleObject( hEvent2, INFINITE ) 灝嗘柊鐨?鎴愪漢綰跨▼浼戠湢錛岀洿鍒扮埗綰跨▼鍙戝嚭鏈鍚庣殑淇″彿
榪欐椂錛屽湪璋冪敤瀹?:WaitForSingleObject()鍚庯紝鍥炲埌鐖剁嚎紼嬶紝鍗沖洖鍒扳憽銆?br> 鐖剁嚎紼嬭皟鐢?:CloseHandle() 涓哄畠鐨勫瓙濂蟲竻闄?hEventHandle錛岃嫢瀛愮嚎紼嬩互鏆傚仠鏂瑰紡琚皟鐢紝鍒欏湪瀛愮嚎紼嬭皟鐢?:SuspendThread()銆?br> 8銆乄aitForSingleObject()璋冪敤瀹屾垚鍚庯紝瀛愮嚎紼嬪悜瀹冪殑鐖剁嚎紼嬭鍐嶈錛屽茍鍏抽棴浜?hEvent2 璁板綍鐨勫彞鏌?br> 9銆佸鏋淐WinThread::m_pfnThreadProc闈炵┖錛屽瓙綰跨▼浼?xì)鎰忚瘑鍒拌嚜宸辨?杈呭姪綰跨▼錛屽茍涓旈氳繃鎺у埗浼犻掔粰 m_pfnThreadProc鏉ュ紑濮嬪伐浣?br> 10銆佽嫢m_pfnthreadproc涓虹┖錛屽垯涓轟竴涓猆I 綰跨▼銆?br>
_AfxThreadEntry() 涓笌 UI 鏈夊叧鐨勯儴鍒?nbsp; "THRDCORE.CPP"
//Initialization and synchronization with mom before here.
if ( pThread->m_pfnThreadProc != NULL )
nResult = pThread->ExitInstance();
else if ( ! pThread->InitInstance() ) // InitInstance() 琚獵WinThread鐨勬淳鐢熺被閲嶈澆
nResult = pThread->ExitInsance();
else
nResult = pThread->Run(); // 閫氬父鎯呭喌璋冪敤 CWinThread::Run()
//cleanup and shutdown the thread
threadWnd.Detach(); //灝嗗眬閮ㄧ殑 CWnd 涓葷獥鍙e璞″垎紱誨嚭鏉?br> AfxEndThread( nResult ); //鏈緇堣皟鐢?_endthreadex().
return 0; //not reached
----------------
MFC UI 綰跨▼ 銆婃繁鍏ヨВ鏋怣FC銆婸320
杈呭姪綰跨▼浠呴渶鍚?CWinThread 鎻愪緵涓涓寚鍚戞煇涓嚱鏁扮殑鎸囬拡錛?br> UI 綰跨▼ 闇瑕佷粠CWinThread 媧劇敓銆?br> · ExitInstance() 鈥斺?褰撶嚎紼嬬粨鏉熸椂鎵ц涓浜涙竻鐞嗗伐浣溿?br> · InitInstance() 鈥斺?鎵ц綰跨▼瀹炰緥鐨勫垵濮嬪寲宸ヤ綔銆?br> · OnIdle() 鈥斺?鎵ц涓庣嚎紼嬫湁鍏崇殑絀洪棽鏃剁殑澶勭悊宸ヤ綔銆?br> · PreTranslateMessage() 鈥斺?娑堟伅榪囨護(hù)鍣?br> · Run() 鈥斺?娑堟伅娉碉紙闈濵FC娑堟伅鐨勫驚鐜鐞嗭級(jí)
CWinApp 鏄竴涓猆I綰跨▼
-----------------------------
CWinThread::Run() “THRDCORE.CPP”
int CWinThread::Run(){
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
for( ; ; ){
//phase1: check to see if we can do idle work
while (bIdle && ! ::PeekMessage ( &m_msgCur, NULL, NULL, NULL, PM_NOREMOVE ) ){
if ( ! OnIdle ( lIdleCount ++ ) )
bIdle = FALSE; // assume "no idle " state
}
//phase 2: pump messages while available
do {
if ( !PumpMessage() )
return ExitInstance();
if ( IsIdleMessage ( &m_msgCur ) ){
bIdle = FALSE;
lIdleCount = 0;
}
}while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE ) );
}
}
閫氳繃bIdle鏍囧織 鍜?LONG鍙橀噺 lIdleCount 榪炴帴涓や釜闃舵銆?br> · 闃舵涓 鈥斺?while寰幆錛屽綋綰跨▼鐨勬秷鎭槦鍒楅噷娌℃湁浠諱綍娑堟伅鏃訛紝瀹冨鍦ㄩ棽緗姸鎬併?br> · 闃舵浜?鈥斺?do-while 寰幆錛屽綋鏈夋秷鎭渶瑕佽鍒嗗彂鏃訛紝瀹冭繘琛屾秷鎭殑鍒嗗彂銆?br>
鈼?nbsp; 闃舵涓錛?絀洪棽澶勭悊
閫氳繃璋冪敤OnIdle() 鏉ュ憡璇夌敤鎴鋒病鏈夋墽琛屼換浣曟搷浣滐紝綰跨▼鍙互鍋氫竴浜涙竻鐞嗗伐浣滄垨鍏朵粬銆傞棽緗搷浣滃畬鎴愬悗錛岃繑鍥?0 錛?br> OnIdle()鐨勫弬鏁扮敤鏉ユ寚紺虹嚎紼嬪凡緇忔湁澶氶暱鏃墮棿澶勫湪闈炴椿鍔ㄧ姸鎬佷簡(jiǎn)錛岃繖鏍鳳紝鍙互瀵圭┖闂插鐞嗗仛涓浜涗紭鍏堟帓搴忓伐浣溿?br>
CWinThread::OnIdle() “THRDCORE.CPP”
BOOL CWinThread::OnIdle ( LONG lCount )
{
if ( lCount <= 0 ) {
//send WM_DILEUPDATECMDUI to the main window
//send WM_IDLEUPDATECMDUI to all frame windows
}
else if ( lCount >= 0 錛墈
//Call AfxLockTempMaps / AfxUnlockTempMaps to free maps, DLLS, etc...
}
return lCount < 0; //nothing more to do if lCount >= 0
}
鑻ヨ皟鐢?OnIdle( -1 )錛屽己鍒舵墽琛屼竴嬈?UI 鏇存柊錛?br>
鈼?nbsp; 闃舵浜?錛?娑堟伅鐨勫垎鍙?br>
do-while 寰幆涓紝璋冪敤 PumpMessage() 鍒嗗彂娑堟伅錛岀劧鍚庤皟鐢?IsIdleMessage() 鏉ョ‘璁ゅ綋鍓嶆鍦ㄨ澶勭悊鐨勬秷鎭槸鍚︽槸絀洪棽娑堟伅銆?/p>
========================================================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?9.MFC鐨勫寮哄瀷鐢ㄦ埛鐣岄潰綾?br>========================================================
----------------------------
CSplitterWnd錛?MFC鍒嗗壊紿楀彛 銆婃繁鍏ヨВ鏋怣FC銆婸249
浣跨敤 CSplitterWnd
鍒涘緩鍔ㄦ佸垎鍓茬獥鍙?br> 鈶?鍦ㄥ瓙妗嗘灦鐨勬淳鐢熺被涓姞涓婁竴涓?CSplitterWnd 鏁版嵁鎴愬憳銆?br> 鈶?鍦–MyChildFrame::OnCreateClient() 澶勭悊紼嬪簭錛屾坊鍔犲 CSplitterWnd::Create() 鐨勮皟鐢ㄣ?br> Create() 鐨勭涓涓弬鏁版寚鍚戠埗妗嗘灦鐨勬寚閽堬紝絎簩涓拰絎笁涓垎鍒寚瀹氫簡(jiǎn)鏈澶ц鏁板拰鏈澶у垪鏁般?br> 絎洓涓弬鏁版寚瀹氫簡(jiǎn)鎵鍏佽鐨勬渶灝忕獥鏍煎ぇ灝忥紝絎簲涓弬鏁版寚鍚?CCreateContext 鐨勬寚閽堛?br> 鈶?灝嗘鏋剁獥鍙g殑 RUNTIME_CLASS 娑堟伅浼犻掔粰 CDocTemplate 鏋勯犲嚱鏁幫細(xì)
CMultiDocTemplate* pDocTemplate =
new CMultiDocTemplate( IDR_MYAPPTYPE, RUNTIME_CLASS(CMyDocClass ), RUNTIME_CLASS( CMyChildFrameClass ),
RUNTIME_CLASS錛圕MyViewClass錛夛級(jí)錛?br> AddDocTemplate錛坧DocTemplate錛夛紱
鍒涘緩闈?rùn)鎬佸垎鍓茬獥鍙o紝鐢?CreateStatic() 浠f浛 Create()銆傝皟鐢–SplitterWnd::CreateView() 鏉ュ垱寤烘柊鐨勭獥鏍箋?br>
*************************
CSplitterWnd 鍐呴儴瀹炵幇
灝佽鐨勬暟鎹被鍨?br> · ESplitType 鈥斺?瀹氫箟瑕佺敾鍑虹殑鍒嗗壊鍣ㄧ殑綾誨瀷錛屽睘浜庢灇涓劇被鍨嬨傜被鍨嬫湁 鍒嗗壊妗嗐佸垎鍓叉潯銆佸垎鍓茬劍鐐逛互鍙?qiáng)鍒嗗壊杈圭晫銆?br> · CRowColInfo 鈥斺?璁板綍琛屾垨鍒楃殑鏈灝忓昂瀵搞佺悊鎯沖昂瀵稿拰褰撳墠灝哄銆?br> 鍒涘緩/甯冨眬鏁版嵁鎴愬憳
· m_pDynamicViewClass 鈥斺?鎸囧悜鐢?CSplitterWnd 鍔ㄦ佸垱寤虹殑瑙嗗浘錛堢獥鏍鹼級(jí)鐨凜RuntimeClass 淇℃伅鐨勬寚閽堛侰reate() 鎴朇reateView()涓畾涔?br> · m_nMaxRows / m_nMaxCols 鈥斺?璋冪敤 Create() 鍜?CreateStatic() 鏃跺埗瀹氱殑鏈澶ц鏁板拰鍒楁暟銆?br> · m_nRows / m_nCols 鈥斺?褰撳墠鍦?CSplitterWnd 閲屾樉紺虹殑琛屾暟鍜屽垪鏁般?br> · m_bHasHScroll / m_bHasVScroll 鈥斺?琛ㄦ槑琛屾粴鍔ㄦ潯鎴栧垪婊氬姩鏉?鏄惁宸茬粡鍒涘緩鐨勬爣璁般?br> · m_pColInfo 鈥斺?鏄疌RowInfo鐨勬暟緇勶紝姣忎釜鍏冪礌瀵瑰簲 CSplitterWnd 鐨勪竴鍒椼傞潤(rùn)鎬佸垎鍓蹭腑錛岃繖涓煎浐瀹氥?br> · m_pRowInfo 鈥斺?鏄?CRowColInfo 鐨勬暟緇勶紝姣忎釜鍏冪礌瀵瑰簲CSplitterWnd 鐨勪竴琛屻?br> 淇グ鐨勬暟鎹垚鍛?br> 鍦ㄦ瀯閫犲嚱鏁頒腑鍒濆鍖栵紝
· m_cxSplitte / m_cySplitter 鈥斺?鍒嗗壊妗嗗拰鍒嗗壊鍣ㄧ殑瀹藉害鍜岄珮搴︺?br> · m_cxBorderShare / m_cyBorderShare 鈥斺?濡傛灉鍒嗗壊紿楀彛姝e湪鐢誨垎鍓茬獥鍙g殑杈圭晫錛屽間負(fù)1.
· m_cxSplitterGap / m_cySplitterGap 鈥斺?鍒嗗壊妗?鍒嗗壊鏉″拰婊氬姩鏉?杈圭晫涔嬮棿鐨勮窛紱匯傚間負(fù)6.
· m_cxBorder / m_cyBorder 鈥斺?鍒嗗壊杈圭晫鐨勮竟鐣屽搴︺傚間負(fù)0.
璺熻釜鏁版嵁鎴愬憳
鐢ㄤ簬鐐瑰嚮嫻嬭瘯鍜岃窡韙?br> · m_bTracking 鈥斺?濡傛灉涓虹湡錛屽垯鐢ㄦ埛姝e湪鎷栧姩涓涓垎鍓叉潯銆?br> · m_bTracking2 鈥斺?濡傛灉涓虹湡錛岀敤鎴鋒鍦ㄦ嫋鍔ㄤ袱涓垎鍓叉潯銆?br> · m_ptTrackOffset 鈥斺?鐐瑰嚮嫻嬭瘯涓殑“閫夊彇”灝哄銆傚厑璁哥敤鎴鋒湁鎵鍋忓樊銆?br> · m_rectLimit 鈥斺?璺熻釜鏃剁獥鏍肩殑澶у皬錛岀敤鏉ョ‘瀹氳璺熻釜鐨勫垎鍓叉潯鐨勯珮搴︺?br> · m_rectTracker 鈥斺?璺熻釜鏃剁敤鏉ョ敾鍒嗗壊鏉$殑鐭╁艦銆?br> · m_rectTracker2 鈥斺?璺熻釜鏃剁敤鏉ョ敾絎簩涓垎鍓叉潯鐨勭煩褰?br> · m_htTrack 鈥斺?琚?CSplitterWnd 鐨勭偣鍑昏窡韙満鍒惰緗垚涓涓灇涓懼鹼紝鐢ㄦ潵鎻忚堪鍒嗗壊紿楀彛鐨勫摢涓儴鍒嗚鐐瑰嚮浜?jiǎn)銆?br> 閫氱敤鎴愬憳鍑芥暟
· CreateCommon() 鈥斺?褰揅reate() 鍜?CreateStatic() 鍒濆鍖栧畬 CSplitterWnd 鐨勫姩鎬佹垚鍛樻垨闈?rùn)鎬佹垚鍛樻椂浼?xì)璋冪敤杩欎釜鍑芥暟銆?br> · CreateScrollBarCtrl() 鈥斺?鍒涘緩甯︽湁鎸囧畾椋庢牸鍜屾爣紺虹鐨勬粴鍔ㄦ潯銆?br> · DoScroll() 鈥斺?瀵規(guī)粴鍔ㄦ潯娑堟伅浣滃嚭鍙嶅簲銆?DoScroll() 鑳藉鍚屾閫傚綋鐨勭獥鏍箋?br> · DoScrollBy() 鈥斺?浠ュ埗瀹氱殑鏁伴噺婊氬姩鐩稿簲鐨勭獥鏍箋?br> · DoKeyboardSplit() 鈥斺?鍦ㄧ▼搴忛噷璋冪敤璇ュ嚱鏁頒細(xì)浣垮緱紿楀彛琚垎鍓層?br> · CanActivateNext() 鈥斺?鐢ㄦ潵紜畾涓嬩竴涓獥鏍兼槸鍚﹁兘琚縺媧匯傚嵆鏄惁鑳藉緱鍒扮劍鐐癸紝琚獵View綾昏皟鐢?br> · ActivateNext() 鈥斺?嬋媧諱笅涓涓獥鏍箋傞氬父鍦ㄤ竴涓獥鏍艱鍒犻櫎鏃惰皟鐢?br> 甯冨眬鎴愬憳鍑芥暟
· RecalcLayout() 鈥斺?緇存姢鎵鏈夊垎鍓茬獥鍙g殑浣嶇疆錛屽綋涓涓獥鏍艱鍒涘緩/鍒犻櫎鏃訛紝琚皟鐢ㄣ?br> · TrackRowSize() 鈥斺?鏇存柊鎸囧畾琛岀殑 m_pRowInfo 鏁扮粍淇℃伅銆傚悓鏃剁‘瀹氭槸鍚︽湁瓚沖鐨勭┖闂存潵瀛樺偍璇ヨ銆?br> · TrackColumnSize() 鈥斺?
· GetSizingParent() 鈥斺?鎼滅儲(chǔ)澶у皬鍙彉鐨勭埗紿楀彛
緇樼敾鎴愬憳鍑芥暟
· DrawAllSplitBars() 鈥斺?“椹卞姩”鍒嗗壊紿楀彛鐨勭粯鐢昏繘紼嬶紝涓烘瘡涓渶瑕佺粯鐢葷殑緇勪歡璋冪敤 OnDrawSplitter.
· OnDrawSplitter() 鈥斺?涓哄垎鍓茬獥鍙g殑姣忎釜緇勪歡榪涜緇樼敾錛屼負(fù)铏氬嚱鏁般?br> · OnPaint() 鈥斺?瀵筗M_PAINT娑堟伅浣滃嚭鍝嶅簲
鐐瑰嚮嫻嬭瘯鎴愬憳鍑芥暟
· HitTest() 鈥斺?閫夊彇鏌愪釜鐐癸紝榪斿洖榪欎釜鐐圭殑鐐瑰嚮嫻嬭瘯鍊箋?br> · GetInsideRect() 鈥斺?綾誨悓GetClientRect()錛岃冭檻浜?jiǎn)鍏变韩鐨勬粴鍔ㄦ潯銆?br> · GetHitRect() 鈥斺?涓烘煇涓鎸囧畾鐨勫垎鍓茬獥鍙g粍浠舵绱㈢偣鍑葷煩褰€?br> · SetSplitCursor() 鈥斺?浣跨敤鐐瑰嚮嫻嬭瘯鏉ョ‘瀹氳鏄劇ず鍝竴縐嶅厜鏍囥?br> 璺熻釜鎴愬憳鍑芥暟
· OnNcCreate() 鈥斺?CSplitterWnd 澶勭悊WM_NCCREATE 娑堟伅錛屾墍浠ュ畠鍙互縐昏蛋 WS_EX_CLIENTEDGE 鐨勬墿灞曢鏍間綅銆?br> · OnPaint() 鈥斺?鐢誨垎鍓茬獥鍙g殑鍚勪釜緇勪歡銆?br> · OnDisplayChange() 鈥斺?褰撶敤鎴鋒敼鍙樻樉紺哄櫒鐨勫垎杈ㄧ巼鏃惰儗璋冪敤錛岃皟鐢≧ecalcLayout() 鏉ユ洿鏂板垎鍓茬獥鍙c?br> · OnSize() 鈥斺?褰撶敤鎴鋒敼鍙樼獥鍙eぇ灝忔椂 璋冪敤 RecalcLayout()銆?br> · OnMouseMove() 鈥斺?鍦ㄥ垎鍓茬獥鍙g粍浠朵笂鎵ц鐐瑰嚮嫻嬭瘯銆?br>**************************
CSplitteWnd 鐨勫垵濮嬪寲
CSPlitterWnd::CreateCommon()
鈶?璋冩暣濂介鏍兼爣璁般?br> 鈶?璋冪敤 AfxDeferRegisterClass()錛孋Wnd::CreateEx()銆?br> 鈶?涓?m_pColInfo 鍜?m_pRowInfo 鏁扮粍鍒嗛厤絀洪棿錛屽茍榪涜鍒濆鍖栵紝灝?m_nMaxCols/Rows 浣滀負(fù)鏁扮粍鐨勫ぇ灝忋?br> CreateCommon() 鍦ㄥ驚鐜噷涓嬈¤闂瓹RowColInfo鏁扮粍錛屽仛濡備笅鎿嶄綔
1. nMinSize 鍜?nIdealSize 閮借璁劇疆鎴愬弬鏁?sizeMin鐨勫箋?br> 2. nCurSize 琚垵濮嬪寲涓?-1錛岃鏄庡綋紿楁牸鐨勫昂瀵歌鍒濆鍖栵紙RecalcLayout錛夋椂錛岃鍊煎簲璇ヨ璁劇疆銆?br> 鈶?鍒濆鍖栧畬CrowColInfo 鐨勮鍒楁暟緇勫悗錛岃皟鐢?SetScrollStyle() 灝?m_bHasH/VScroll 榪涜鍒濆鍖栵紝鐒跺悗榪斿洖TRUE
CSplitterWnd::CreateView()
鈶?灝唖izeInit鍙傛暟瀛樺偍鍦?CRowColInfo鐩稿簲鐨勬暟緇勪笅鏍囬噷錛岃緗竴涓眬閮ㄦ爣璁?bSendInitialUpdate 鍊間負(fù)FALSE銆?br> 鈶?鍒涘緩涓涓眬閮ㄧ殑CCreateContext(),灝介噺灝嗘瘡涓厓绱犲垵濮嬪寲涓烘瘮杈冨畬鏁寸殑鍊箋傝皟鐢?GetActivePane() 鏉ョ‘瀹?m_pLastViewCView鎸囬拡
涓鏃reateView() 鏈変簡(jiǎn)m_pLastView錛屽氨鍙互閫氳繃璋冪敤 GetDocument() 鏉ョ‘瀹?CCreateContext 鍏朵粬鍩熺殑鍊鹼紝
鐒跺悗璋冪敤 CDocument::GetDocTemplate()銆傚湪鎵懼埌鎵鏈夎繖浜涘厓绱犲悗錛宲Context鎸囧悜濂逛滑錛屽皢bSendInitialUpadte璁句負(fù) TRUE銆?br> 鈶?璋冪敤 CreateObject() 涓?CRuntimeClass 淇℃伅鍒涘緩涓涓獥鏍煎璞°傝緗浼犻掑埌 Create() 鐨勫弬鏁?椋庢牸鍜屽畾浣嶇煩褰€?br>
========================================================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?8.MFC鐨勬枃妗?瑙嗗浘緇撴瀯 鎷撳睍
========================================================
----------------------------
CMirrorFile 銆婃繁鍏ヨВ鏋怣FC銆?P221
CMirrorFile::Open() 錛圖OCCORE.CPP錛?br> 絎竴閮ㄥ垎錛氬厛媯(gè)鏌?modeCreate錛岀湅璋冪敤鑰呮槸鎯沖垱寤轟竴涓柊鏂囦歡榪樻槸鎯寵繛鎺ュ湪宸叉湁鏂囦歡鍚庨潰銆?br> 鐒跺悗璋冪敤CFile::GetStatus()錛岃嫢鏂囦歡闈炵┖錛岃繑鍥炰竴涓潪闆剁殑鏁幫紱
鑻ユ枃浠跺瓨鍦紝Open()鎺ョ潃浼?xì)璋冪敤GetDiskFreeSpace()錛岀‘瀹氶┍鍔ㄥ櫒鏈夊灝戝瓧鑺傚彲浠ョ敤銆傚皢緇撴灉鍜屽凡鏈夋枃浠跺ぇ灝忕殑涓ゅ嶈繘琛屾瘮杈冦?nbsp;
鑻ュぇ浜庡悗鑰咃紝鍒涘緩涓涓復(fù)鏃舵枃浠訛紝鏂囦歡鍚嶅瓨鍌ㄥ湪 m_strMirrorName 涓?br> 絎簩閮ㄥ垎褰?m_strMirrorName 闈炵┖鏃舵墽琛屻?
璋冪敤 CFile::Open() 鎵撳紑闀滃儚鏂囦歡錛岀劧鍚庡皢鏂囦歡鐨勬椂闂村拰鏂囦歡鏉冮檺浠庢簮鏂囦歡鎷瘋礉緇欓暅鍍忔枃浠躲?br> 鑻ユ墽琛屼簡(jiǎn)絎簩閮ㄥ垎錛孫pen() 榪斿洖TRUE錛岃嫢娌℃湁琚墽琛岋紝浼?xì)璋冪?CFile::Open()錛?榪斿洖璋冪敤緇撴灉銆?br> 錛堣嫢鏈夊啓鎿嶄綔姝e湪鎵ц鎴栬呮湁鏂囦歡琚鐩栵紝CMirrorFile::Open() 灝辨墦寮涓涓拰鎸囧畾鏂囦歡涓嶅悓鐨勬枃浠躲?br>
CMirrorFile::Close()
鍏堝湪 m_strName 瀛樺偍鏂囦歡鐨勫悕瀛楋紝鍦ㄨ皟鐢–File::Close() 涔嬪悗錛屾鏌ユ槸鍚︿嬌鐢ㄤ簡(jiǎn)闀滃儚鏂囦歡錛岃嫢浣跨敤浜?jiǎn)锛孫pen()浼?xì)鍒犻櫎鎸囧?nbsp; 鏂囦歡錛屽皢鏂囦歡鎷瘋礉涓烘寚瀹氭枃浠躲?br>
鍗矯MirrorFile 閫氳繃淇濆瓨鍘熸湁鏂囦歡鍜屽涓存椂鏂囦歡榪涜鍐欐搷浣滄潵淇濇姢浣犵殑鏂囨。銆?br> 榪欐牱錛岃嫢鍐欐搷浣滃嚭鐜伴棶棰橈紝婧愭枃浠朵篃鏄畨鍏ㄧ殑 銆?br> CMirrorFile 榪樹細(xì)紜繚婧愭枃浠剁殑瀹夊叏鎬т互 鍙?qiáng)鏂囦欢鍒涘晦Z俊鎭槸鍚﹁兘琚紜湴鎷瘋礉
---------------------------
CView 鎵撳嵃 銆婃繁鍏ヨВ鏋怣FC銆?P223 - 235
---------------------------
CView鐨勬淳鐢熺被錛?CScrollView
璋冪敤SetScrollSizes() 璁?CScrollView 鐭ラ亾浣犵殑“閫昏緫瑙嗗浘”鐨勫ぇ灝忥紝鑾峰緱澶у皬淇℃伅鍚庯紝鎿嶇旱浼犻掔粰 OnDraw() 鐨凞C錛屼粠鑰屾敮鎸佹粴鍔?br>
CScrollView 濡備綍榪愪綔錛?br> CScrollView ( VIEWSCRL.CPP )
· m_nMapMode 鈥斺?鍦?SetScrollSizes() 涓紝鍙互涓哄簲鐢ㄧ▼搴忔寚瀹氫竴涓槧灝勬ā寮忋傞粯璁や負(fù)MM_NONE錛孋ScrollView瀹氫箟涓猴紙MM_SCALETOFIT錛夈?br> · m_totalLog 鈥斺?閫昏緫鍧愭爣涓鍥劇殑澶у皬錛岃繖涓奸氳繃 SetScrollSizes() 鎴愬憳鍑芥暟浼犻掔粰 CScrollView銆?br> · m_totalDev 鈥斺?璁懼鍧愭爣涓鍥劇殑澶у皬銆?br> · m_pageDev 鈥斺?璁懼鍧愭爣涓竴涓〉鐨勫ぇ灝忋?br> · m_lineDev 鈥斺?璁懼涓竴鏉$嚎鐨勫ぇ灝忋?br> · m_bCenter 鈥斺?CPreviewView 浣跨敤榪欎釜鏁版嵁鎴愬憳榪涘叆紿楀彛涓殑瑙嗗浘銆?br>
· CenterOnPoint() 鈥斺?灝嗚鍥鵑泦涓簬涓鐐癸紝鐢?CPreviewView 璋冪敤
· ScrollToDevicePosition() 鈥斺?璐熻矗婊氬姩瑙嗗浘銆傞氳繃璋冪敤::SetScrollPos() 鍜?::CSrollWindow() 鏇存柊婊氬姩鏉★紝鏉ュ畬鎴愯鍥劇殑婊氬姩鏉°?br> · UpdateBars() 鈥斺?CScrollView 鍦ㄥ垵濮嬪寲鐨勬椂鍊欏拰紿楀彛澶у皬鍙戠敓鍙樺寲鐨勬椂鍊欒皟鐢ㄣ傝矗浠繪槸鏍規(guī)嵁 GetScrollBarState() 鐨勮繑鍥炰俊鎭殣钘忋佹樉紺恒佸垵濮嬪寲婊氬姩鏉°?br> · GetTrueClientSize() 鈥斺?鐢ㄦ潵紜畾鐢ㄦ埛瑙嗗浘鏄惁瓚沖澶э紙鏄惁闇瑕佹粴鍔ㄦ潯錛夛紝鍙湁 UpdateBars 鎵嶄細(xì)璋冪敤榪欎釜鍑芥暟銆?br> · GetScrollBarSizes() 鈥斺?紜畾婊氬姩鏉$殑瀹藉害鍜岄珮搴︼紝鑰冭檻浜?jiǎn)绐楀彛鐨勯鏍煎拰杈规鐨勫搴︺?br> · GetScrollBarState() 鈥斺?鑾峰彇 CScrollView 鎵闇瑕佺殑鍏充簬瑙嗗浘鐨勭姸鎬併?br> · CalcWindowRect() 鈥斺?璁$畻紿楀彛鐭╁艦鐨勫ぇ灝忥紝鑰冭檻婊氬姩鏉″拰鍏朵粬紿楀彛楗扮墿鐨勫ぇ灝忋?br> · OnPrepareDC() 鈥斺?CScrollView 鍜?ONVScroll() 浜や簰鐨勫叧閿?br> · OnScroll() 鈥斺?OnHScroll() 鍜?OnVScroll涓や釜娑堟伅澶勭悊鍑芥暟閮借皟鐢ㄤ簡(jiǎn)榪欎釜鍑芥暟銆傛牴鎹〉闈㈠ぇ灝忓拰琛屽ぇ灝忕‘瀹氳婊氬姩鐨勯噺銆傚啀璋冪敤 OnScrollBy()
· OnScrollBy() 鈥斺?媯(gè)鏌ラ渶瑕佹粴鍔ㄧ殑閲忔槸鍚﹁秴鍑轟簡(jiǎn)婊氬姩鏉$殑鑼冨洿鍜岃鍥劇殑閫昏緫澶у皬銆傝嫢娌℃湁錛岃皟鐢?::SetScrollPos() 縐誨姩婊氬姩鏉★紝鍦ㄨ皟鐢?::ScrollWindow().
· OnSize() 鈥斺?鑻?CScrollView 涓嶆槸澶勪簬“scale-to-fit”妯″紡涓嬶紝OnSize() 璋冪敤 UpdateBars()錛涘惁鍒欙紝璋冪敤 SetScaleToFitSize()銆?br> · OnHScroll() 鈥斺?璋冪敤 OnScroll() 鐨勬秷鎭鐞嗗嚱鏁般?br> · OnVScroll() 鈥斺?璋冪敤 OnScroll() 鐨勬秷鎭鐞嗗嚱鏁般?br>
CScrollView::SetScrollSizes() 錛圴IEWSCRL.cpp) 銆婃繁鍏ヨВ鏋怣FC銆婸239
鈶? 灝?m_nMapMode 鍒濆鍖栦負(fù)鎻愪緵鐨勬柊鏄犲皠妯″紡錛?nbsp; m_totalLog 鐨勫垵濮嬪寲鍊兼槸sizeTotal 鍙傛暟銆?br> 鈶? 鍦ㄦ爤涓婂垱寤轟竴涓?CWindowDC錛屽茍涓斿湪璁劇疆浜?jiǎn)鏄牉畡妯″紡涔嬪悗锛屼娇鐢―C 鏉ヨ綆楄鍥懼ぇ灝忋侀〉闈㈠ぇ灝忓拰琛屽ぇ灝忕殑璁懼鍧愭爣銆?br> 鈶? 灝嗛昏緫鍧愭爣杞寲涓鴻澶囧潗鏍囧悗錛屾鏌ョ‘淇濈敤鎴鋒彁渚涗簡(jiǎn)涓涓潪榛樿鐨勫鹼紝鑻ヤ負(fù)榛樿鍊?錛岄〉闈㈠ぇ灝忚涓鴻鍥懼ぇ灝忕殑1/10錛岃涓洪〉鐨?/10鎴栬鍥劇殑1/100銆?br> 鈶? 鑻ラ渶瑕侊紝璋冪敤 UpdateBars() 鍜?Invalidate()銆傝緗粴鍔ㄦ潯錛岃嫢淇敼浜?jiǎn)鏄牉畡妯″紡锛岄噸鐢汇?br>
CScrollView::OnPrepareDC() 鍦ㄨ皟鐢?OnDraw()涔嬪墠璋冪敤
鈶? 璁劇疆鏄犲皠妯″紡錛岃嫢鍦?#8220;scale-to-fit”妯″紡涓嬶紝妯″紡璁劇疆涓?ANISOTROPIC錛岀劧鍚庡紿楀彛鍜岃鍥劇鍙f搷浣滐紝鐭ラ亾瑙嗗浘鐨勫ぇ灝忓拰瀹㈡埛紿楀彛鍖歸厤銆?br> 鑻ヤ笉鏄紝璋冪敤 SetMapMode()錛?鍙傛暟鏄敤鎴烽氳繃 SetScrollSizes() 鎸囧畾鐨勬槧灝勬ā寮忋?br> 鈶? 鍦ㄦ爤涓婂垱寤轟竴涓?CPoint ptVpOrg錛坅ssume no shift for printing錛夛紝鍒濆鍖栦負(fù) 0,0銆?鑻ヨ鍥句笉鍦ㄦ墦鍗幫紝 ptVpOrg = -GetDeviceScrollPosition()
鈶? 璋冪敤 CDC::SetViewportOrg( ptVpOrg )銆傜劧鍚庤皟鐢?CView::OnPrepareDC()銆?br>
-------------------------------------
CFormView
鍏堢敤璧勬簮緙栬緫鍣ㄥ垱寤轟竴涓璇濇妯℃澘錛岀劧鍚庡垱寤轟竴涓狢FormView 鐨勬淳鐢熺被錛岀劧鍚庡皢瀹冨拰瀵硅瘽妗嗘ā鏉跨粦瀹氾紙閫氳繃灝嗘ā鏉跨殑璧勬簮ID 浼犻掔粰 CFormView 鏋勯犲嚱鏁幫級(jí)
錛圴IEWFORM.CPP) 銆婃繁鍏ヨВ鏋怣FC銆?nbsp; P242
· m_lpszTemplateName 鈥斺?瀵硅瘽妗嗘ā鏉胯祫婧愮殑鍚嶅瓧
· m_pCreateContext 鈥斺?鎸囧悜 CCreateContext 鐨勬寚閽堛侰FormView涓嶇洿鎺ヤ嬌鐢紝浼?xì)鍐?OnCreate() 鍑芥暟涓皢瀹冧紶閫佺粰妗嗘灦銆?br> · m_hWndFocus 鈥斺?鍦?OnSetFocus() 涓紝CFormView灝嗙劍鐐硅緗負(fù)紿楀彛鍙ユ焺錛?OnActivateView()錛孫nActivateFrame()銆?br> · OnDraw() 鈥斺?浠涔堥兘涓嶅仛錛學(xué)indows鎺т歡閮戒細(xì)閲嶇敾鑷繁銆?br> · PreTranslateMessage() 鈥斺?nbsp; 瀹屾垚涓浜涜礬鐢辯殑浠誨姟錛屽皢鎺т歡銆佽鍥懼拰紿楀彛鐨勬秷鎭佸線姝g‘鐨勭洰鐨勫湴
· SaveFocusControl() 鈥斺?灝?m_hWndFocus 璁劇疆涓?::GetFocus() 鐨勮繑鍥炵粨鏋滐紝鍗沖綋鍓嶅浜庣劍鐐圭殑鎺т歡銆?br> · OnActivateFrame() 鈥斺?褰撹鍥捐紱佺敤鏃訛紝璋冪敤 SaveFocusControl() 紜繚褰撶劍鐐瑰洖鏉ユ槸錛岀劍鐐圭殑鎺т歡浠嶆湁鎺у埗銆?br> · OnActivateView 鈥斺?璁劇疆 m_hWndFocus 鍙橀噺
· OnCreate() 鈥斺?灝唌_pCreateContext 浼犻掔粰 LPCREATESTRUCT 緇撴瀯鎸囬拡鐨?lpCreateParams 鍩熴?br> · OnSetFocus() 鈥斺?鑻?m_hWndFocus 鎸囧悜涓涓悎娉曠獥鍙o紝OnSetFocus()浼?xì)灏嗙劍鐐硅湄?fù)榪欎釜鎺т歡銆傚惁鍒欏皢鐒︾偣璁句負(fù)婧愮獥鍙c?br>
CFormView::Create()
鈶? 鍦╩_pCreateContext 涓瓨鍌?CCreateContext 鍙傛暟錛岃繖鏍峰氨鍙互鍐嶈皟鐢?OnCreate() 鏃朵紶鍏ャ傜劧鍚庣‘淇?Windows閫氱敤鎺т歡閮芥槸娉ㄥ唽榪囩殑銆?br> 鈶? 璋冪敤PreCreateWindow 鏉ョ‘瀹氱敤鎴鋒寚瀹氱殑鎵╁睍椋庢牸錛屽湪璋冪敤 CWnd::CreateDlg()銆傝繖涓嚱鏁頒粠搴旂敤紼嬪簭鐨勮祫婧愪腑瑁呰澆瀵硅瘽妗嗘ā鏉匡紝
騫惰皟鐢–Wnd::CreateDlgIndirect()銆侰reateDlg() 鍒涘緩涓涓潪妯℃佺殑瀵硅瘽妗嗐?br> 鈶? 灝唌_pCreateContext 璁劇疆涓?NULL錛屽啀淇敼紿楀彛鐨勬爣鍑嗛鏍煎拰鎵╁睍椋庢牸銆傚皢紿楀彛鎺т歡鐨勬爣紺虹璁劇疆涓?nID 鍙傛暟銆?br> 鍐嶈皟鐢?SetScrollSizes() 鏉ュ垵濮嬪寲 ScrollView錛岄噰鐢ㄧ殑鏄犲皠妯″紡涓?MM_TEXT銆傚氨鍒涘緩浜?jiǎn)涓涓拰瀵硅瘽妗嗘ā鏉夸竴鏍峰ぇ鐨勯昏緫瑙嗗浘銆?br> 鈶? 灝嗚鍥劇殑澶у皬鍜?rect 鍙傛暟鐨勫煎尮閰嶏紝鍐嶅湪 PreCreateWindow() 涓皟鐢ㄦ寚瀹氫簡(jiǎn) WS_VISIBLE錛屽氨璋冪敤 ShowWindow()銆?br> CFormView::OnInitialUpdate()璋冪敤浜?UpdateData(FALSE) 鏉ュ垵濮嬪寲紿椾綋涓殑鎺т歡銆?DDX/DDV灝辮涓篊FormView鏄竴涓璇濇銆?br>
--------------------------------
CCtrlView 銆婃繁鍏ヨВ鏋怣FC銆?P244
CCtrlView 媧劇敓浠ヤ笅綾伙細(xì) CEditView銆丆ListView銆丆TreeView銆丆RichEditView
· m_strClass 鈥斺?鍖呭惈浜?jiǎn)鎺т欢鐨劷H楀彛綾葷殑鍚嶅瓧錛岄氬父鏄?#8220;viewized”銆傚湪鏋勯犲嚱鏁頒腑璁劇疆銆?br> · m_dwDefaultStyle 鈥斺?瑙嗗浘綾葷殑榛樿椋庢牸銆傞氳繃鏋勯犲嚱鏁頒紶鍏ャ?br> · OnDraw() 鈥斺?浠庝笉琚皟鐢紝璋冪敤浜?ASSERT錛團(tuán)ALSE錛夋潵紜繚涓嶈璋冪敤銆?br> · PreCreateWindow() 鈥斺?璁劇疆CREATESTRUCT 鐨?lpszClass 鍩燂紝璁劇疆鎴?m_strClass 鎴愬憳鏁版嵁錛岃繖鏍峰氨鍒涘緩浜?jiǎn)鎺т欢銆?br> 榪樺 CREATESTRUCT 鐨勯鏍煎煙鎿嶄綔錛屼互鍙嶆槧瀛樺偍鍦?m_dwDefaultStyle 涓殑鍊箋?br> · OnPaint() 鈥斺?璋冪敤 Default()銆侱efault() 浼?xì)灏嗗墠涓涓秷鎭紙WM_PAINT錛夊彂閫佺粰DefWindowProc()銆?br>
CTreeView 錛圴IEWCMN.CPP錛孉FXCVIEW.INL錛?br> · GetTreeCtrl() 鈥斺?榪斿洖涓涓?CTreeCtrl 寮曠敤錛岀被鐨勪嬌鐢ㄨ呭彲浠ョ敤榪欎釜寮曠敤鐩存帴璋冪敤 CTreeCtrl錛屽鏍?wèi)鎺т欢鎿嶄綔銆?br> · RemoveImageList() 鈥斺?涓涓唴閮ㄨ緟鍔╁嚱鏁幫紝灝嗘帶浠剁殑鍥懼儚閾捐〃娓呯┖銆傝繖涓緟鍔╁嚱鏁頒細(xì)鍐?OnDestroy() 涓璋冪敤
· OnDestroy() 鈥斺?娓呯┖ LSVIL_NORMAL 鍜?LVSIL_STATE 涓や釜鍥懼儚閾捐〃錛岃皟鐢?RemoveImageList()銆?br>
========================================================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?7.MFC鐨勬枃妗?瑙嗗浘緇撴瀯
========================================================
鏂囨。/瑙嗗浘鐩鎬簰渚濊禆鍏崇郴
· CWinApp鍖呭惈涓涓?CDocManager 鎸囬拡銆?br> · CDocManager 緇存姢涓涓枃妗fā鏉塊摼琛紝欏誨湪 CWinApp::IniInstance()涓?鍒涘緩騫跺姞鍏ヨ繖浜涙ā鏉褲?br> · 鏂囨。妯℃澘灝嗚繖 3 涓被緇戝畾鍦ㄤ竴璧鳳細(xì) CView / CDocument / CFrameWnd銆傝繖浜涚被閮芥牴鎹紶閫掔粰鏂囨。妯℃澘鏋勯犲嚱鏁扮殑CRuntimeClass淇℃伅鍒涘緩
· MDI 涓撴湁鐨勬枃妗fā鏉跨淮鎶や竴涓墦寮鏂囨。閾捐〃錛岃?SDI 涓撴湁鐨勬枃妗fā鏉垮彧鏈変竴涓寚鍚戞墦寮鏂囨。鐨勬寚閽堛?br> · 鏂囨。緇存姢涓涓墦寮瑙嗗浘鐨勯摼琛ㄣ備嬌鐢ㄨ繖涓摼琛ㄤ笌瑙嗗浘閫氫俊銆佹洿鏂拌鍥俱?br> · 鏂囨。鏈変竴涓寚閽堟寚鍚戝畠浠殑鏂囨。妯℃澘銆傜敤榪欎釜鎸囬拡璁劇疆鏍囬錛岃繘琛屽懡浠よ礬鐢遍夋嫨錛屽湪琚垹闄ゆ椂閫氱煡鏂囨。妯℃澘
· 妗嗘灦鏈変竴涓寚閽堟寚鍚戝綋鍓嶇殑媧昏穬瑙嗗浘
· 琚垱寤烘椂錛屾鏋剁瓑鍒頒竴涓?CCreateContext 緇撴瀯錛屽寘鍚簡(jiǎn)鍦ㄦ枃妗fā鏉夸腑鍙互鎵懼埌鐨凜RuntimeClass淇℃伅鍜屼竴涓寚鍚戞枃妗g殑鎸囬拡銆?br> · 瑙嗗浘鏈変竴涓寚閽堟寚鍚戝畠鐨勬枃妗c傚綋璇ヨ鍥捐鍒犻櫎鏃訛紝鐢ㄨ鎸囬拡閫氱煡鏂囨。銆?br> · 瑙嗗浘鍙互閫氳繃璋冪敤 CView::GetParentFrame() 鑾峰緱瀹冪殑妗嗘灦紿楀彛銆?br> · 濡傛灉鏂囨。瑕佽闂畠鐨勬墍鏈夎鍥劇殑妗嗘灦錛屽彲浠ラ亶鍘嗗畠鐨勮鍥鵑摼琛紝騫惰皟鐢?CView::GetParentFrame().
· CDocTemplate 鈥斺?鍦?CWinApp 涓垱寤猴紝淇濆瓨鍦?CWinApp::m_pDocManage涓?br> · CDocManager 鈥斺?鍦–WinApp::InitInstance() 涓垱寤?br> · CFrameWnd 鈥斺?鍦?CDocTemplate::CreateNewFrame() 涓垱寤?br> · CDocument 鈥斺?鍦?CDocTemplate::CreateNewDocument() 涓垱寤?br> · CView 鈥斺?閫氳繃 CFrameWnd::OnCreate() 鍒涘緩
ID_FILE_OPEN → CWinApp::OnFileOpen() CWinApp::OnFileNew() ← ID_FILE_NEW
鍛戒護(hù) ↓ ↓
鑾峰彇鏂囦歡鍚?nbsp; 涓涓枃妗fā鏉匡紵 →鍚?#8594; 浠庣敤鎴瘋幏鍙栨枃妗g被鍨?br> ↓ ↓ ↓
浣跨敤鏂囦歡鎷撳睍鍚嶏紝閫夋嫨鏂囨。妯℃澘 鏄?nbsp; ↓
↓ ↓ ↓
------------------------------閫夋嫨鐨勬ā鏉?------------------------------
閫夋嫨妯℃澘
↓ → →→鎵撳紑錛?→→Yes→→ CMyDoc::OnOpenDocument() →
Construct document object: CMyDoc ↑ ↓ ↓ ↓
↓ ↑ ↓ ↓ ↓
Construct frame window object : CMainFrame ↑ →→→→→→→CMyDoc::OnNewDocument() ↓
↓ ↑ ↓ ↓
CframeWnd::Create() ↑ 鏂囨。鍑嗗濂?nbsp; ←←←←←←
CFrameWnd::OnCreateClient() ↑
↓ ↑
Create CMyView →→→→→→→→→→→→ 閫夋嫨妯℃澘涔嬪悗鐨勬帶鍒舵祦紼?br>
CWinApp::OnFileOpen() CWinApp::OnFileNew()
↓ ↓
CDocManager::OnFileOpen() CDocManager::OnFileNew()
↓ ↓
CDocTemplate::OpenDocumentFile()
CDocTemplate::CreateNewDocument()
CDocTemplate::CreateNewFrame()
WM_CREATE
CFrameWnd::OnCreate()
CFrameWnd::OnCreateHelper()
CFrameWnd::OnCreateClient()
CFrameWnd::CreateView()
CMyDocument::OnOpenDocument()
[if file was specified to OpenDocumentFile()]
CMyDocument::OnNewDocument()
鍒涘緩鏂囨。/瑙嗗浘浣撶郴涓墍鏈夊璞¤繃紼嬩腑璋冪敤鐨勫嚱鏁?br>
-----------
浣撶郴緇撴瀯
鏂囨。涓庤鍥?br> 1錛夋枃妗o紱 2錛夎鍥撅紱 3錛夋枃妗?瑙嗗浘妗嗘灦錛?nbsp; 4錛夋枃妗fā鐗?br> 鏂囨。
鐢盋Document綾諱綋鐜幫紝媧劇敓鑷狢CmdTarget錛屽叿鏈塁Object鎻愪緵鐨勬墍鏈夋敮鎸侊紝涓斿彲浠ユ帴鍙楀懡浠ゆ秷鎭紝鏀寔緇勪歡瀵硅薄妯″瀷錛圕OM錛夋帴鍙e拰 OLE 鑷姩鍖栥?br> 瑙嗗浘
鏂囨。錛忚鍥炬鏋?br> 鏂囨。妯℃澘 銆婃繁鍏ヨВ鏋怣FC銆?P 198
灝嗘暣涓満鍒剁粦瀹氬湪涓璧楓傝繖3涓粍浠剁敱 CDocTemplate 鐨勭被綆$悊銆?br> CDocTemplate鏄竴涓娊璞″熀綾伙紝瀹氫箟浜?jiǎn)澶勭悊鏂囨。銆佹鏋跺拰瑙嗗浘鐨勫熀鏈搷浣溿?br> CSingleDocTemplate錛?nbsp; 4涓弬鏁扳憼涓涓祫婧怚D錛屸憽榪愯鏃剁殑CDocument媧劇敓綾伙紱鈶?榪愯鏃剁殑璇曞浘妗嗘灦錛?鈶?榪愯鏃剁殑鏂囨。瑙嗗浘銆?br> 璧勬簮ID錛氣憼紿楀彛鏍囬錛涒憽鏂囨。鍚嶇О錛涒憿褰撳垱寤轟竴涓柊鏂囨。鏃朵嬌鐢ㄧ殑鏂囨。綾誨瀷鎻忚堪絎︼紱鈶e鏍囧噯鐨勬墦寮鏂囦歡瀵硅瘽妗嗕腑鏂囦歡綾誨瀷鐨勬弿榪扮
鈶ゆ枃妗f墿灞曞悕榪囨護(hù)鍣紱 鈶?鏂囦歡綆$悊鍣ㄤ嬌鐢ㄧ殑鏂囦歡綾誨瀷鎻忚堪絎︼紱 鈶?鍦╓indows娉ㄥ唽琛ㄤ腑娉ㄥ唽鐨?ProgID銆?br> SMultiDocTemplage
鍙互鏀寔涓緇勬枃妗g殑閾捐〃錛岃孋SingleDocTemplate鍙兘鏀寔涓縐嶆枃妗?br>
CWinApp鐨勮鑹?br> 鏂囨。妯℃澘鐢?CWinApp 瀵硅薄綆$悊銆?br>
---------------
鏂囨。/瑙嗗浘緇撴瀯鍐呭箷 銆婃繁鍏ヨВ鏋怣FC銆婸 199
------------------------------------
CWinApp 綆$悊鏂囨。妯℃澘錛屾枃妗fā鏉跨鐞?妗嗘灦/瑙嗗浘/鏂囨。銆?br>
CWinApp / CDocTemplate 鎺ュ彛錛?CDocManager
· CPtrList m_templateList 鈥斺?緇存姢涓涓枃妗fā鏉垮垪琛ㄧ殑鎸囬拡銆?閫氳繃GetFirstDocTemplatePosition()鍜孏etNextDocTemplate()鏉ラ亶鍘嗘ā鏉垮垪琛ㄣ?br>
CDocManager::OnFileNew()
璐熻矗鍒涘緩涓涓柊鐨勬枃妗fā鏉?br> · 鈶燨nFileNew() 媯(gè)鏌?m_templateList 涓槸鏄惁鏈夊浜庝竴涓枃妗fā鏉匡紝鑻ユ槸錛屽垯鍒涘緩涓涓?CNewTypeDlg 瀵硅瘽妗嗭紝鍒楀嚭涓涓枃妗i摼琛ㄤ互渚涚敤鎴烽夋嫨銆?br> · 鈶?璋冪敤CDocTemplate::OpenDocumentFile()錛?br> tag錛欳NewTypeDlg鐨勬瀯閫犲嚱鏁拌鍏ヤ竴涓寚鍚戞枃妗fā鏉挎寚閽堥摼琛ㄧ殑鎸囬拡錛屽嵆 m_templateList銆傚湪DoModal() 涔嬪悗錛孫nFileNew()浠?br> CNewTypeDlg::m_pSelectdeTemplate 涓緱鍒伴変腑鐨勫璇濇妯℃澘銆?br>
CNewTypeDlg 錛圖OCMGR.CPP)
CNewTypeDlg::OnInitDialog()
· 鈶狅紝 璋冪敤GetDlgItem() 寰楀埌涓涓寚鍚?CListBox 鎸囬拡錛屽茍灝嗕箣綾誨瀷杞崲鎴?CListBox 鎸囬拡銆?br> · 鈶★紝寰楀埌鎸囬拡鍚庯紝閬嶅巻瀹冪殑鏂囨。妯℃澘閾捐〃錛岄亶鍘嗘椂錛岄氳繃璋冪敤CDocTemplate::GetDocString()寰楀埌鏂囨。綾誨瀷鐨勫瓧絎︿覆鐗堟湰錛?br> OnInitDialog鑾峰彇姣忎釜鏂囨。鐨勮繖涓瓧絎︿覆騫跺姞鍏ラ摼琛紝鍐嶈皟鐢?CListBox::SetItemDataPtr() 灝嗚繖涓枃妗fā鏉挎寚閽堥檮鍔犲埌榪欓」涓娿?br> · 鈶紝榪斿洖鍒癈Dialog::OnInitDialog()銆?br> tag:鍦–NewType::OnOK()涓紝褰撶敤鎴烽夋嫨浠庨摼琛ㄤ腑閫夋嫨浜?jiǎn)涓欏瑰茍鎸変笅OK鎸夐挳鏃訛紝 CNewType::OnOK() 浠庨噺琛ㄤ腑寰楀埌琚変腑鐨勯」錛屽茍璋冪敤
CListBox::SetItemDataPtr() 鑾峰緱鎸囧悜璇ユ枃妗fā鏉跨殑涓涓寚閽堛?OnOK() 灝嗚繖涓閫変腑鐨勬ā鏉挎寚閽堟斁鍦?pSelectedTemplate 涓紝榪欐牱錛?br> DoModal() 榪斿洖鍚庡氨鍙互鑾峰彇榪欎釜鎸囬拡
----------------------------------------
CDocTemplate錛?nbsp; CDocument銆丆View 鍜?CFrameWnd 綆$悊鍣?br>
· m_nIDResource 鈥斺?瀛樺偍浼犵粰 CDocTemplate 鏋勯犲嚱鏁扮殑絎竴涓弬鏁幫紝鏄竴涓祫婧怚D錛?br> · m_pDocClass 鈥斺?鎸囧悜璇ユ枃妗fā鏉跨殑CDocument錛堟垨媧劇敓綾伙級(jí)鐨凜RuntimeClass緇撴瀯錛屽湪鏋勯犲嚱鏁頒腑璁懼畾
· m_pFrameClass 鈥斺?鎸囧悜璇ユ枃妗fā鏉跨殑 CFrameWnd(鎴栨淳鐢熺被錛夌殑CRuntimeClass 緇撴瀯銆傚湪鏋勯犲嚱鏁頒腑璁懼畾
· m_pViewClass 鈥斺?鎸囧悜璇ユ枃妗fā鏉跨殑CView 錛堟垨媧劇敓綾伙級(jí)鐨凜RuntimeClass緇撴瀯錛屽湪鏋勯犲嚱鏁頒腑璁懼畾銆?br> · m_strDocStrings 鈥斺?涓涓狢String錛屽寘鍚敤鏉ュ畾涔変笌姣忎釜鏂囨。妯℃澘鑱旂郴鐨?涓瓧絎︿覆鐨勫瓧絎︿覆琛ㄨ祫婧愩傚湪LoadTemplate()涓垵濮嬪寲銆?br>
鍒涘緩鏂扮殑 鏂囨。/瑙嗗浘/妗嗘灦
CDocTemplate::CreateNewDocument() 錛圖OCTEMPL.CPP) 銆婃繁鍏ヨВ鏋怣FC銆婸205
· 棣栧厛錛岄氳繃CRuntimeClass 鎸囬拡鐨勬暟鎹垚鍛?m_pDocClass 璋冪敤 CRuntimeClass::CreateObject() 鍒涘緩涓涓柊鐨勬枃妗?br> · 鍦╬Document 涓繚瀛樹簡(jiǎn) 鏂扮殑 CDocument(鎴栨淳鐢熺被 ) 鎸囬拡涔嬪悗錛岄獙璇?CreateObject 鏄惁宸茬粡宸ヤ綔錛岃嫢澶辮觸錛岃繑鍥濶ULL銆?br> 鑻ユ垚鍔燂紝璋冪敤 AddDocument() 灝嗚鏂囨。鍔犲埌鎵撳紑鏂囨。閾捐〃涓?CreateNewDocument() 榪斿洖鎸囧悜鏂版枃妗g殑鎸囬拡銆?br>
CDocTemplate::CreateNewFrame()
· 棣栧厛錛屽~鍏呬竴涓狢CreateContext錛堝瓨鏀懼垱寤哄悇縐嶆枃妗?瑙嗗浘緇撴瀯鍏冪礌鎵闇鐨勫叧閿俊鎭級(jí)銆?br> 1>. m_pNewViewClass 鈥斺?涓涓?CRuntimeClass 鎸囬拡錛岀敤鏉ュ垱寤鴻鍥?br> 2>. m_pCurrentDoc 鈥斺?鎸囧悜褰撳墠鏂囨。瀵硅薄鐨勬寚閽?br> 3>. m_pCurrentFrame 鈥斺?鎸囧悜褰撳墠妗嗘灦瀵硅薄鐨勬寚閽?br> 4>. m_pNewDocTemplate 鈥斺?濡傛灉鏈夊涓枃妗o紝鎸囧悜鏈鍚庝竴涓紱
5>. m_pLastView 鈥斺?濡傛灉鏈夊涓鍥撅紝鎸囧悜鏈鍚庝竴涓鍥俱?br> · 閫氳繃m_pFrameClass 涓殑 CRuntimeClass 緇撴瀯璋冪敤 CRuntimeClass::CreateObject() 鍒涘緩涓涓鏋訛紝鍐嶈皟鐢?LoadFrame()瑁呭叆
榪欎釜妗嗘灦鐨勮祫婧愶紝鏍規(guī)嵁榪欎簺鍊煎垱寤鴻妗嗘灦銆?鏈鍚庯紝CreateNewFrame()榪斿洖涓涓寚鍚戞柊妗嗘灦鐨勬寚閽堛?nbsp;
CSingleDocTemplate 銆婃繁鍏ヨВ鏋怣FC銆婸 207
錛?CDocument* m_pOnlyDoc;
AddDocument() 灝?m_pOnlyDoc 璁劇疆鎴愬弬鏁幫紱
CMultiDocTemplate
: AddDocument() 閫氳繃璋冪敤 m_docList.AddTail( pDocument ) 灝嗘柊鏂囨。鍔犲叆鑷繁鐨勯摼琛ㄤ腑銆?br> CPtrList m_docList;
int m_nUntitledCount; //璁板綍娌℃湁鏍囬鐨勭獥鍙f暟
CMultiDocTemplate::OpenDocumentFile()
· 璋冪敤CreateNewDocument() 鍒涘緩涓涓柊鐨勭┖鏂囨。錛堜竴涓狢Document媧劇敓瀵硅薄錛夛紝鐒跺悗閫氳繃 CreateNewFrame() 鍒涘緩涓涓柊鐨勬鏋訛紝
· 鑻ュ弬鏁?lpszPathName 涓篘ULL錛?鍒橭penDocumentFile() 鐭ラ亾瑕佸垱寤虹殑浜嬩竴涓┖鐨勬柊鏂囨。錛岃皟鐢⊿etDefaultTitle()瀹屾垚榪欎釜鍔熻兘銆?br> 榪欎釜鍑芥暟涓烘柊鏂囨。紜鍚嶇О[浣跨敤Untitled涓巑_nUntitledCount涓湭鍛藉悕璁℃暟鐨勭粍鍚圿錛岀劧鍚庨氳繃鏂版枃妗f寚閽堣皟鐢–Document::SetTitle錛堬級(jí)
璁劇疆鏂版枃妗e悕瀛楋紝緇勫悗錛孫penDocumentFile()璋冪敤 OnOpenDocumentFile()錛屽茍灝嗘湭鍛藉悕璁℃暟鐨勬暟鎹垚鍛樺姞1.
· 鑻pszPathName 涓嶇瓑浜嶯ULL錛屽垯 OpenDocumentFile() 灝濊瘯鎵撳紑鎸囧畾鐨勬枃妗o紝棣栧厛錛孫penDocumentFile() 鏄劇ず涓涓瓑寰呭厜鏍囷紝鐒跺悗
璋冪敤CDocument::OnOpenDocumentFile()錛屽皢鏂囨。鍚嶄紶鍏ヤ綔涓哄弬鏁般傝嫢璋冪敤澶辮觸錛屽垯閿姣佹柊鍒涘緩鐨勫璇濇錛岃繑鍥炰竴涓狽ULL銆傝嫢璋冪敤鎴愬姛錛?br> 鍒橭penDocumentFile() 璋冪敤 CDocument::SetPathName() 鏇存柊CDocument 鐨勮礬寰勩?br> ·涓嶇lpszPathName鐨勭姸鎬佹椂璇存槑錛孫penDocumentFile() 鏈鍚庤皟鐢?CDocTemplate::InitializeUpdateFrame()錛屽啀璋冪敤
CFrameWnd::InitialUpdateFrame(), 騫朵紶閫掍竴涓寚鍚戞柊鏂囨。鐨勬寚閽堛?br>
****///---------------------------------------------
CFrameWnd 錛圵INFRM.CPP)
CFrameWnd 鍜?CView 鐨勫垱寤?nbsp; 銆婃繁鍏ヨВ鏋怣FC銆婸208
瑙嗗浘鐨勫垱寤猴細(xì)CFrameWnd::CreateView
鍦ㄦ枃妗fā鏉垮湪CreateNewFrame() 涓垱寤烘鏋舵椂錛學(xué)indows鍙戝嚭涓涓?WM_CREATE錛岃繘琛屽涓嬭皟鐢?br> OnCreate -> OnCreateHelper() -> OnCreateClient() -> CreateView()
CreateView() 浣跨敤 CCreateContext::m_pNewViewClass 涓瓨鍌ㄧ殑 CRuntimeClass 鍒涘緩涓涓鍥撅紝鍒涘緩瀹屾垚鍚庯紝璋冪敤 CWnd::Create()瀹屾垚鍒涘緩宸ヤ綔銆?br>
CFrameWnd::InitialUpdateFrame()
浣挎鏋朵腑鐨勬墍鏈夎鍥鵑兘琚洿鏂般?br> · 棣栧厛錛孖nitialUpdateFrame() 鑾峰緱涓涓椿璺冭鍥劇殑鎸囬拡錛屽茍瀛樻斁鍦?pView涓紝
· 鑻?bMakeVisible 鍙傛暟涓篢RUE錛?鍒橧nitialUpdateFrame() 鍙戝嚭 WM_INITIALUPDATE 緇欎粬鎵鏈夊悗浠o紝榪欎釜娑堟伅琚槧灝勫埌 CView::OnInitialUpadte()銆?br> 鍙戦佹秷鎭悗錛岄氳繃CView::OnActiveView() 嬋媧昏鍥俱?br>
****///---------------------------------------------
CDocument 錛圓FXWIN.H錛?br>
· m_strTitle 鈥斺?鏂囨。鍚嶏紝閫氳繃 SetTitle()璁劇疆錛屼繚瀛樻椂鐢ㄥ畠鏉ヨ瀹氭鏋剁獥鍙g殑鏍囬鍜屾枃浠剁殑鍚嶅瓧
· m_strPathName 鈥斺?褰撳墠鏂囨。鐨勮礬寰勶紙鍖呮嫭鏂囦歡鍚嶏級(jí)銆傜敤 SetPathname() 璁劇疆錛屾槸瀵筂RU鑿滃崟鐨勮ˉ鍏咃紝淇濆瓨鏂囦歡鏃剁敤鍒般?br> · m_pDocTemplate 鈥斺?鎸囧悜鏂囨。鐨勬枃妗fā鏉跨殑鎸囬拡銆?CDocTemplate::AddDocument()涓緗紝閫氳繃CDocTemplate::GetDocTemplate()璁塊棶
· m_viewList 鈥斺?璁板綍鎵鏈夊湪璇ユ枃妗d笅鎵撳紑鐨勬墍鏈夎鍥劇殑鎸囬拡銆?nbsp; 鏂囨。鏀瑰彉鏃訛紝閫氳繃榪欎釜鎸囬拡閫氱煡瑙嗗浘銆?br> 瑙嗗浘閫氳繃AddView()鍔犲叆鍒癿_viewList涓紝RemoveView()鍒犻櫎銆?br> GetFirstViewPosition() 鍜?GetNextView() 鏉ラ亶鍘?br> · m_bModified 鈥斺?“淇敼”鏍囧織浣嶏紝琚慨鏀瑰氨璁句負(fù) 1銆備負(fù)1鏄鏋跺湪鐢ㄦ埛鍏抽棴鏂囨。鏃舵彁紺恒?nbsp; IsModified() SetModifiedFlag()
· m_bAutoDelete 鈥斺?琚鏋惰緗負(fù) TRUE鏃訛紝鎵鏈夎鍥懼叧闂椂璇ユ枃妗e璞¤琚垹闄ゃ傚彲璁句負(fù) FALSE錛屾枃妗e湪娌℃湁浠諱綍鎵撳紑瑙嗗浘鏃朵粛浼?xì)淇濈?br> · DisconnectViews() 鈥斺?璇ユ垚鍛樺嚱鏁伴亶鍘?m_viewlist 涓繚瀛樼殑瑙嗗浘閾捐〃錛屽茍灝?CView::m_pDocument 鎸囬拡璁劇疆涓?NULL錛屼粠鑰屽皢鎵鏈夎鍥句粠鏂囨。涓婃柇寮銆?br> · DoSave() 鈥斺?CDocument鎴愬憳 OnFileSaveAs() 鍜?OnFileSave() 鍦ㄦ彁紺鴻緭鍏ユ枃浠跺悕鎴栭獙璇佹枃浠跺悕鍚庯紝鏈緇堥兘璋冪敤 DoSave()錛孌oSave璋冪敤浜?OnSaveDocument()
· DoFileSave() 鈥斺?鍏堟鏌ユ枃妗h琚瓨鍌ㄥ埌鐨勬枃浠剁殑涓浜涙ц川錛屽湪璋冪敤 DoSave()銆?br> · UpdateFrameCounts() 鈥斺?璁℃暟涓鴻鏂囨。鐨勬墍鏈夎鍥炬墦寮鐨勬鏋訛紝騫舵牴鎹柊鐨勬妧鏈氱煡鏇存柊瀹冧滑鐨勭獥鍙f爣棰樸?br> · SendInitialUpdate() 鈥斺?閬嶅巻瑙嗗浘閾捐〃騫惰皟鐢?CView::OnInitialUpdate()銆?br>
鍒涘緩鏂囨。錛?nbsp; 銆婃繁鍏ヨВ鏋怣FC銆婸213
-> 鍒涘緩涓涓┖鐨勬枃妗o紝浼?xì)璋冪?CDocument::OnNewDocument()銆?br> 棣栧厛璋冪敤DeleteContents() 娓呯┖鏂囨。錛堥粯璁や粈涔堥兘涓嶅仛錛夛紝鐒跺悗璁劇疆淇敼鏍囧織浣嶄負(fù) FALSE錛屽茍紜繚 m_strPathName涓虹┖
-> CDocument::OnOpenDocument() 浠庝竴涓枃浠跺垱寤烘枃妗?br> 鈶? 棣栧厛璋冪敤 CDocument::GetFile() 鎵撳紑涓涓枃浠訛紝璇ュ嚱鏁扮敤緇欏嚭鐨勬枃浠跺悕璋冪敤 CFile::Open()銆傝嫢鎵撳紑鎴愬姛錛孫nOpenDocument()璋冪敤DeleteContents()
涓烘枃浠剁殑鍙戝簭鍒楀寲錛坉e-serialization錛変綔鍑嗗錛堜粠姘鎬箙瀛樺偍璁懼璇誨叆涓涓柊鐨勬枃妗o級(jí)銆傝皟鐢⊿etModified()銆?鑻ュ簭鍒楀寲澶辮觸錛屾枃妗h鏍囪涓?#8220;宸蹭慨鏀?#8221;銆?br> 鈶? 鏍規(guī)嵁pFile 鍒涘緩涓涓?CArchive錛屽茍灝嗚繖涓?CArchive 浼犻掔粰 CDocument::Serialize()銆?鑻ュ彂搴忓垪鍖栨垚鍔燂紝鍏抽棴妗f騫墮噴鏀炬枃浠?br> 鈶? 鏈鍚庯紝鍏抽棴淇敼鏍囧織浣嶅茍榪斿洖TRUE
淇濆瓨鏂囨。錛?br> CDocument::OnSaveDocument()
閫氳繃GetFile()鎵撳紑涓涓枃浠訛紝浣跨敤鏍囧織鎸囧畾鏂囦歡鏄墦寮鐢ㄦ潵淇濆瓨鐨勶紙CFile:: mode ReadWrite|CFile::modeCreate錛夈?br> 鍒涘緩CArchive錛屽茍灝嗕箣搴婂簳緇?Serialize() 鎴愬憳鍑芥暟銆?br> 鑻ユ垚鍔熷簭鍒楀寲錛屽叧闂瑿Archive錛屾爣蹇椾綅璁劇疆鎴?FALSE錛岃繑鍥濼RUE銆?br>
涓庤鍥鵑氫俊錛?br> m_viewlist 鏄?CDocument 涓庢鍦?#8220;瑙?#8221;榪欎釜鏂囨。鐨勮鍥捐繘琛屼氦浜掔殑涓粙銆?br> 錛堥渶瑕佷氦浜掔殑鐘跺喌錛?br> 1. 閫氱煡瑙嗗浘鏂囨。琚攢姣併?nbsp; CDocument鏋愭瀯鍑芥暟璋冪敤 DisconnectView()
2. 浠庤鍥懼嚭鍙戯紝閫氳繃璋冪敤CView::GetParentFrame() 璁塊棶妗嗘灦錛?br> 3. 閫氱煡瑙嗗浘鏂囨。琚慨鏀廣侀渶瑕佹洿鏂幫紝 UpdateAllViews錛堬級(jí)瀹屾垚榪欎釜鍔熻兘
CDocument::UpdateAllViews()
棣栧厛璋冪敤 GetFirstViewPosition() 鑾峰緱 m_viewlist鐨勭涓涓鍥撅紱
鐒跺悗錛岄亶鍘嗘暣涓鍥鵑摼琛紝闄ゅ彂閫佽呯殑瑙嗗浘澶栬皟鐢?CView::OnUpdate()銆?br>
****///---------------------------------------------
CView 錛圓FXWIN.H錛?br>
CView 緇樺浘
CView::OnPaint()
· 棣栧厛鍒涘緩涓涓狢PaintDC錛屽寘鍚閲嶇敾鐨勫尯鍩燂紝
· 灝嗚繖涓?paint DC 浼犻掔粰 OnPrepareDC()錛屾渶鍚庡皢 paint DC 浼犵粰 OnDraw()銆?br> tag錛氶粯璁ょ殑 OnPrepareDC() 鍜?OnDraw() 瀹炵幇涓嶅仛浠諱綍浜嬶紝
CCmdTarget鍜屾秷鎭槧灝勮〃
-紿楀彛娑堟伅
3涓儴鍒嗭細(xì)1錛変竴涓棤絎﹀彿鏁存暟錛屽寘鍚簡(jiǎn)娑堟伅鐨勫疄闄呭唴瀹癸紱 2錛塛PARAM鈥斺?涓涓?瀛楄妭鐨勫弬鏁幫紱3錛塋PARAM鈥斺?涓涓?瀛楄妭鐨勫弬鏁?br>
MFC娑堟伅鏄犲皠
CCmdTarget綾?br> 娑堟伅鏄犲皠琛ㄦ暟鎹粨鏋勶細(xì)
AFX_MSGMAP_ENTRY錛岃〃紺烘秷鎭槧灝勮〃鐨勫疄闄呭叆鍙o細(xì)
struct AFX_MSGMAP_ENTRY{
UINT nMessage; //琛ㄧずWindows娑堟伅銆?br> UINT nCode; //琛ㄧず鎺т歡浠g爜鎴朩M_NOTIFY浠g爜
UINT nID; //浜х敓娑堟伅鐨勬帶浠禝D
UINT nLastID; //
UINT nSig; //琛ㄧず鐢ㄤ簬澶勭悊娑堟伅鐨勫嚱鏁扮殑絳懼悕錛坰ignature錛?br> AFX_PMSG pfn; //鎸囧悜澶勭悊娑堟伅鐨勫嚱鏁?br> };
typedef void (CCmdTarget::*AFX_PMSG) (void);
struct AFX_MSGMAP{
const AFX_MSGMAP* pBaseMap; //鎸囧悜鍙︿竴涓狝FX_MSGMAP緇撴瀯鐨勬寚閽堬紙鍩虹被鐨勬秷鎭槧灝勮〃錛?br> const AFX_MSGMAP_ENTRY* lpEntries; //
};
娑堟伅鏄犲皠琛ㄥ熀鏈笂灝辨槸AFX_MSGMAP_ENTRY緇撴瀯鏁扮粍銆?br>
娑堟伅鏄犲皠瀹?br> DECLARE_MESSAGE_MAP銆?nbsp; BEGIN_MESSAGE_ MAP 鍜?nbsp; END_MESSAGE_MAP.
鍦ㄧ被瀹氫箟涓嬌鐢―ECLARE_MESSAGE_MAP鎰忓懗鐫鍦ㄧ被涓畾涔変簡(jiǎn)3縐嶄笢瑗匡細(xì)
1錛変竴涓悕涓篲messageEntries 鐨?AFX_MSGMAP_ENTRY 緇撴瀯鏁扮粍錛?nbsp; 錛堥潤(rùn)鎬佹垚鍛橈級(jí)
2錛変竴涓悕涓簃essageMap 鐨?AFX_MSGMAP; 錛堥潤(rùn)鎬佹垚鍛橈級(jí)
3錛変竴涓幏寰楃被鐨勬秷鎭槧灝勮〃鐨勫嚱鏁幫紙GetMessageMap()錛夈?br> #define BEGIN_MESSAGE_MAP(theClass, baseClass) \
PTM_WARNING_DISABLE \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return GetThisMessageMap(); } \
const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
{ \
typedef theClass ThisClass; \
typedef baseClass TheBaseClass; \
static const AFX_MSGMAP_ENTRY _messageEntries[] = \
{
瀹忎駭鐢熶竴涓狦etMessageMap()鍑芥暟錛岃鍑芥暟榪斿洖綾葷殑娑堟伅鏄犲皠琛ㄦ寚閽堛傛鏋剁▼搴忕敤GetMessageMap()鏉ヨ幏寰楃被鐨勬秷鎭槧灝勮〃銆?br> 鐒跺悗瀹忎駭鐢熷~鍏匒FX_MSGMAP緇撴瀯鐨勪唬鐮併傜涓涓煙鎸囧悜鍩虹被鐨勬秷鎭槧灝勮〃錛屽悓鏃跺垱寤轟竴鏉″埌鏍瑰璞$殑閾捐〃銆?br> 絎簩涓煙鏄寚鍚戠被鑷繁鐨勭涓涓秷鎭槧灝勮〃鐨勫叆鍙c?br> 鏈鍚庯紝瀹忎駭鐢熷疄闄呯殑娑堟伅琛紝娑堟伅琛ㄥ疄闄呬笂灝辨槸AFX_MSGMAP_ENTRY緇撴瀯鐨勮〃銆?br> #define END_MESSAGE_MAP() \
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
;
MFC濡備綍浣跨敤娑堟伅鏄犲皠琛?br>
---------------------------------------
Command Routing錛堝懡浠や紶閫掞級(jí)
鈻?鑻ユ槸涓鑸殑 Windows娑堟伅錛圵M_xxx錛夛紝涓瀹氱敱媧劇敓綾繪祦鍚戝熀綾?br> 鈻?鑻ユ槸鍛戒護(hù)娑堟伅 WM_COMMAND
Frame紿楀彛錛?View → Frame紿楀彛鏈韓 → CWinApp瀵硅薄
↓
View錛?nbsp; View鏈韓 → Document
↓
Document錛?nbsp; Document鏈韓→ DocumentTemplate
===========================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?5.瀵硅瘽妗嗗拰鎺т歡綾?br>===========================
CDialog錛?妯℃丮FC瀵硅瘽妗嗐鍜屻闈炴ā鎬丮FC瀵硅瘽妗?br>--------------------------------------------------------------------------
妯℃佸璇濇
浠嶤Dialog媧劇敓涓涓湰鍦板璞★紝璋冪敤 DoModal() 鍒濆鍖栥佸垱寤恒佹樉紺哄茍閿姣佸璇濇
闈炴ā鎬佸璇濇
浠庡爢涓婂埄鐢╪ew 鎿嶄綔絎﹀垱寤猴紝鏄劇ず璋冪敤Create(錛?鎴愬憳鍑芥暟鏉ユ樉紺哄璇濇錛?閿姣?DestroyWindow()
瀵硅瘽妗嗘搷浣?br> NextDlgCtrl() 銆丳revDlgCtrl() 鎴?GotoDlgCtrl() ,閬嶅巻瀵硅瘽妗嗕腑鐨勬帶浠?nbsp;
--------------------------------------------------------------------------
Win32 API
· CreateDialog() 鈥斺?浠庢ā鏉胯祫婧愬垱寤轟竴涓潪妯℃佺殑瀵硅瘽妗嗐?br> · CreateDialogIndirect() 鈥斺?浠庢ā鏉挎寚閽堝垱寤轟竴涓潪妯℃佺殑瀵硅瘽妗嗐?br> · DialogBox() 鈥斺?浠庢ā鏉胯祫婧愬垱寤轟竴涓ā鎬佺殑瀵硅瘽妗嗐?br> · DialogBoxIndirect() 鈥斺?浠庢ā鏉挎寚閽堝垱寤轟竴涓ā鎬佺殑瀵硅瘽妗嗐?br> CDialog鍙姷鐢–reateDialogIndirect()錛岃嚜宸卞疄鐜頒簡(jiǎn)妯℃佸寲銆?br>--------------------------------------------------------------------------
CDialog鐨勪竴浜涙暟鎹垚鍛?br> · m_nIDHelp 鈥斺?鎸夐挳鐨勮緟鍔㊣D錛岀敱妯℃澘ID紜畾
· m_lpszTemplateName 鈥斺?璧勬簮妯℃澘鐨勫悕瀛椼傝嫢鎸囧畾浜?jiǎn)ID錛宮_lpszTemplateName灝辨槸MAKELONG錛?錛孖D錛?
· m_hDialogTemplate 鈥斺?涓鏃﹁杞戒箣鍚庯紝鏄祫婧愭ā鏉垮彞鏌勩?br> · m_lpDialogInit 鈥斺?涓涓寚鍚戠敤鏉ュ垵濮嬪寲瀵硅瘽妗嗙殑鏁版嵁鐨勬寚閽堛傜敤鏉ュ垵濮嬪寲瀵硅瘽妗嗙殑鏁版嵁鏄粠璧勬簮鏂囦歡涓杞界殑錛岄氳繃涓涓祫婧怚D涓庡璇濇鐩歌仈緋匯?br> · m_pParentWnd 鈥斺?涓涓寚鍚戠埗紿楀彛鎴栦富紿楀彛鐨凜Wnd鎸囬拡銆?br> · m_hWndTop 鈥斺?鏈欏跺眰鐨勭埗紿楀彛
· m_pOccDialogInfo 鈥斺?瀛樺偍OLE鎺т歡鎵闇瑕佺殑淇℃伅銆?br>
CDialog鐨勪竴浜涙垚鍛樺嚱鏁?br> · virtual PreTranslateMessage() 鈥斺?涓虹壒孌婃儏鍐佃繃婊ゆ秷鎭紝濡傚伐鍏鋒彁紺哄拰SHIFT-F1鐜甯姪
· virtual OnCmdMsg() 鈥斺?nbsp; 灝嗗懡浠ゆ秷鎭礬鐢辯粰鎵鏈夎呭拰褰撳墠鐨?CWinThread 瀵硅薄銆傚拷鐣ユ帶浠墮氱煡
· virtual CheckAutoCenter() 鈥斺?媯(gè)鏌ョ敤鎴鋒槸鍚﹀凡緇忔寚瀹氫簡(jiǎn)瀵硅瘽妗嗚嚜鍔ㄤ綅浜庝腑蹇?br> · virtual SetOccDialogInfo 鈥斺?鐢ㄤ簬璁劇疆 m_pOccDialogInfo銆?br> · virtual PreInitDialog() 鈥斺?鍦╓M_INITDIALOG(OnInitDialog() )涔嬪墠琚皟鐢ㄣ?br> · PreModal() 鈥斺?閫氳繃鍑嗗灝嗚嚜宸辯矘璐村埌宸插垱寤虹殑瀵硅瘽妗嗙獥鍙d笂錛屼負(fù)DoModal()閫昏緫鍑嗗CDialog
· PostModal 鈥斺?鍦―oModal()閫昏緫涔嬪悗灝咰Dialog鍒嗙銆?br>-------------
CDialog鐨勬瀯閫犲嚱鏁?br> DLGCORE.CPP
DoModal() 銆婃繁鍏ヨВ鏋怣FC銆?P155
澶勭悊瀵瑰崕妗嗙殑鍒涘緩銆佹樉紺哄拰閿姣?br> · 棣栧厛杞藉叆瀵硅瘽妗嗚祫婧愶細(xì) 浠庤祫婧愭枃浠朵腑鏌ユ壘銆佽澆鍏ュ茍閿佸畾瀵硅瘽妗嗘ā鐗堛傛棤娉曞畾浣嶈祫婧愭椂錛岃繑鍥?1.
· 鍑嗗鍒涘緩瀵硅瘽妗嗭細(xì) 鍏堣皟鐢≒reModal() 鏉ユ墽琛屽畨鍏ㄦ鏌ュ茍鏈璇濇鏌ユ壘鎵闇鐨勭埗鍙ユ焺錛岃皟鐢–Wnd::GetSageOwner()鏉ュ畬鎴愯繖浜涳紝騫跺皢緇撴灉瀛樺叆m_hWnd涓?br> 鐒跺悗璋冪敤EnableWindow錛坔WndParent,FALSE錛夋潵璁插璇濇鐨勭埗紿楀彛紱佺敤錛屽己鍒跺疄鐜頒簡(jiǎn)妯℃佸寲銆?br> · 鍒涘緩騫舵樉紺哄璇濇錛?br> 鍏堥氳繃璋冪敤AfxHookWindowCreate() 灝嗕竴涓狹FC瀵硅薄綺樿創(chuàng)鍒板璇濇涓紝
鐒跺悗璋冪敤 CWnd::CreateDlgIndirect()錛岃鍑芥暟浼?xì)鍋氫竴浜涢敊璇鏌ワ紝鐒跺悗璁劇疆瀵硅瘽妗嗗瓧浣擄紝鍐嶇敤 WF_CONTINUEMODAL
瀵?CWnd::m_nFlags鎴愬憳鍋?OR 鎿嶄綔錛岀劧鍚庤皟鐢?::CreateDialogIndirect()錛屽弬鏁版槸瀵硅瘽妗嗘ā鐗堛佺埗紿楀彛鍙ユ焺 鍜?AfxDlgProc()
錛堜綔涓哄璇濇榪囩▼錛夈傝繑鍥濼RUE鎴朏ALSE銆?br> 璋冪敤CWnd::RunModalLoop() 澶勭悊娑堟伅鐩磋嚦鐢ㄦ埛鎸変笅 ”OK“鎴?#8221;Cancel“錛孫nOK() 鍜?OnCancel() 璋冪敤 EndDialog錛堬級(jí)錛孍ndDialog() 璋冪敤
CWnd::EndModalLoop()錛岃繖鏍峰氨緇撴潫浜?jiǎn)loop澶勭悊榪囩▼錛屾帶鍒舵祦杞粰DoModal()銆?br> 璋冪敤 SetWindowPos() 闅愯棌鐩墠宸茬粡姝繪帀鐨勫璇濇錛屽啀璋冪敤 EnableWindow錛坔WndParent,TRUE錛夋潵嬋媧葷埗紿楀彛銆?br> · 鏀跺熬錛?br> 璋冪敤DestroyWindow()鏉ラ攢姣乄indows瀵硅瘽妗嗗璞★紝鐒跺悗璋冪敤PostModal() 灝嗙涓姝ヤ腑綺樿創(chuàng)鍒癢indows瀵硅薄鐨凜++瀵硅薄鍒嗙錛岃緗甿_hWndTop涓篘ULL
CDialog鎺т歡鐨勫垵濮嬪寲
WM_INITDIALOG
WM_INITDIALOG鏄犲皠鍒癈DIalog::HandleInitDialog().HandleInitDialog()鎵цOLE鎺т歡鐨勪竴浜涘垵濮嬪寲錛屼粠鑰岃皟鐢–Dialog::OnInitDialog()銆?br> OnInitDialog()璋冪敤CWnd::ExecuteDlgInit()錛岀敱鍚庤呭畬鎴愭渶緇堝璇濇鐨勫垵濮嬪寲銆?br>
----------------------------------------------------------------------------------------------------------------
DDX/DDV錛?CDialog鏁版嵁浜ゆ崲涓庨獙璇?nbsp; P160
CDataExchange 鎴愬憳鍑芥暟
· 鏋勯犲嚱鏁?鈥斺?浼犲叆涓涓璇濇鎸囬拡鍜?bSaveAndValidate鐨勫垵濮嬪寲璁劇疆銆?br> · PrepareCtrl() 鈥斺?涓篋DX/DDV鍑嗗涓涓潪緙栬緫鎺т歡銆傞氬父榪欎釜鍑芥暟浼?xì)璋冪敤鍐呴儴瀵硅瘽妗嗘寚閽?m_pDlgWnd 鐨?GetDlgItem() 鏂規(guī)硶
· PrepareEditCtrl() 鈥斺?涓篋DX/DDV 鍑嗗涓涓紪杈戞帶浠躲傞鍏堣皟鐢≒repareCtrl(),鐒跺悗灝唌_bEditLastControl璁劇疆涓篢RUE
. Fail() 鈥斺?濡傛灉楠岃瘉澶辮觸灝辮皟鐢ㄨ繖涓嚱鏁般傚皢鐒︾偣璁劇疆鍒板墠涓涓帶浠訛紝騫舵姏鍑篊UserException寮傚父銆?br> · PrepareOleCtrl() 鈥斺?涓篋DX/DDV 鍑嗗涓涓狾LE鎺т歡銆?br>
· m_bSaveAndValidate 鈥斺?鎸囧畾浜?jiǎn)DDX鐨勬柟鍚戯紝浠ュ強(qiáng)鏄惁搴旇鍋?DDV 錛孎ALSE鏃訛紝鏁版嵁浠庢垚鍛樺彉閲忔祦鍒版帶浠躲?br> · m_pDlgWnd 鈥斺?涓涓寚鍚戝璇濇鐨凜Wnd鎸囬拡錛屽畠鍖呭惈浜?jiǎn)闇瑕佷氦鎹㈠拰楠岃瘉鐨勬帶浠躲傝繖涓奸氳繃CDataExchange鏋勯犲嚱鏁頒紶鍏ャ?br> · m_hWndLastControl 鈥斺?璁板綍浜?jiǎn)鍓嶄竴涓帶浠剁殑鍙ユ焺銆?br> · m_bEditLastControl 鈥斺?涓涓狟oolean鍙橀噺錛屾寚瀹氫簡(jiǎn)鍓嶄竴涓帶浠舵槸鍚︽槸緙栬緫鍣ㄣ?br>
DDX_Text()
鈶?鍏堣皟鐢?PrepareEditCtrl() 鎴?PrepareCtrl()銆?br> 鈶?鐒跺悗DDX_Text() 媯(gè)鏌?Boolean 鍙橀噺 m_bSaveAndValidate鐨勫鹼紝
鈶?鑻ユ爣蹇椾負(fù)TRUE錛堟暟鎹粠鎺т歡嫻佸悜鎴愬憳鍙橀噺錛夛紝璋冪敤 Win32API(濡?::GetWindowText()錛夛紝浠庣紪杈戞帶浠惰幏寰楀瓧絎︿覆錛屽皢瀛楃涓叉斁鍦?value"涓?br> 鑻ヤ負(fù)FALSE錛岃皟鐢?AfxSetWindowText錛?錛屼嬌鐢–String鍙傛暟鐨勫唴瀹規(guī)洿鏂扮紪杈戞帶浠躲?br>
DDV_MaxChars()
媯(gè)鏌?CDataExchange::m_bSaveAndValidate 鏍囧織錛岀‘淇濅負(fù) TRUE錛堝嵆鐜板湪姝e湪榪涜楠岃瘉錛夈傜劧鍚庢牴鎹寚瀹氱殑澶у皬媯(gè)鏌ュ瓧絎︿覆鐨勯暱搴︺?br>
------------------------------------------------------------------------------------------------
CWnd::UpdateData()
鈶?#183; 棣栧厛鍒涘緩涓涓狢DataExchange瀹炰緥錛屽皢 this 浣滀負(fù)CDialog鎸囬拡浼犲叆錛屽茍緇х畫浼犲叆bSaveAndValidate 鏍囧織錛圤nDialogInit()璋冪敤鏃朵負(fù)FALSE…錛夈?br> 鈶?#183; UpadteData() 浼?xì)闃诲褰撳墠绾拷E嬶紝浣跨嚎紼嬩笉鑳芥帴鏀舵帶浠剁殑娑堟伅銆?br> 鈶?#183; 鏈湴Boolean鍙橀噺 bOK鐢ㄦ潵瀛樺偍 DDX/DDV 浠g爜鐨勮繑鍥炲箋備竴鏃pdateData() 灝?bOK璁劇疆涓?FALSE錛屽畠浼?xì)璋冪敤浣犵殑CDialog媧劇敓綾葷殑DoDataExchange鏂規(guī)硶錛?br> 鍚屾椂灝咰DataExchange瀹炰緥浣滀負(fù)鍙傛暟浼犲叆銆?bOK琚緗負(fù)TRUE錛?榪欎釜鍊兼渶緇堣繑鍥炵粰 OnUpdate()錛岃〃紺哄綋鍓嶄氦鎹㈠拰楠岃瘉娌℃湁閿欒銆?br> 鈶?#183; 鍑虹幇CUserException寮傚父鏃訛紝璋冪敤榪欏潡浠g爜錛宐OK琚緗負(fù)FALSE錛屾渶緇圲pdateData浼?xì)杩斿?錛?br> 鈶?#183; 濡傛灉DDX/DDV澶勭悊榪囩▼涓病鏈変換浣曞紓甯告姏鍑猴紝浼?xì)鎶ュ憡宸簿l忓彂鐢熺殑涓緋誨垪閿欒錛屼篃鏈夊彲鑳藉鑷磋繑鍥濬ALSE銆?br> 鈶?#183; 閲嶇疆閫氱煡紿楀彛錛屼粠鑰屾寜甯歌鏂規(guī)硶澶勭悊鎺т歡閫氱煡錛屾渶緇堣繑鍥濬ALSE 鎴?TRUE錛堜緷璧栦簬DoDataExchange()鐨勮繑鍥炲?錛夈?/p>
========================================================================
MFC鍏敤瀵硅瘽妗?br> CColorDialog 璁╃敤鎴烽夋嫨涓縐嶉鑹?br> CFileDialog 鐢ㄤ簬鎵撳紑鍜屼繚瀛樻枃浠?br> CFindReplaceDialog 鍏佽鐢ㄦ埛鏌ユ壘鍜屾浛浠i」
CFontDialog 鎻愪緵浜?jiǎn)閫夋嫨瀛椾綋鐨勫璇濇
CPrintDialog 璁╃敤鎴烽夋嫨鎵撳嵃鏈恒侀〉鏁般佹墦鍗版柟鍚?br>
----------------------------------------------------------------------------------
灞炴ч〉
CPropertySheet CPropertyPage
1銆佸垱寤哄涓璇濇妯℃澘錛屼嬌妯℃澘鎻忚堪浣犳兂瑕佺殑灞炴ч〉涓竷緗殑鎺т歡鍜屽竷灞銆?br> 2銆佷負(fù)姣忎釜瀵硅瘽妗嗘ā鏉垮垱寤篊PropertyPage鐨勪竴涓淳鐢熺被錛屽湪綾諱腑澧炲姞鎴愬憳鍙橀噺鏉ュ瓨鍌ㄥ睘鎬ч〉鐨勭姸鎬併?br> 3a銆佸浜庝竴涓ā鎬佺殑灞炴ч〉錛屽彧瑕佸垱寤哄畠鐨凜PropertySheet瀹炰緥錛岀劧鍚庤皟鐢–PropertySheet::AddPage()灝嗗墠涓ゆ鍒涘緩鐨勫崟涓睘鎬ч〉鍔犲叆鍒板睘鎬ч〉涓?br> 鍐嶈皟鐢–Dialog::DoModal()鏉ユ樉紺哄睘鎬ч〉銆?br> 3b銆佸鏋滃垱寤轟竴涓潪妯℃佺殑灞炴ч〉錛屽垯鍒涘緩鐨凜PropertySheet媧劇敓綾婚』澧炲姞涓浜涗笢瑗夸竴杈硅兘澶熷叧闂璇濇錛孧FC涓嶄細(xì)鑷姩澧炲姞OK/Apply/Cancel
鐒跺悗鍒涘緩浣犵殑CPropertySheet媧劇敓綾葷殑涓涓疄渚嬶紝騫惰皟鐢ㄥ畠鐨凜reate()鏉ユ樉紺洪潪妯℃佸睘鎬ч〉銆?br>
浣跨敤灞炴ч〉鍏敤鎺т歡
棣栧厛錛屽~鍐橮ROPSHEETHEADER緇撴瀯鐨勪竴浜涘煙錛岀劧鍚庤皟鐢?::PropertyPage()錛屼互璇ョ粨鏋勪負(fù)鍙傛暟錛岃礋璐e垱寤哄睘鎬ч〉銆?br> 鍒涘緩瀹屾垚鍚庯紝灞炴ч〉鍙戦?WM_NOTIFY 娑堟伅錛?br> · PSN_APPLY 鈥斺?Apply 鎸夐挳琚寜涓?br> · PSN_WIXZBACK 鈥斺?鍦ㄥ悜瀵兼ā寮忎笅錛岀敤鎴鋒寜涓嬩簡(jiǎn) Previous 鎸夐挳
· PSN_WIZNEXT 鈥斺?鍦ㄥ悜瀵兼ā寮忎笅錛岀敤鎴鋒寜涓嬩簡(jiǎn) Next 鎸夐挳
· PSN_WIZFINISH 鈥斺?鍦ㄥ悜瀵兼ā寮忎笅錛岀敤鎴鋒寜涓嬩簡(jiǎn) Finish 鎸夐挳
鑻ユ兂鍝嶅簲鍒氭彁鍒扮殑閫氱煡錛屽彲鎯沖睘鎬ч〉鎺т歡鍙戦佹秷鎭?br> · PSM_SETTILTLE 鈥斺?璁劇疆灞炴ч〉鐨勬爣棰?br> · PSM_ADDPAGE 鈥斺?鍦ㄥ睘鎬ч〉涓鍔犱竴涓崟欏點(diǎn)傛秷鎭殑 lParam鍙傛暟鏄竴涓寚鍚戝凡鍒涘緩鐨勫睘鎬у崟欏碉紙鐢盋reatePropertySheetPage()鍒涘緩錛夌殑鍙ユ焺
· PSM_REMOVEPAGE 鈥斺?鍦ㄥ睘鎬ч〉涓垹闄や竴涓睘鎬у崟欏點(diǎn)?br>
CPropertySheet 鍐呭箷
· CommonConstruct() 鈥斺?涓嶅悓鐨凜PropertySheet鏋勯犲嚱鏁版帴鍙楃殑鍙傛暟浼犻掔粰 CommonConstruct()銆?棣栧厛璁劇疆浜?jiǎn)m_psh鎵鎸囧悜鐨?PSH_PROPSHEETPAGE
緇撴瀯鐨?dwFlags 鍩燂紝鐒跺悗鍒濆鍖栦簡(jiǎn) m_psh 鎵鎸囧悜緇撴瀯鐨勫嚑涓叾浠栧煙銆?騫跺皢 m_bStacked 璁劇疆涓篢RUE錛宮_bModeless璁句負(fù)FALSE銆?br> · EnableStackedTabs() 鈥斺?灝咰PropertySheet璁劇疆涓?#8220;stacked”妯″紡鑰屼笉鏄?#8220;scrolled”妯″紡銆傚彧淇敼浜?m_bStacked 鎴愬憳鍙橀噺銆?br> · BuildPropPageArray() 鈥斺?璐熻矗灝?m_pages 鏁扮粍杞寲鎴?PROPSHEETPAGE 緇撴瀯銆?br> · OnInitDialog() 鈥斺?nbsp; 1銆佽嫢涓嶆槸鍑轟簬 鍚戝 妯″紡錛屽皢鏁翠釜灞炴ч〉浼犻掑嚭鍘伙紝浠ュ厤鎺т歡緇戝湪涓璧楓?br> 2銆佹牴鎹?m_bStacked 鐨勫間慨鏀規(guī)爣絳劇殑椋庢牸銆傞氳繃璋冪敤 EnableStackedTabs() 瀹屾垚銆?br> 3銆佽嫢灞炴ч〉涓洪潪妯℃侊紝涔熶笉澶勪簬 鍚戝 鐘舵侊紝OnInitDialog()灝卞垹闄ゆ爣鍑嗘寜閽?br> 4銆佽皟鐢?CWnd::CenterWindow()錛屾槸灞炴ч〉鍑轟簬紿楀彛姝d腑澶?br> · m_pages 鈥斺?涓涓寚閽堟暟緇勶紝鏄?CPtrArray 鐨勫疄渚嬶紝淇濆瓨浜?jiǎn)鎸囧悜灞炴ч〉鐨勬墍鏈?CPropertyPage 綾葷殑鎸囬拡銆?br> · m_strCaption 鈥斺?灞炴ч〉鐨勮鏄?br> · m_pParentWnd 鈥斺?鎸囧悜鐖剁獥鍙g殑鎸囬拡
· m_bStacked 鈥斺?涓涓狟oolean 鍙橀噺錛岃褰曚簡(jiǎn)鐢ㄦ埛鎸囧畾鐨勬爣絳鵑鏍兼槸“stacked”榪樻槸“scrolled”銆?br> · m_bModeless 鈥斺?涓涓狟oolean鍙橀噺錛?璁板綍鐢ㄦ埛甯屾湜灞炴ч〉鏄ā鎬佽繕鏄潪妯℃併?br>
CPropertySheet::DoModal() (DLGPROP.CPP)
棣栧厛錛岃皟鐢?AfxDeferRegisterClass()錛屽鑷碝FC璋冪敤 InitCommonControls()鍑芥暟錛岃鍑芥暟鍒濆鍖栦簡(jiǎn)Windows 閫氱敤鎺т歡 DLL銆?br> 鐒跺悗璋冪敤 BuildPropPageArray(),
鐒跺悗紱佺敤涓葷獥鍙o紝寮哄埗瀹炵幇妯℃佸寲錛岃皟鐢?::PropertySheet() 鏉ュ垱寤哄茍鏄劇ず鍏敤灞炴ч〉鎺т歡銆?br> 鍐嶈皟鐢?CWnd::RunModalLoop() 鍦ㄦā鎬佸寲紿楀彛涓鐞嗘秷鎭車銆傚畬鎴愬悗錛岄攢姣佺獥鍙o紝嬋媧葷埗紿楀彛錛岀劧鍚庤繑鍥?RunModalLoop() 鐨勮繑鍥炲箋?br> tag: 鐩村埌 DoModal()錛堝浜庢ā鎬佸睘鎬ч〉錛夋垨Create() (瀵逛簬闈炴ā鎬佸睘鎬ч〉錛夎璋冪敤錛岀被閮戒笉鑳芥槧灝勫埌涓涓猈indows紿楀彛鍙ユ焺銆?br> 鍦?:PropertySheet() 琚皟鐢ㄥ悗錛學(xué)indows紿楀彛鍙ユ焺鎵嶈鍒涘緩錛屽茍鍜?MFC CPropertySheet 瀵硅薄緇戝畾鍦ㄤ竴璧楓?br>
CPropertySheet::AddPage()
棣栧厛錛屽湪鍐呴儴鍙橀噺 m_pages錛堝睘鎬у崟欏墊寚閽堟暟緇勶級(jí)涓繚鎸佷簡(jiǎn)CPropertyPage鎸囬拡銆?br> 媯(gè)鏌?m_hWnd闈炵┖鍚庯紝璋冪敤 ::CreatePropertySheetPage()錛屽茍鍙戦?PSM_ADDPAGE 娑堟伅緇欏睘鎬ч〉鎺т歡錛屼粠鑰岃瀹冨皢鍒涘緩鐨勫睘鎬у崟欏靛姞鍏ャ?br>
CPropertySheet::BuildPropPageArray()
棣栧厛錛屽垹闄や簡(jiǎn) m_psh.ppsp 鍩熸墍鎸囧悜鐨勬暟緇勶紝騫跺皢瀹冭緗負(fù)NULL錛屼負(fù)鏂版暟緇勪繚鐣欐帶浠訛紝鏂扮殑鏁扮粍鏉ヨ嚜鍐呴儴 CPtrArray 鏁扮粍 m_pages銆?br> 鐒跺悗錛屼負(fù)鏈湴鍙橀噺 ppsp鍒嗛厤浜?jiǎn)涓涓柊鏁扮粍錛堟暟緇勫熀綾誨瀷鏄?PROPSHEETPAGES錛夛紝騫跺皢 m_psh.ppsp 鎸囧悜鍚屼竴鍧楀唴瀛樸?br> 閬嶅巻 m_pages鏁扮粍涓殑鎵鏈?CPropertyPage銆傚浜庢瘡涓錛屽畠?yōu)畣CPropertyPage 鐨勫唴閮?PROPSHEETPAGE 緇撴瀯鎷瘋礉鍒?PROPSHEETHEADER 鏁扮粍
ppsp涓傛嫹璐濈粨鏉熷悗錛岃皟鐢╛ChangePropPageFont() 鏉ヤ慨鏀規(guī)墍鏈夋帶浠剁殑瀛椾綋錛屽弬鏁版槸涓涓寚鍚戝璇濇妯$増鐨勬寚閽堬紝榪欐牱鎺т歡鍜屽睘鎬ч〉浣跨敤鐩稿悓鐨勫瓧浣撱?br> 鎵鏈夐〉閮芥斁鍏ヤ簡(jiǎn) m_psh.ppsp錛屽氨鏇存柊 m_psh.nPages 榪欎釜鍗曢〉璁℃暟錛屼互渚垮拰 m_pages 鐨勫ぇ灝忕浉鍖歸厤銆?br>
CProperSheet 閫氱煡
CPropertySheet 灝嗗嚑涓睘鎬ч〉鎺т歡閫氱煡鏄犲皠涓哄彲瑕嗙洊鐨勫洖璋冨嚱鏁?/p>
================================================================
MFC鎺т歡綾?br>
· AFXWIN2.INL 鈥斺?鎵鏈夋帶浠剁被鐨勫唴宓屽嚱鏁?br> · WINCTRL1.CPP 鈥斺?CStatic 銆?CButton 銆?CListBox 銆丆ComboBox銆丆Edit鍜?CScrollBar
· WINCTRL2.CPP 鈥斺?CDragListBox銆?br> · WINCTRL3.CPP 鈥斺?CCheckListBox
· WINBTN.CPP 鈥斺?CBitmapButton
===========================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?4. CObject
===========================
榪愯鏃剁被鐨勪俊鎭?br>
CObject鐨凴TCI錛坮un-time class information錛岃繍琛屾椂綾葷殑淇℃伅錛夌壒鎬т嬌寮鍙戜漢鍛樺湪榪愯鏃跺彲浠ョ‘瀹氬叧浜庣被鐨勪俊鎭?br> DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC
DECLARE_DYNCREATE / IMPLEMENT_DYNCREATE
DECLARE_SERIAL / IMPLEMENT_SERIAL
灝嗚繖浜涘畯鍔犲叆鍒癈Object鐨勬淳鐢熺被涓紝灝卞彲浠ヨ皟鐢↖sKindOf()鏉ユ祴璇曡繖涓被鐨勭被鍨嬶紝IsKindOf鏈変竴涓弬鏁幫紝璇ュ弬鏁版湁鍙︿竴涓畯RUNTIME_CLASS鍒涘緩銆?br>--------------------------------------------------------------------------
RTCI濡備綍榪愪綔 銆婃繁鍏ヨВ鏋怣FC銆?P114
#define _DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \ //鍒涘緩涓涓潤(rùn)鎬佹垚鍛樺彉閲?br> virtual CRuntimeClass* GetRuntimeClass() const; \ //榪斿洖姝g‘鐨勮繍琛屾椂綾諱俊鎭?br> “##”鍛婅瘔棰勫鐞嗗櫒灝嗘搷浣滅鍙充晶鐨勯儴鍒嗗拰宸︿晶鐨勯儴鍒嗚繛鎺ュ湪涓璧楓?br>
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)
#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject, &_init_##class_name) \
AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; }
"#"瀛楃涓插寲鐨勫畯錛屽皢鍙充晶鐨勯儴鍒嗚漿鍖栨垚鐢ㄥ紩鍙峰寘鎷殑瀛楃涓層?br> 1. 鍒濆鍖栦簡(jiǎn)闈?rùn)鎬丆RuntimeClass鏁版嵁鎴愬憳鍙橀噺 class##class_name
2. 鍒涘緩浜?jiǎn)涓涓潤(rùn)鎬丄FX_CLASSINIT緇撴瀯銆?br> struct AFX_CLASSINIT{ AFX_CLASSINIT ( CRuntimeClass* pNewClass ); };
3. IMPLEMENT_DYNAMIC瀹忎細(xì)鐢熸垚榪欎釜瑕嗙洊鎴愬憳鍑芥暟GetRuntimeClass()銆?br> GetRuntimeClass90浼?xì)杩斿洖闈?rùn)鎬丆RuntimeClass鎴愬憳鍙橀噺class##class_name鐨勫湴鍧
--------------------------------------------------------------------------
CRuntimeClass綾?br>
· LPCSTR m_lpszClassName 鈥斺?綾葷殑鍚嶅瓧銆傚湪搴忓垪鍖栬繃紼嬩腑錛屼綔涓虹被鐘舵佺殑涓閮ㄥ垎琚啓鍏ヨ鍑恒?br> · UINT m_wSchema 鈥斺?涔熸槸绱殑涓涓姸鎬併?nbsp; 緇欏嚭綾葷殑鐗堟湰淇℃伅
· void Store( CArchive& ar) const 鈥斺?CArchive::WriteClass()璋冪敤榪欎釜鍑芥暟鏉ュ啓鍑哄叧浜庣被鐨凜RuntimeClass緇撴瀯淇℃伅
· static CRuntimeClass* Load ( CArchive& ar, UINT* pwSchemaNum); 鈥斺?CArchive::ReadClass() 璋冪敤Load()鏉ヨ鍏ョ敱Store()鍐欏叆鐨凜RuntimeClass淇℃伅銆?br> · int m_nObjectSize;
· CRuntimeClass* m_pNextClass; 鈥斺旂淮鎶や竴涓凡鍒涘緩鐨勫璞$殑綆鍗曢摼琛?br> · m_pBaseClass 鈥斺?淇濆瓨涓涓寚鍚戝熀綾葷殑CRuntimeClass緇撴瀯鐨勬寚閽堛侷sKindOf鍜孖sDerivedFrom()鐢ㄥ畠鏉ョ‘瀹氬璞$殑“澶氭佺被鍨?.
· m_pfnCreateObject 鈥斺?鐢ㄤ簬鍔ㄦ佸垱寤恒侱ECLARE/IMPLEMENT_DYNCREATE 瀹忎細(xì)灝嗚繖涓垚鍛樺嚱鏁扮殑鎸囬拡鎸囧悜CMyClass::CreateObject()鎴愬憳鍑芥暟銆?br> 璋冪敤CRuntimeClass::CreateObject()鏃訛紝瀹冧細(xì)閫氳繃m_pfnCreateObject璋冪敤CMyClass::CreateObject()鏉ヨ繑鍥炰竴涓柊鐨凜MyClass銆?br> --------------------------------------
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)
RUNTIME_CLASS瀹忚緣榪斿洖闈?rùn)鎬丆RuntimeClass鎴愬憳鏁版嵁錛孌ECLARE_DYNAMIC浼?xì)灏咰RuntimeClass鎴愬憳鍙橀噺鏀劇疆鍦ㄤ綘鐨勭被涓紙綾諱技浜嶨etRuntimeClass()錛?br> --------------------------------------------------------------------------
鍔ㄦ佸垱寤?br>
鍦–Object媧劇敓綾諱腑澧炲姞瀵瑰姩鎬佸垱寤虹殑鏀寔錛岃浣跨敤DECLARE_DYNCREATE 鍜?IMPLEMENT_DYNCREATE 瀹忥紝榪欎簺瀹忓湪DECLARE_DYNAMIC 瀹忓拰
IMPLEMENT_DYNAMIC 瀹忕殑鍩虹涓婂垱寤猴紝涓嶇敤鍦ㄧ被涓悓鏃朵嬌鐢ㄨ繖涓ょ瀹忋?br> 鍔犲叆榪欎簺瀹忓悗錛岃皟鐢–RuntimeClass 鐨勬垚鍛樺嚱鏁?CreateObject() 鍒涘緩瀵硅薄
CRuntimeClass::CreateObject()
棣栧厛榪涜媯(gè)鏌ワ紝紜畾鐢ㄦ埛鏄惁鎸囧畾浜?jiǎn)姝<嫯鐨勫畯锛岀劧鍚庤皟鐢?CRuntimeClass::m_pfnCreateObject 鎴愬憳鍙橀噺鎸囧悜鐨勫嚱鏁?br> --------------------------------------------------------------------------
MFC涓殑鎸佺畫鎬э紙serialization錛?nbsp; 銆婃繁鍏ヨВ鏋怣FC銆?P119
鎸佺畫鎬ф寚瀛樺偍瀵硅薄錛屽茍鍦ㄤ箣鍚庣殑鏌愪釜鏃跺埢鎭㈠瀵硅薄鐨勮兘鍔涖?br> CArchive
· m_nMode 鈥斺?鍒惰浜?jiǎn)鏂囨。鏄惁鍦ㄨd拰鍐欍傝繕鍙互鐢ㄥ畠鍦ㄥ垹闄ょ殑鏃跺欏叧闂埛鏂?br> · IsLoading()銆両sStoring()銆両sByteSwapping() 鍜?IsBufferEmpty() 鈥斺?鐢ㄦ潵紜畾CArchive瀵硅薄鐨勭姸鎬?br> · 鎿嶄綔絎?鈥斺?CArchive涓?CObject媧劇敓綾匯乄indows鏁版嵁綾誨瀷鍜孋++綾誨瀷瀹氫箟浜?jiǎn)鎻掑叆鍜屾彁鍙栨搷浣溄W︺?br> · Map鎴愬憳 鈥斺?榪涜鍐欐搷浣滄椂錛孋Archive緇存姢浜?jiǎn)涓涓槧灝勮〃錛屼互渚胯兘榪呴熻闂埌綾諱技瀵硅薄鐨勭被淇℃伅銆傝繕鍒╃敤榪欎釜鏄犲皠琛ㄦ潵紜繚瀵逛竴涓壒瀹氱殑綾誨彧鍐欎竴嬈?br> CRuntimeClass淇℃伅錛岀劧鍚庡湪搴忓垪鍖栨祦涓紩鐢ㄨ繖涓俊鎭傝鎿嶄綔鏃訛紝CArchive浼?xì)缁存姢宸簿l忓垱寤虹殑瀵硅薄鐨勬暟緇勶紝騫跺湪鏁扮粍涓瓨鍌ㄩ偅浜涘凡緇忚鍑虹殑
CRuntimeClass緇撴瀯淇℃伅銆傝繖鏍鳳紝姣忓綋CArchive鏌ユ壘涓涓啓鍏ュ埌搴忓垪鍖栨祦鐨勫紩鐢ㄦ椂錛岄兘鍙互鏌ユ壘璇ユ暟緇勩?br> · 綾繪垚鍛樺嚱鏁?鈥斺?WriteClass()銆丷eadClass() 鍜?SerializeClass()絳夋垚鍛樺嚱鏁扮敤鏉ュ簭鍒楀寲CRuntimeClass緇撴瀯淇℃伅銆?br>
CArchive 鎿嶄綔絎﹀疄鐜?br> _AFX_INLINE CArchive& CArchive::operator<<(WORD w){
if ( m_lpBufCur + sizeof( WORD 錛?> m_lpBufMax )
Flush();
*(WORD* ) m_lpBufCur = w;
m_lpBufCur += sizeof(WORD);
return *this;
}
_AFX_INLINE CArchive& CArchive::operator>>(WORD& w){
if( m_lpBufCur + sizeof( WORD ) > m_lpBufMax)
FillBuffer( sizeof(WORD) - (UINT) ( m_lpBufMax - m_lpBufCur) );
w = *( WORD* ) m_lpBufCur;
m_lpBufCur += sizeof( WORD);
return *this;
}
鐢ㄦ埛閫夋嫨鏂囨。瑕佸啓鍏ョ殑鏂囦歡鐨勫悕瀛楋細(xì)
CDocument::OnSaveDocument() //浠ュ瓨鍌ㄦā寮忓垱寤轟簡(jiǎn)涓涓狢Archive瀵硅薄錛岀劧鍚庡皢瀹冭創(chuàng)鍒扮敱瀵硅瘽妗嗭紙pFile錛夋墦寮鐨勬枃浠跺悗闈€傜劧鍚庯紝OnSaveDocument() 璋冪敤鏂?nbsp; [doccore.cpp] 妗g殑Serialize() 鏂規(guī)硶錛屾渶鍚庡叧闂枃妗?br> CArchive::CArchive() //2-5錛屾鏌ユ枃妗f槸鍚︽槸閫氳繃IsStoring() 鏂規(guī)硶淇濆瓨錛屼負(fù)鍐欐搷浣滆皟鐢ㄦ彃鍏ョ鎿嶄綔
CMyDocument::Serialize() //
CArchive::IsStoring()
operator<<(CArchive&, CObject* )
CArchive::WriteObject() //6-8錛?鎻掑叆鎿嶄綔絎﹁皟鐢–Archive::WriteObject() 鍑芥暟錛?br> CArchive::WriteClass() //璇ュ嚱鏁板張璋冪敤WriteClass()
CMyClass::Serialize() //錛岀劧鍚庡簭鍒楀寲CMyDocument瀵硅薄
CArchive::IsStoring()
CArchive::operator<<(WORD)
CArchive::operator<<(DWORD)
operator<<(CArchive& , point)
CArchive::Write()
CArchive::Close()
瀵瑰悓涓瀵硅薄璇繪搷浣滐細(xì)
CDocument::OnOpenDocument()
[doccore.cpp]
CArchive::CArchive()
CMyDocument::Serialize() //
CArchive::IsStoring() (FALSE)
operator >> (CArchive&, CMyClass* )
CArchive::ReadObject()
CMyClass::Serialize()
CArchive::IsStoring()
CArchive::operator>>(WORD)
CArchive::operator>>(DWORD)
operator>>(CArchive& , point)
CArchive::Read()
CArchive::Close()
鑻ユ暟鎹ぇ浜?6KB錛孲etLoadParams() 鍜孲etStoreParams() 鍙府鍔╂彁楂樺簭鍒楀寲鎬ц兘銆?br>
Serializable蹇呰鏉′歡 銆婃繁鍏ユ祬鍑篗FC銆婸394
1銆丏ECLARE_SERIAL 銆両MPLEMENT_SERIAL銆?br> 2銆佹淳鐢熻嚜 CObject錛屾敼鍐?Serialize铏氬嚱鏁?br> 3銆佸姞涓婁竴涓猟efault鏋勯犲嚱鏁?br>
--------------------------------------------------------------------------
CObject瀵硅瘖鏂殑鏀寔
TRACE瀹?br> 綾諱技浜巔rintf鐨勮緭鍑恒?br> 錛堣皟鐢ㄤ簡(jiǎn)鍏ㄥ眬鍑芥暟::AfxTrace()錛圖UMPOUT.CPP)錛夈婃繁鍏ヨВ鏋怣FC銆婸133-136
瀵硅薄杞偍
Dump() 鍑芥暟錛岃皟鐢ㄦ墦鍗扮被鐨勭姸鎬併?br> 錛圤BJCORE.CPP錛孋Object::Dump() 鍙槸杞嚭浜?jiǎn)绫诲悕锛堝瓨鍌ㄥ湪CRuntimeClass綾諱腑錛夊拰this鎸囬拡鐨勫湴鍧錛?br>
榪愯鏃舵鏌?nbsp;
鏂█
ASSERT瀹?br> AFX.H
#define ASSERT(f)\
do\
{\
if(!(f)&AfxAssertFailedLine(THIS_FILE, __LINE__))\
AfxDebugBreak();\
}while(0)\
瀵硅薄鍚堟硶鎬ф鏌?br> AssertValid() (CBJCORE.CPP){ASSERT(this!=NULL);}
#define ASSERT_VALID(pOb) (::AfxAssertValidObject(pOb, THIS_FILE, __LINE__)
鍐呭瓨璇婃柇
媯(gè)嫻嬪唴瀛樻硠闇?br> 浣跨敤CMemoryState 綾葷殑 Checkpoint()灝嗚媯(gè)嫻嬬殑鍖哄煙鍖呰璧鋒潵錛屾潵媯(gè)嫻嬪唴瀛樻硠闇茬殑鐘跺喌銆?br> 鐒跺悗浣跨敤Difference()鏉ユ瘮杈冧袱涓柇鐐癸紝鏌ョ湅涓や釜璋冪敤Checkpoint()涔嬮棿涔嬮棿鏄惁鏈夋硠婕忋?br>
CMemoryState璁板綍鐨勬瘡涓凡鍒嗛厤鐨勫唴瀛樺潡鏄互涓嬪嚑涓箣涓
· freeBlock 鈥斺?鐢變簬浣跨敤 delayFreeMemDF 鑰屽鑷撮噴鏀捐寤惰繜鐨勫潡
· objectBlock 鈥斺?淇濈暀鐨勬垨鑰呭凡緇忔硠婕忕殑 CObject 瀵硅薄鐨勬暟閲忋?br> · bitBlock 鈥斺?宸插垎閰嶅唴瀛樼殑闈?CObject 瀵硅薄鐨勪釜鏁般?br> · crtBlock 鈥斺?宸插垎閰嶇殑 C 榪愯鏃跺潡鐨勪釜鏁般?br> · ignoredBlock 鈥斺?MFC媯(gè)鏌ユ墍蹇界暐鐨勫潡鐨勪釜鏁般?br> CMemoryState灝嗗垎閰嶇殑嬈℃暟淇濆瓨鍦╩_lCounts鏁扮粍涓紝宸插垎閰嶇殑鍚勭綾誨瀷鐨勫ぇ灝忓瓨鏀懼湪m_lSizes鎴愬憳鏁扮粍涓?br> m_lHighWaterCount 鎴愬憳鍑芥暟瀛樺偍浜?jiǎn)鏈澶у垎閰嶆暟錛?br> m_lTotalCount 璁板綍浜?jiǎn)鍒嗛厤鐨勬繪鏁般?br> m_memState 鍜?m_pBlockHeader 鎴愬憳鍙橀噺閮芥寚鍚戜簡(jiǎn)涓涓唴瀛樺潡閾捐〃鐨勫ご鑺傜偣銆?br> 銆婃繁鍏ヨВ鏋怣FC銆婸140-143
媯(gè)嫻嬫渶澶у唴瀛樹嬌鐢?br> 閫氳繃鍦╝fxMemDF鍏ㄥ眬鍙橀噺涓儜瀹舵寜浣嶆垨錛圤R錛夌殑鏋氫婦鍊糳elayFreeMemDF錛屽彲浠ュ仠姝嬌鐢ㄥ唴瀛橀噴鏀懼嚱鏁般?br> 濡?afxMemDF |= delayFreeMemDF; 緇熻紼嬪簭浣跨敤浜?jiǎn)澶氬ぇ鍐呭瓨銆?br> 媯(gè)鏌ュ唴瀛?br> 鑻ユ兂媯(gè)嫻嬫墍鏈夌殑鍐呭瓨鍒嗛厤鎯呭喌鍜岄噴鏀炬儏鍐碉紝鍙涓巆heckAlwaysMemDF鐨勫艱繘琛屾垨鎿嶄綔銆?br> 濡?afxMemDF |= checkAlwaysMemDF.
妗嗘灦灝變細(xì)鍦ㄥ垎閰嶅拰閲婃斁鍐呭瓨鏄嫻嬪唴瀛樸?br> 鍐呭瓨緇熻
DumpStatistics()
杞偍鎵鏈夊璞?br> DumpAllObjectsSince()錛岃漿鍌ㄦ墍鏈夋硠闇插璞$殑琛屻佸湴鍧銆佸ぇ灝忋?/p>
AFX杈呭姪鍑芥暟
AfxDoForAllObjects() 鍜?AfxDoForAllClasses()
AfxDoForAllObjects()
涓や釜鍙傛暟錛屼竴涓焊綆變竴涓嚱鏁扮殑鎸囬拡錛屽彟涓涓槸void* 鎸囬拡銆?br> 閬嶅巻鍐呭瓨瀵硅薄閾捐〃錛屽皢浠栦滑浣滀負(fù)CObject鎸囬拡浼犻掔粰鐢ㄦ埛鎻愪緵鐨勫嚱鏁?br>
AfxDoForAllClasses()
鍙亶鍘咰RuntimeClass緇撴瀯
鐢?e, %E鍜?%f,綺懼害淇グ絎﹁浣犳寚瀹氭兂瑕佺殑灝忔暟浣嶆暟. 渚嬪,
%12.6f
灝嗕細(xì)鑷沖皯鏄劇ず12浣嶆暟瀛?騫跺甫鏈?浣嶅皬鏁扮殑嫻偣鏁?
鐢?g鍜?%G, 綺懼害淇グ絎﹀喅瀹氭樉紺虹殑鏈夋晥鏁扮殑浣嶆暟鏈澶у?
鐢?s,綺懼害淇グ絎︾畝鍗曠殑琛ㄧず涓涓渶澶х殑鏈澶ч暱搴? 浠ヨˉ鍏呭彞鐐瑰墠鐨勬渶灝忓瓧孌甸暱搴?
涓浜涚畝鍗曠被錛?br> 鍊肩殑綾誨瀷 緇撴瀯 婧愭枃浠?br> CPoint POINT(struct tagPoint) afxwin1.inl
CRect RECT(struct tagRECT) afxwin1.inl, wingdix.cpp
CSize SIZE(struct tagSIZE) afxwin1.inl
CTime time_t operations afx.inl, timecore.cpp
CTimeSpan time_t math afx.inl, timecore.cpp
MFC闆嗗悎綾?br> 鏁扮粍array銆?閾捐〃list 銆?鏄犲皠琛╩ap
C*Array *= Byte /DWord /Uint(unsigned int) /Ob(CObject) /String /Word
C*List *= Ob(OCObject* ) /Ptr(void*) / String
CMap* *=PtrToPtr /StringToOb /StringToPtr /StringToString /WordToOb /WordToPtr
CFile瀹舵棌錛?MFC瀵規(guī)枃浠剁殑璁塊棶
CFile
· AfxFullPath 鈥斺?灝嗕竴涓枃浠惰礬寰勮漿鍖栨垚緇濆璺緞銆?br> · AfxGetRoot 鈥斺?瑙f瀽涓涓猆NC(Uniform Nameing Convention)璺緞鎴栦竴涓棫寮忚礬寰勶紝寰楀埌鍗鋒爣鍚嶃?br> · AfxComparePath 鈥斺?姣旇緝涓や釜璺緞鏄惁涓鏍楓?br> · AfxGetFileTitle 鈥斺?浠庤礬寰勪腑瑙f瀽鍑烘枃浠跺悕銆?br>
CStdio File 錛堟敮鎸佹枃浠剁紦鍐詫級(jí)
ReadString() WriteString()
CMemFile
CException
· CArchiveException 鈥斺?搴忓垪鍖栧紓甯搞?br> · CDaoException 鈥斺?DAO(鏁版嵁璁塊棶瀵硅薄錛夊紓甯搞?br> · CDBException 鈥斺?鏁版嵁搴撳紓甯?br> · CFileException 鈥斺?鏂囦歡寮傚父
· CMemoryException 鈥斺?鍐呭瓨寮傚父
· CNotSupportedException 鈥斺?鏌愪簺鍐呭涓嶆敮鎸?br> · COleDispatchException 鈥斺?OLE鍒嗗彂錛堣嚜鍔ㄥ寲錛夊紓甯?br> · COleException 鈥斺?OLE寮傚父
· CResourceException 鈥斺?Windows璧勬簮闂
· CUserException 鈥斺?鐢ㄦ埛浜х敓鐨勫紓甯?br> GetErrorMessage() 榪斿洖涓涓紦鍐插尯錛岀紦鍐插尯鍐呭瓨瀛樻斁鐫鎻忚堪寮傚父鐨勫瓧絎︿覆錛?br> ReportError() 鐢ㄤ竴涓猈indows娑堟伅妗嗘樉紺哄紓甯鎬俊鎭瓧絎︿覆
===========================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?2. MFC鍩虹
===========================
鍩烘湰鐨凪FC搴旂敤紼嬪簭緇勪歡錛?br> CWinApp錛氬簲鐢ㄧ▼搴忓璞?br> · 淇濆瓨浜?jiǎn)涓浜涗紶閫掔粰WinMain()鐨勫懡浠よ鍙傛暟錛屽寘鎷綋鍓嶅疄渚嬬殑鍙ユ焺錛坢_hInstance錛夈佸墠涓涓疄渚嬬殑鍙ユ焺錛坢_hPrevInstance錛夈佸懡浠よ鍙傛暟錛坢_lpCmdLine錛変互鍙?qiáng)鏄窘C虹獥鍙f爣蹇楋紙m_nCmdShow錛夈?br> · CWinApp鍦╩_pszAppName涓繚瀛樹簡(jiǎn)搴旂敤紼嬪簭鍚嶅瓧鐨勬嫹璐濄?br> · m_pszExeName(鎸囧悜鍙墽琛屾枃浠跺悕瀛楃殑鎸囬拡)銆乵_pszHelpFilePath(鎸囧悜搴旂敤紼嬪簭甯姪鏂囦歡璺緞鐨勬寚閽?銆佷互鍙?qiáng)鎸囧悜搴旂敤绋嬪簭閰嵕|枃浠訛紙profile錛夊悕瀛楃殑鎸囬拡
· CCommandLineInfo緇撴瀯鐢ㄦ潵淇濆瓨鍛戒護(hù)琛屽弬鏁?br> · MFC涓紝瀹炰緥鐨勫垵濮嬪寲鏈塁WinApp::InitInstance()瀹屾垚銆?br> · 鍏抽棴紼嬪簭鍜屾竻闄よ祫婧愮敱ExitInstance()瀹屾垚銆?br> · 璋冪敤CWinApp::Run()浼?xì)鍚姩鏍囧噯鐨凣etMessage()...DispatchMessage()寰幆
· 姣忓綋娑堟伅闃熷垪涓虹┖鏃訛紝CWinApp::Run()浼?xì)璋冪敤OnIdle()銆?br>
CWnd錛氱獥鍙e熀綾?br> 鍖呰Windows API
m_hWnd鎴愬憳鍙橀噺琛ㄧずAPI綰х殑紿楀彛鍙ユ焺錛圚WND錛夈?br>
灝嗙獥鍙e彞鏌勮漿鍖栨垚紿楀彛瀵硅薄
CHandleMap錛氭病鏈夋枃妗h鏄庣殑紿楀彛鍙ユ焺鏄犲皠琛ㄧ被
灝嗙獥鍙e彞鏌勬槧灝勬垚MFC鐨刉indows瀵硅薄銆?br> CMapPtrToPtr m_permanentMap: 琛ㄧず姘鎬箙鏄犲皠琛紝淇濆瓨紼嬪簭榪愯榪囩▼涓彞鏌?瀵硅薄鏄犲皠琛ㄣ?br> 姣忓綋鍒涘緩涓涓狢Wnd鐨勬淳鐢熺被錛孧FC閮戒細(xì)鍐嶆案涔呯洰褰曚笅鎻掑叆涓鏉℃槧灝勮褰曘傝皟鐢–Wnd::OnNcDestroy()鏃跺氨浼?xì)浠庢版箙鐩綍涓嬪垹闄や竴鏉℃槧灝勮褰曘?br> CMapPtrToPtr m_temporaryMap:琛ㄧず涓存椂鏄犲皠琛紝浠呭湪娑堟伅瀛樺湪鐨勮繃紼嬩腑瀛樺湪銆?br> 闄Wnd媧劇敓瀵硅薄涓嶩WND涔嬮棿鐨勬槧灝勫錛岃繕鏈?涓粠MFC綾誨埌鏈湴紿楀彛鍙ユ焺鐨勬槧灝勩?br> AFX_MODULE_THREAD_STATE緇撴瀯
· m_pmapHWND: 紿楀彛鍙ユ焺涓嶤Wnd瀵硅薄涔嬮棿鐨勬槧灝勮〃
· m_pmapHMENU: 鑿滃崟鍙ユ焺鍒癈Menu瀵硅薄鐨勬槧灝勮〃銆?br> · m_pmapHDC: 璁懼鐜鍙ユ焺鍒癈DC瀵硅薄鐨勬槧灝勮〃銆?br> · m_pmapHGDIOBJ: GDI瀵硅薄鍙ユ焺鍒癈GDI瀵硅薄鐨勬槧灝勮〃銆?br> · m_pmapHIMAGELIST: 鍥捐薄閾捐〃鍙ユ焺鍒癈ImageList瀵硅薄鐨勬槧灝勮〃
姣忎釜鍙備笌浜?jiǎn)鍙ユ焺鏄牉畡鏂规鐨凪FC綾婚兘鍖呮嫭涓涓狥romHandle鍑芥暟錛岃鍑芥暟灝咰HandleMap::FromHandle()鍖呰浜?jiǎn)钃v鏉ワ紝CHandleMap::FromHandle()瀹屾垚浜?jiǎn)鏌ユ壘锛岒q跺皢涓涓湰鍦板彞鏌勪笌涓涓狢++瀵硅薄鐩稿叧鑱斻侰Wnd::FromHandle()浼?xì)杩斿洖涓涓傚綋綾誨瀷鐨勫璞°?br>
鍏寵仈紿楀彛鍙ユ焺鍜屽垎紱葷獥鍙e彞鏌?br> CWnd::Attach() 灝咰Wnd::m_hWnd璧嬪間負(fù)宸叉湁鐨勭獥鍙e彞鏌勶紝騫跺皢榪欓槦鍏崇郴瀛樻斁鍦∕FC鐨勬案涔呯獥鍙e彞鏌勬槧灝勮〃涓?br> CWnd::Detach() 灝嗙獥鍙e叧緋誨拰CWnd媧劇敓瀵硅薄涔嬮棿鐨勫叧緋諱粠紿楀彛鍙ユ焺鏄犲皠琛ㄦ眹鎬誨垹闄わ紝灝咰Wnd::m_hWnd鐨勫艱涓篘ULL.
MFC鐘舵佷俊鎭?br> AFX_MODULE_STATE:娌℃湁鏂囨。璇存槑鐨勭姸鎬佷俊鎭?br> · m_pCurrentWinApp鈥斺?涓涓焊綆盋WinApp鐨勬寚閽?br> · m_hCurrentInstanceHandle 鈥斺?璇ユā鍧楃殑瀹炰緥鍙ユ焺
· m_hCurrentResourceHandel 鈥斺?浠h〃淇濆瓨浜?jiǎn)妯″潡璧勬簮鐨勫疄渚嬪彞鏌?br> · m_lpszCurrentAppName 鈥斺?鎸囧悜搴旂敤紼嬪簭鍚嶇О鐨勬寚閽?br> · m_bDLL 鈥斺?琛ㄧず妯″潡鏄竴涓姩鎬侀摼鎺ュ簱榪樻槸涓涓彲鎵ц鏂囦歡
· m_classList鈥斺?鎸囧悜搴旂敤紼嬪簭鐨凜RuntimeClass緇撴瀯閾捐〃涓殑絎竴涓繍琛屾椂綾葷殑鎸囬拡銆?br> · m_factoryList 鈥斺?綰哥搴旂敤紼嬪簭鐨?COleObjectFactory緇撴瀯閾捐〃涓殑絎竴涓繍琛屾椂綾葷殑鎸囬拡
· m_nObjectCount鈥斺?OLE鏈嶅姟鍣ㄧ殑寮曠敤璁℃暟錛岃〃紺烘湇鍔″櫒鏄惁鏈夋湭瀹屾垚鐨凜OM瀵硅薄
· m_bUserCtrl 鈥斺?琛ㄧず鎷ユ姢鏄惁鍦ㄤ嬌鐢∣LE鏈嶅姟鍣ㄧ殑鏍囧織銆?br> · m_szUnregisterList[4096]鈥斺旂淮鎶や竴涓敞鍐屼簡(jiǎn)鐨勭獥鍙g被鐨勯摼琛紝浠ヤ究緇撴潫鏃剁殑娉ㄩ攢
· m_pfnAfxWndProc 鈥斺?鎸囧悜MFC鐨勬爣鍑嗙獥鍙h繃紼?br> · m_fRegisteredClasses鈥斺旇〃紺哄摢浜汳FC紿楀彛綾誨凡緇忔敞鍐屼簡(jiǎn)銆?br> 澶氭暟鎴愬憳鍙互閫氳繃綾諱技AfxGetInstanceHandle()鏉ヨ闂?br>
MFC瀵笹DI鐨勬敮鎸?br> CDC綾誨唴閮?br> HDC鎴愬憳鍙橀噺錛岃〃紺轟竴涓疄闄呰澶囩幆澧冪殑鍙ユ焺銆?br> m_hAttribDC錛?br> CDC鏋愭瀯鍑芥暟璋冪敤DeleteDC()銆?br> CDC媧劇敓綾?nbsp;
· CPaintDC 鈥斺?CPaintDC鐨勬瀯閫犲嚱鏁伴渶瑕佷竴涓寚鍚慍Wnd鐨勬寚閽堬紝浠栦細(xì)璋冪敤BeginPaint()鑰屽垱寤轟竴涓澶囩幆澧冿紝鐒跺悗鍐欏叆璁懼鐜鏄犲皠琛ㄣ侰PaintDC鐨勬瀽鏋勫嚱鏁版槸EndPaint()銆?br> · CWindowDC 鈥斺?琛ㄧず紿楀彛鍐呯殑鏁翠釜灞忓箷鍖哄煙錛堝寘鎷敤鎴峰尯鍜屾錛夈侰WindowDC鐨勬瀯閫犲嚱鏁伴渶瑕佷竴涓寚鍚慍Wnd鐨勬寚閽堬紝璋冪敤GetWindowDC()鏉ヤ負(fù)鏁翠釜紿楀彛鍒涘緩涓涓澶囩幆澧冦侰WindowDC鐨勬瀽鏋勫嚱鏁版槸ReleaseDC()銆?br> · CClientDC鈥斺旂敤鎴峰尯銆傛瀯閫犲嚱鏁頒篃闇瑕佷竴涓寚鍚慍Wnd鐨勬寚閽堛侴etClientDC()銆丷eleaseDC().
· CMetaFileDC 鈥斺?Windows鐨勫厓鏂囦歡鏈変竴涓狦DI鍛戒護(hù)搴忓垪錛屽埄鐢ㄨ繖涓懡浠ゅ簭鍒楀彲浠ラ噸鏂扮敾鍑哄浘鍍忋傚垱寤轟竴涓厓鏂囦歡DC錛氭瀯閫燙MetaFileDC錛堝湪鏍堜腑鍒嗛厤涓涓垨澹版槑涓涓級(jí)錛岀劧鍚庤皟鐢–MetaFile::Create()鏉ュ垱寤轟竴涓厓鏂囦歡騫跺垵濮嬪寲CMetaFile鐨勬垚鍛樺彉閲忥紝鏋愭瀯鍑芥暟錛欴eleteMetaFile錛堬級(jí)銆?br>
鍥懼艦瀵硅薄
Device context 淇濆瓨浜?jiǎn)鍦╓indows緇樼敾鎵闇瑕佺殑鎵鏈変俊鎭紝鍖呮嫭鏄犲皠妯″紡絳夌瓑銆傝繕淇濆瓨浜?jiǎn)鍏充簬鍦ㄨ畱证囦笂缁樼斃L墍浣跨敤鐨勫伐鍏風(fēng)殑淇℃伅銆?br> CGDIObject
鎵鏈塆DI瀵硅薄鐨勫熀綾匯俶_hObject鏄疓DI瀵硅薄鐨勫彞鏌勩?br> CPen
CBrush
CFont
CBitmap
Cpalette
CRgn
=======================
銆婃繁鍏ヨВ鏋怣FC銆嬬瑪璁?1. 姒傚康鎬葷粨
=======================
緙╁啓錛?br> API: Application Programming Interface
DLL: Dynamic Link Library
GUI: Graphics User Interface
MDI: Multiple Document Interface
MFC: Microsoft Function Class
OLE: Object Linking&Embedded
OWL: Object Windows Library
SDK: Software Development Kit
SDI: Single Document Interface
UI: User Interface
WinApp: Windows Application
control 鎺т歡
notification 閫氱煡淇℃伅錛堝彂鐢熶簬鎺т歡錛?br> preemptive 寮哄埗鎬с佹姠鍗犲紡銆佷紭鍏堢駭
process 榪涚▼
Constructor Destructor Encapsulation灝佽 Inheritance緇ф壙 Polymorphism澶氭?nbsp;
鏁版嵁綾誨瀷錛?br> BSTR 32-bit 瀛楃鎸囬拡
BYTE 8-bit 鏁存暟錛屾湭甯︽璐熷彿
COLORREF 32-bit 鏁板鹼紝浠h〃涓涓鑹插?br> DWORD 32-bit 鏁存暟錛屾湭甯︽璐熷彿
LONG 32-bit 鏁存暟錛屽甫姝h礋鍙?br> LPARAM 32-bit 鏁板鹼紝浣滀負(fù)紿楀彛鍑芥暟鎴?callback 鍑芥暟鐨勪竴涓弬鏁般?br> LPCSTR 32-bit 鎸囬拡錛屾寚鍚戜竴涓父鏁板瓧絎︿覆
LPSTR 32-bit 鎸囬拡錛屾寚鍚戜竴涓瓧絎︿覆
LPCTSTR 32-bit 鎸囬拡錛屾寚鍚戜竴涓父鏁板瓧絎︿覆銆傛瀛楃涓插彲縐繪鍒?Unicode 鍜孌BCS錛堝弻瀛楄妭瀛楅泦錛?br> LPTSTR 32-bit 鎸囬拡錛屾寚鍚戜竴涓瓧絎︿覆銆傛瀛楃涓插彲縐繪鍒癠nicode鍜孌BCS
LPVOID 32-bit 鎸囬拡錛屾寚鍚戜竴涓湭鎸囧畾綾誨瀷鐨勬暟鎹?br> LPRESULT 32-bit 鏁板鹼紝浣滀負(fù)紿楀彛鍑芥暟鎴栬?callback 鍑芥暟鐨勮繑鍥炲?br> WNDPROC 32-bit 鎸囬拡錛屾寚鍚戜竴涓獥鍙e嚱鏁?br> WORD 16-bit 鏁存暟錛屾湭甯︽璐熷彿銆?br> WPARAM 紿楀彛鍑芥暟鐨刢allback鍑芥暟鐨勪竴涓弬鏁幫紝win32涓槸32bits
WINAPI綾?br> 浠諱綍浠嶤CmdTarget媧劇敓鐨勭被閮芥湁涓涓笌涔嬬浉鍏寵仈鐨勬秷鎭槧灝勮〃錛屽畠?yōu)畣鍛戒护浼犻掔粰浠嶤CmdTarget媧劇敓鐨勭被銆?br> CCmdUI綾繪彁渚涗簡(jiǎn)鏇存柊鐢ㄦ埛鐣岄潰瀵硅薄錛堝鑿滃崟鎴栧閫夋鎺т歡錛夌姸鎬佺殑鍑芥暟銆傚湪鍗曞嚮鑿滃崟涔嬪悗浠ュ強(qiáng)鑿滃崟欏規(guī)樉紺轟箣鍓嶏紝MFC浼?xì)缁欏簲鐢ńE嬪簭涓殑鍛戒護(hù)鐩爣鍙戦佷竴涓懡浠ゆ洿鏂版秷鎭傚鏋滃湪鍛戒護(hù)鐩爣瀵硅薄鐨勬秷鎭槧灝勮〃涓湁榪欎釜鏇存柊娑堟伅鐨勫唴瀹癸紝MFC浼?xì)缁機(jī)CmdUI瀵硅薄浼犻掍竴涓唬琛ㄨ彍鍗曢」鐨勬寚閽堬紝涔熷氨鏄懡浠ょ洰鏍囧璞℃墍鏇存柊鐨勫唴瀹廣?br> CWinThread浠h〃鍦∕FC紼嬪簭鍐呮墽琛岀殑綰跨▼銆?br>
鍚屾瀵硅薄綾?br> CSyncObject 鈥斺斿悓姝ュ璞$被鐨勫熀綾匯?br> CCriticalSection鈥斺斾竴涓悓姝ョ被錛屽畠鍙厑璁稿崟涓繘紼嬩腑鐨勪竴涓嚎紼嬭闂竴涓璞°?br> CSemaphore鈥斺斾竴涓悓姝ョ被錛屽畠鍙厑璁鎬竴涓璞℃湁涓涓埌鏌愪釜鎸囧畾鐨勪箣闂翠釜鏁扮殑鍚屾璁塊棶銆?br> CMutex鈥斺斾竴涓悓姝ョ被錛屽畠鍙厑璁鎬換浣曟暟鐩繘紼嬩腑鐨勪竴涓嚎紼嬭闂璞°?br> CEvent鈥斺斾竴涓悓姝ョ被錛屽綋鏌愪釜鏃墮棿鍙戠敓鏃訛紝瀹冧細(xì)閫氱煡鏌愪釜搴旂敤紼嬪簭銆?br> CSingleLock鈥斺旂嚎紼嬪畨鍏ㄧ殑綾葷殑鎴愬憳鍑芥暟涓敤鏉ラ攣浣忎竴涓悓姝ュ璞$殑瀵硅薄銆?br> CMultiLock鈥斺旂嚎紼嬪畨鍏ㄧ殑綾葷殑鎴愬憳鍑芥暟涓敤鏉ラ攣浣忎竴涓垨鏇村涓悓姝ュ璞$殑瀵硅薄錛岄攣浣忕殑瀵硅薄鏉ヨ嚜涓涓悓姝ュ璞℃暟緇勩?br>
妗嗘灦紿楀彛
CFrameWnd灝辨槸SDI搴旂敤紼嬪簭鐨勪富紿楀彛鐨勫熀綾匯?br> CMDIFrameWnd涓篗DI搴旂敤紼嬪簭鎻愪緵浜?jiǎn)涓绘鏋督H楀彛錛孋MDIChildWnd涓篗DI搴旂敤紼嬪簭鎻愪緵浜?jiǎn)瀛惤H楀彛銆?br>
瀵硅瘽妗?br> CFileDialog鈥斺斾粠鏌愪釜鐩綍涓嬮夊畾涓涓枃浠?br> CColorDialog鈥斺旈夋嫨涓涓寚瀹氱殑棰滆壊
CFontDialog鈥斺旈夋嫨涓縐嶅瓧浣撱?br> CPrintDialog鈥斺斿鐞嗘墦鍗版満鐨勫畨瑁呭拰鎵撳嵃
CFindReplaceDialog鈥斺斾負(fù)鏌ユ壘鍜屾浛鎹㈤夋嫨鏂囨湰
瀵硅瘽妗嗘暟鎹殑浜ゆ崲鍜岄獙璇侊紙DDX/DDV)閫氳繃CDataExchange綾誨疄鐜般?br>
灞炴ч〉錛欳PropertySheet 鍜?CPropertyPage
CAnimateCtrl鈥斺旀挱鏀懼姩鐢繪帶浠?br> CDragListBox鈥斺擟ListBox鐨勬淳鐢熺被錛屼綘鍙互鍦ㄨ繖涓垪琛ㄦ涓嫋鍔ㄥ拰鍘繪帀閫夐」銆?br> CHeaderCtrl鈥斺斿拰CListCtrl涓璧鋒潵鏄劇ず鏌辯姸淇℃伅
CHotKeyCtrl鈥斺斾負(fù)浠庣敤鎴瘋幏寰楅敭搴忓垪鎻愪緵鎺ュ彛錛圓lt-Backspace-Delete).
CImageList鈥斺斾竴涓狢Object鐨勬淳鐢熺被錛屽畠涓轟綘緇存姢鍥懼儚闆嗗悎銆?br> CListCtrl鈥斺旀樉紺轟竴涓摼琛ㄩ」鐨勫浘褰㈤摼琛紙綾諱技Explorer錛夈?br> CProgressCtrl鈥斺旀樉紺轟竴涓繘搴︽潯
CRichEditCtrl鈥斺斾竴涓赴瀵岀殑緙栬緫鎺т歡錛屽畠鐞嗚В涓浜汻TF鏍煎紡鐨勬蹇碉紝鑰屼笖鍏佽浣跨敤澶氬瓧浣擄紝澶氶鑹茬瓑銆?br> CSliderCtrl鈥斺斾竴涓湪鏌愪釜鍊艱寖鍥村唴榪涜閫夋嫨鐨勬粴鍔ㄦ潯銆?br> CSpinButtonCtrl鈥斺斿井璋冩帶鍒墮」銆?br> CStatusBarCtrl鈥斺旂姸鎬佹爮
CTabCtrl鈥斺斿睘鎬ч〉鎺т歡
CToolBarCtrl鈥斺斿疄鐜頒竴涓伐鍏鋒爮
CToolTipCtrl鈥斺旀彁渚涘伐鍏鋒彁紺?br> CTreeCtrl鈥斺斾竴涓被浼糆xplorer鐨勬爲(wèi)鎺т歡
GDI鏀寔鍜岀粯鐢誨璞?nbsp;
CDC綾昏〃紺鴻澶囩幆澧冦?br> · CPaintDC鈥斺斿皝瑁呬簡(jiǎn)澶勭悊WM_PAINT娑堟伅鏃舵墍瑕佷嬌鐢ㄧ殑BeginPaint()鍜孍ndPaint()涓や釜璋冪敤銆?br> · CWindowDC鈥斺斿皝瑁呬簡(jiǎn)涓庢暣涓獥鍙g浉鍏崇殑璁懼鐜
· CClientDC鈥斺斿皝瑁呬簡(jiǎn)涓庣獥鍙d腑瀹㈡埛鍖烘湁鍏崇殑璁懼鐜
· CMetaFileDC鈥斺斾負(fù)鍏冩枃浠訛紙metafile錛夊皝瑁呬簡(jiǎn)璁懼鐜銆?br> · CFont銆丆Pen銆丆Brush銆丆Bitmap銆丆Palette鍜孋Rgn鍧囦粠CGdiObject綾諱腑媧劇敓銆?br>
搴旂敤紼嬪簭妗嗘灦綾?br> 鏂囨。瑙嗗浘緇撴瀯
· CDocTemplage銆丆SingleDocTemplate鍜孋MultiDocTemplage鈥斺旀枃妗fā鏉挎槸灝嗘枃妗e拰鍏惰鍥劇矘鍚堝湪涓璧風(fēng)殑綺樺悎鍓?br> · CDocument鈥斺斿鐞嗗簲鐢ㄧ▼搴忔眹鎬繪暟鎹殑綾匯?br> · CView鈥斺斾唬琛ㄥ湪灞忓箷涓婄湅鍒扮殑紿楀彛鐨勫鎴峰尯銆?nbsp;
鎺т歡瑙嗗浘
· CEditView
· CListView
· CRichEditView
· CTreeView
鍒嗗壊紿楀彛錛圫plitter Window錛?br> 涓ょ鍒嗗壊紿楀彛錛氶潤(rùn)鎬併佸姩鎬?br> 闈?rùn)鎬侊細(xì)棰勫畾涔夌獥鏍兼暟鐩紝鏁扮洰鍜屾帓鍒椾笉鑳戒慨鏀癸紝姣忎釜紿楁牸鍙互鏄劇ず涓嶅悓綾誨瀷鐨勮鍥俱?br> 鍔ㄦ侊細(xì)姣忎釜紿楁牸蹇呴』鏄劇ず鍚屼竴綾誨瀷鐨勮鍥俱?br>
鎿嶄綔緋葷粺鎵╁睍
OLE鏀寔錛歄LE鏂囨。
鍒涘緩涓涓敮鎸丱LE澶嶅悎鏂囨。鐨勬枃妗f椂闇瑕佷嬌鐢ㄧ殑綾匯?br> · CDocItem鈥斺擬FC鐨凜OleClientItem鍜孋OleServerItem綾葷殑鍩虹被銆?br> · COleServerItem鈥斺旇〃紺轟笌宓屽叆鎴栭摼鎺ョ殑OLE欏圭殑閾炬帴鐨勬湇鍔″櫒绔?br> · COleClientItem鈥斺旇〃紺轟笌宓屽叆鎴栭摼鎺ョ殑OLE欏圭殑榪炴帴鐨勫鍣紙container錛夌銆?br> · COleDocument鈥斺旀槸MFC瀵瑰鍚堟枃妗f敮鎸佺殑鏍稿績(jī)銆傞櫎緇存姢搴旂敤紼嬪簭鐨勬湰鍦版暟鎹箣澶栵紝榪樼淮鎶や簡(jiǎn)涓涓狢DocItem瀵硅薄閾捐〃
· COleLinkingDoc鈥斺斿寘鍚竴浜涢摼鎺ワ紝榪欎簺閾炬帴鎸囧悜宓屽叆鍦ㄥ叾浠栧湴鏂圭殑欏廣?br> · COleServerDoc鈥斺旂敱絎﹀悎鏂囨。涓悎浣撶殑鏈嶅姟绔簲鐢ㄧ▼搴忎嬌鐢ㄣ?br> · COleIPFrameWnd鈥斺斾負(fù)鎴愪負(fù)澶嶅悎鏂囨。鏈嶅姟鍣紝搴旂敤紼嬪簭鏈変袱縐嶄笉鍚岀殑妗嗘灦紿楀彛 1銆侀氬父鐨勬鏋剁獥鍙?2銆佸簲鐢ㄧ▼搴忓湪鎭板綋浣嶇疆鏄劇ず鏃舵墍浣跨敤鐨勬鏋剁獥鍙o紙鐢ㄦ埛璋冪敤涓涓鍚堟枃妗e唴閮ㄧ殑鍙鍖栫紪杈戞搷浣滄椂錛夈侰OleIPFrameWnd灝佽浜?jiǎn)绗﹀悎鏂囨。鏈嶅姟鍣ㄧ殑閮ㄥ垎鍔熻兘銆?br> OLE鏀寔錛氱被鍘傦紙class factory錛?br> 姣忎釜瑕佸澶栨毚闇插熷彛鐨凮LE瀵硅薄閮借鏈変竴涓被鍘傘傜被鍘備綅浜嶰LE鏈嶅姟鍣ㄤ腑錛屼細(xì)鍒涘緩涓涓狾LE瀵硅薄鐨勫疄渚嬫潵浠h〃鏈嶅姟鍣ㄣ?br> · COleObjectFactory鈥斺斾負(fù)闇瑕佺被鍘傦紝浣嗗張涓嶆槸闈㈠悜鏂囨。鐨凪FC搴旂敤紼嬪簭瀹炵幇綾誨巶銆?br> · COleTemplateServer鈥斺斾粠COleObjectFactory鐩存帴媧劇敓鍑烘潵鐨勭被錛屼負(fù)闈㈠悜鏂囨。鐨勩佽兘浣跨敤OLE鐨凪FC搴旂敤紼嬪簭瀹炵幇綾誨巶銆?br> OLE鏀寔錛氳嚜鍔ㄥ寲
OLE鏀寔錛氱粺涓鏁版嵁浼犺緭
OLE鏁版嵁浼犺緭鐢變換浣曞疄鐜頒簡(jiǎn)IDataObject鎺ュ彛鐨勫璞″畬鎴愩?br> · COleDataSource鈥斺斿畬鎴愬垵濮嬪寲錛屽彲浠ョ敤浜庡壀璐存澘錛坈lip-board錛変紶杈擄紝涔熷彲浠ョ敤浜庢嫋鏀撅紙drag-and-drop)浼犺緭銆?br> · COleDataObject鈥斺旀暟鎹紶杈撶殑鍙︿竴绔紝鐩殑鍦幫紝閫氬父浣跨敤COleDataObject琛ㄧず銆?br> · COleDropSource鈥斺斿畾鍒?#8220;鎷栨斁”鎿嶄綔鏃舵湁鐢ㄣ?br> · COleDropTarget鈥斺旀瘡褰撳垱寤轟竴涓帴鍙楁嫋鏀炬暟鎹殑紿楀彛鎰熷叴瓚f椂錛?br> OLE鏀寔錛歄LE鎺т歡
· COleControl鈥斺斾粠CWnd媧劇敓錛屾槸OLE鎺т歡鐨勫熀綾匯?br> · COlePropertyPage鈥斺斾粠Dialog媧劇敓錛岀敤浜庝慨鏀規(guī)帶浠剁殑灞炴с?br> · COleControlModule鈥斺斾粠CWinApp媧劇敓錛屾槸淇濇寔OLE絀洪棿鐨勫姩鎬侀摼鎺ュ簱錛坉ynamic link library錛夌殑鍩虹被銆傝礋璐f墽琛屽垵濮嬪寲鍜孫LE鎺т歡鐗規(guī)湁鐨勫悇縐嶄換鍔°?br> · COleObjectFactoryEx鈥斺旀墿灞曚簡(jiǎn)COleClassFactory銆?br> · COleConnectionPoint鈥斺斾粠CCmdTarget媧劇敓錛屼唬琛ㄥ埌鍏朵粬OLE瀵硅薄鐨勮緭鍑烘帴鍙o紝鐢ㄤ簬浜嬩歡瑙﹀彂鍜屽悜瀹瑰櫒鍙戝嚭淇敼閫氱煡銆?br> · CPropExchange鈥斺斿悓鐢ㄤ簬鏍囧噯鐨凞DX/DDV鐨凜DataExchange綾諱技錛屼負(fù)灞炴т氦鎹㈠緩绔嬬幆澧冿紝騫跺湪鎺т歡涓庡鍣ㄤ箣闂村府鍔╀氦鎹㈠睘鎬с?br> · CFontHolder鈥斺斿皝瑁呬簡(jiǎn)Windows鐨勫瓧浣撶被銆傚疄鐜頒簡(jiǎn)OLE鐨処Font鎺ュ彛錛岀敤浜嶧ont鐨勫父澶囧睘鎬?銆?br> · CPictureHolder鈥斺斿疄鐜頒簡(jiǎn)“鍥懼儚灞炴?#8221;銆備互澶氭佺殑鏂瑰紡灝佽浜?jiǎn)涓涓綅鍥俱佸浘鏍囨垨鍏冩枃浠躲?br>
ODBC鏀寔
· CDatabase鈥斺斿皝瑁呬簡(jiǎn)瀵規(guī)暟鎹簮鐨勮繛鎺ヨ錛岄氳繃瀹冨彲浠ュ鏁版嵁婧愯繘琛屾搷浣溿?br> · CRecordset鈥斺斿皝瑁呬粠鏁版嵁婧愪腑閫夊嚭鐨勮褰曘傝褰曢泦鍏佽浠庤褰曞埌璁板綍鐨勬粴鍔紝鏇存柊璁板綍錛屼嬌鐢ㄨ繃婊ゅ櫒閫夋嫨璁板綍錛屾帓搴忋?br> · CFieldExchange鈥斺旀彁渚涚幆澧冧俊鎭潵鏀寔RFX錛圧ecord Field Exchange錛岃褰曞煙浜ゆ崲錛夈俁FX浼?xì)鍐嶈褰曢泦瀵硅薄鐨勫煙鏁版嵁鎴愬憳浠ュ強(qiáng)鍙傛暟鏁版嵁鎴愬憳涓庢暟鎹簮鐨勫搷搴旂殑閾捐〃涔嬮棿浜ゆ崲鏁版嵁銆?br> · CLongBinary鈥斺斿皝瑁呬簡(jiǎn)涓涓彞鏌勶紝浠ヤ究瀛樺偍澶х殑浜岃繘鍒跺璞°備富瑕佺敤浜庣鐞嗗瓨鍌ㄤ簬鏁版嵁搴撹〃涓殑澶ф暟鎹璞°?br> · CRecordView鈥斺旀彁渚涗竴涓繛鎺ュ埌璁板綍闆嗗璞$殑紿椾綋瑙嗗浘銆侱DX鏈哄埗璐熻矗鍦ㄨ褰曢泦鍚堣褰曡鍥劇殑鎺т歡涔嬮棿浜ゆ崲鏁版嵁銆?br>
DAO鏀寔錛圖ata Access Object錛屾暟鎹闂璞★級(jí)
· CDaoWorkspace鈥斺旂鐞嗗懡鍚嶇殑銆佹湁瀵嗙爜淇濇姢鐨勬暟鎹簱浼?xì)璇濄?br> · CDaoDatabase鈥斺旇繛鎺ュ埌鏌愪釜鏁版嵁搴撲笂錛屽彲閫氳繃瀹冭闂暟鎹簱銆?br> · CDaoRecordset鈥斺斾粠鏁版嵁婧愪腑閫夊嚭鐨勮褰曢泦銆?br> · CDaoRecordView鈥斺斿湪鎺т歡涓樉紺烘暟鎹簱璁板綍銆?br> · CDaoQueryDef鈥斺斾竴涓煡璇㈠畾涔夛紝閫氬父瀛樻斁鍦ㄦ暟鎹簱閲屻?br> · CDaoTableDef鈥斺斾竴涓熀琛紙base table錛夋垨闄勫姞琛紙attached table錛夌殑瀛樺偍瀹氫箟銆?br> · CDaoException鈥斺擠AO綾諱駭鐢熺殑寮傚父鎯呭喌銆?br> · CDaoFieldExchange鈥斺旀敮鎸佺敱DAO鏁版嵁搴撶被浣跨敤鐨凞AO璁板綍鍩熶氦鎹緥紼嬨?br>