锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍒氭帴瑙C緙栫▼鐨勬湅鍙嬪線寰瀵硅澶氭暟鎹被鍨嬬殑杞崲鎰熷埌榪鋒儜涓嶈В錛屾湰鏂囧皢浠嬬粛涓浜涘父鐢ㄦ暟鎹被鍨嬬殑浣跨敤銆?/p>
鎴戜滑鍏堝畾涔変竴浜涘父瑙佺被鍨嬪彉閲忓熶互璇存槑 int i = 100; 涓銆佸叾瀹冩暟鎹被鍨嬭漿鎹負瀛楃涓?/p>
_bstr_t鍙橀噺 浜屻佸瓧絎︿覆杞崲涓哄叾瀹冩暟鎹被鍨?br>strcpy(temp,"123"); 鐭暣鍨?int) CComBSTR鍙橀噺 _bstr_t鍙橀噺 鍥涖丅STR銆乢bstr_t涓嶤ComBSTR CComBSTR涓巁bstr_t瀵瑰ぇ閲忕殑鎿嶄綔絎﹁繘琛屼簡閲嶈澆錛屽彲浠ョ洿鎺ヨ繘琛?,!=,==絳夋搷浣滐紝鎵浠ヤ嬌鐢ㄩ潪甯告柟渚褲?br>鐗瑰埆鏄痏bstr_t,寤鴻澶у浣跨敤瀹冦?/p>
瀵逛簬涓嶉┈涓婅祴鍊肩殑VARIANT錛屾渶濂藉厛鐢╒oid VariantInit(VARIANTARG FAR* pvarg);榪涜鍒濆鍖?鍏舵湰璐ㄦ槸灝唙t璁劇疆涓篤T_EMPTY,涓嬭〃鎴戜滑鍒椾婦vt涓庡父鐢ㄦ暟鎹殑瀵瑰簲鍏崇郴: Byte bVal; // VT_UI1. 鏍規嵁ProgID寰楀埌CLSID 鏍規嵁CLSID寰楀埌ProgID 涓冦丄NSI涓嶶nicode 灝咥NSI杞崲鍒癠nicode 瀵規秷鎭殑澶勭悊涓垜浠粡甯擱渶瑕佸皢WPARAM鎴朙PARAM絳?2浣嶆暟鎹紙DWORD)鍒嗚В鎴愪袱涓?6浣嶆暟鎹紙WORD),渚嬪錛?br>LPARAM lParam; MFC搴旂敤紼嬪簭涓寚閽堢殑浣跨敤
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="紼嬩僵鍚?;
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;
鐭暣鍨?int)
itoa(i,temp,10);///灝唅杞崲涓哄瓧絎︿覆鏀懼叆temp涓?鏈鍚庝竴涓暟瀛楄〃紺哄崄榪涘埗
itoa(i,temp,2); ///鎸変簩榪涘埗鏂瑰紡杞崲
闀挎暣鍨?long)
ltoa(l,temp,10);
嫻偣鏁?float,double)
鐢╢cvt鍙互瀹屾垚杞崲,榪欐槸MSDN涓殑渚嬪瓙:
int decimal, sign;
char *buffer;
double source = 3.1415926535;
buffer = _fcvt( source, 7, &decimal, &sign );
榪愯緇撴灉:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal琛ㄧず灝忔暟鐐圭殑浣嶇疆,sign琛ㄧず絎﹀彿:0涓烘鏁幫紝1涓鴻礋鏁?
CString鍙橀噺
str = "2008鍖椾含濂ヨ繍";
buf = (LPSTR)(LPCTSTR)str;
BSTR鍙橀噺
BSTR bstrValue = ::SysAllocString(L"紼嬪簭鍛?);
char * buf = _com_util::ConvertBSTRToString(bstrValue);
SysFreeString(bstrValue);
AfxMessageBox(buf);
delete(buf);
CComBSTR鍙橀噺
CComBSTR bstrVar("test");
char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
AfxMessageBox(buf);
delete(buf);
_bstr_t綾誨瀷鏄BSTR鐨勫皝瑁咃紝鍥犱負宸茬粡閲嶈澆浜?鎿嶄綔絎︼紝鎵浠ュ緢瀹規槗浣跨敤
_bstr_t bstrVar("test");
const char *buf = bstrVar;///涓嶈淇敼buf涓殑鍐呭
AfxMessageBox(buf);
閫氱敤鏂規硶(閽堝闈濩OM鏁版嵁綾誨瀷)
鐢╯printf瀹屾垚杞崲
char buffer[200];
char c = '1';
int i = 35;
long j = 1000;
float f = 1.7320534f;
sprintf( buffer, "%c",c);
sprintf( buffer, "%d",i);
sprintf( buffer, "%d",j);
sprintf( buffer, "%f",f);
i = atoi(temp);
闀挎暣鍨?long)
l = atol(temp);
嫻偣(double)
d = atof(temp);
CString鍙橀噺
CString name = temp;
BSTR鍙橀噺
BSTR bstrValue = ::SysAllocString(L"紼嬪簭鍛?);
...///瀹屾垚瀵筨strValue鐨勪嬌鐢?br>SysFreeString(bstrValue);
CComBSTR綾誨瀷鍙橀噺鍙互鐩存帴璧嬪?br>CComBSTR bstrVar1("test");
CComBSTR bstrVar2(temp);
_bstr_t綾誨瀷鐨勫彉閲忓彲浠ョ洿鎺ヨ祴鍊?br>_bstr_t bstrVar1("test");
_bstr_t bstrVar2(temp);
涓夈佸叾瀹冩暟鎹被鍨嬭漿鎹㈠埌CString
浣跨敤CString鐨勬垚鍛樺嚱鏁癋ormat鏉ヨ漿鎹?渚嬪:
鏁存暟(int)
str.Format("%d",i);
嫻偣鏁?float)
str.Format("%f",i);
瀛楃涓叉寚閽?char *)絳夊凡緇忚CString鏋勯犲嚱鏁版敮鎸佺殑鏁版嵁綾誨瀷鍙互鐩存帴璧嬪?br>str = username;
瀵逛簬Format鎵涓嶆敮鎸佺殑鏁版嵁綾誨瀷錛屽彲浠ラ氳繃涓婇潰鎵璇寸殑鍏充簬鍏跺畠鏁版嵁綾誨瀷杞寲鍒癱har *鐨勬柟娉曞厛杞埌char *錛岀劧鍚庤祴鍊肩粰CString鍙橀噺銆?/p>
CComBSTR 鏄疉TL瀵笲STR鐨勫皝瑁咃紝_bstr_t鏄疌++瀵笲STR鐨勫皝瑁?BSTR鏄?2浣嶆寚閽?浣嗗茍涓嶇洿鎺ユ寚鍚戝瓧涓茬殑緙撳啿鍖恒?br>char *杞崲鍒癇STR鍙互榪欐牱:
BSTR b=_com_util::ConvertStringToBSTR("鏁版嵁");///浣跨敤鍓嶉渶瑕佸姞涓奵omutil.h鍜宑omsupp.lib
SysFreeString(bstrValue);
鍙嶄箣鍙互浣跨敤
char *p=_com_util::ConvertBSTRToString(b);
delete p;
鍏蜂綋鍙互鍙傝冧竴錛屼簩孌佃惤閲岀殑鍏蜂綋璇存槑銆?/p>
浜斻乂ARIANT 銆乢variant_t 涓?COleVariant
VARIANT鐨勭粨鏋勫彲浠ュ弬鑰冨ご鏂囦歡VC98\Include\OAIDL.H涓叧浜庣粨鏋勪綋tagVARIANT鐨勫畾涔夈?br>瀵逛簬VARIANT鍙橀噺鐨勮祴鍊鹼細棣栧厛緇檝t鎴愬憳璧嬪鹼紝鎸囨槑鏁版嵁綾誨瀷錛屽啀瀵硅仈鍚堢粨鏋勪腑鐩稿悓鏁版嵁綾誨瀷鐨勫彉閲忚祴鍊鹼紝涓句釜渚嬪瓙錛?br>VARIANT va;
int a=2001;
va.vt=VT_I4;///鎸囨槑鏁村瀷鏁版嵁
va.lVal=a; ///璧嬪?/p>
Short iVal; // VT_I2.
long lVal; // VT_I4.
float fltVal; // VT_R4.
double dblVal; // VT_R8.
VARIANT_BOOL boolVal; // VT_BOOL.
SCODE scode; // VT_ERROR.
CY cyVal; // VT_CY.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR.
DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL.
IUnknown FAR* punkVal; // VT_UNKNOWN.
IDispatch FAR* pdispVal; // VT_DISPATCH.
SAFEARRAY FAR* parray; // VT_ARRAY|*.
Byte FAR* pbVal; // VT_BYREF|VT_UI1.
short FAR* piVal; // VT_BYREF|VT_I2.
long FAR* plVal; // VT_BYREF|VT_I4.
float FAR* pfltVal; // VT_BYREF|VT_R4.
double FAR* pdblVal; // VT_BYREF|VT_R8.
VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
CY FAR* pcyVal; // VT_BYREF|VT_CY.
DATE FAR* pdate; // VT_BYREF|VT_DATE.
BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
void FAR* byref; // Generic ByRef.
char cVal; // VT_I1.
unsigned short uiVal; // VT_UI2.
unsigned long ulVal; // VT_UI4.
int intVal; // VT_INT.
unsigned int uintVal; // VT_UINT.
char FAR * pcVal; // VT_BYREF|VT_I1.
unsigned short FAR * puiVal; // VT_BYREF|VT_UI2.
unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
int FAR * pintVal; // VT_BYREF|VT_INT.
unsigned int FAR * puintVal; //VT_BYREF|VT_UINT.
_variant_t鏄疺ARIANT鐨勫皝瑁呯被錛屽叾璧嬪煎彲浠ヤ嬌鐢ㄥ己鍒剁被鍨嬭漿鎹紝鍏舵瀯閫犲嚱鏁頒細鑷姩澶勭悊榪欎簺鏁版嵁綾誨瀷銆?br>浣跨敤鏃墮渶鍔犱笂#include <comdef.h>
渚嬪錛?br>long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant鐨勪嬌鐢ㄤ笌_variant_t鐨勬柟娉曞熀鏈竴鏍鳳紝璇峰弬鑰冨涓嬩緥瀛愶細
COleVariant v3 = "瀛楃涓?, v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
鍏佸叾瀹冧竴浜汣OM鏁版嵁綾誨瀷
HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
CLSID clsid;
CLSIDFromProgID( L"MAPI.Folder",&clsid);
WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
渚嬪鎴戜滑宸茬粡瀹氫箟浜?CLSID_IApplication,涓嬮潰鐨勪唬鐮佸緱鍒癙rogID
LPOLESTR pProgID = 0;
ProgIDFromCLSID( CLSID_IApplication,&pProgID);
...///鍙互浣跨敤pProgID
CoTaskMemFree(pProgID);//涓嶈蹇樿閲婃斁
Unicode縐頒負瀹藉瓧絎﹀瀷瀛椾覆,COM閲屼嬌鐢ㄧ殑閮芥槸Unicode瀛楃涓層?/p>
(1)閫氳繃L榪欎釜瀹忔潵瀹炵幇錛屼緥濡? CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)閫氳繃MultiByteToWideChar鍑芥暟瀹炵幇杞崲,渚嬪:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '\0';
(3)閫氳繃A2W瀹忔潵瀹炵幇,渚嬪:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
灝哢nicode杞崲鍒癆NSI
(1)浣跨敤WideCharToMultiByte,渚嬪:
// 鍋囪宸茬粡鏈変簡涓涓猆nicode 涓?wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)浣跨敤W2A瀹忔潵瀹炵幇,渚嬪:
USES_CONVERSION;
pTemp=W2A(wszSomeString);
鍏佸叾瀹?/p>
WORD loValue = LOWORD(lParam);///鍙栦綆16浣?br>WORD hiValue = HIWORD(lParam);///鍙栭珮16浣?/p>
瀵逛簬16浣嶇殑鏁版嵁(WORD)鎴戜滑鍙互鐢ㄥ悓鏍風殑鏂規硶鍒嗚В鎴愰珮浣庝袱涓?浣嶆暟鎹?BYTE),渚嬪:
WORD wValue;
BYTE loValue = LOBYTE(wValue);///鍙栦綆8浣?br>BYTE hiValue = HIBYTE(wValue);///鍙栭珮8浣?/p>
涓や釜16浣嶆暟鎹紙WORD錛夊悎鎴?2浣嶆暟鎹?DWORD,LRESULT,LPARAM,鎴朩PARAM)
LONG MAKELONG( WORD wLow, WORD wHigh );
WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );
LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
LRESULT MAKELRESULT( WORD wLow, WORD wHigh );
涓や釜8浣嶇殑鏁版嵁(BYTE)鍚堟垚16浣嶇殑鏁版嵁(WORD)
WORD MAKEWORD( BYTE bLow, BYTE bHigh );
浠嶳(red),G(green),B(blue)涓夎壊寰楀埌COLORREF綾誨瀷鐨勯鑹插?br>COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
渚嬪COLORREF bkcolor = RGB(0x22,0x98,0x34);
浠嶤OLORREF綾誨瀷鐨勯鑹插煎緱鍒癛GB涓変釜棰滆壊鍊?br>BYTE Red = GetRValue(bkcolor); ///寰楀埌綰㈤鑹?br>BYTE Green = GetGValue(bkcolor); ///寰楀埌緇塊鑹?br>BYTE Blue = GetBValue(bkcolor); ///寰楀埌鍏伴鑹?/p>
涔濄佹敞鎰忎簨欏?br>鍋囧闇瑕佷嬌鐢ㄥ埌ConvertBSTRToString姝ょ被鍑芥暟,闇瑕佸姞涓婂ご鏂囦歡comutil.h,騫跺湪setting涓姞鍏omsupp.lib鎴栬呯洿鎺ュ姞涓?pragma comment( lib, "comsupp.lib" )
2) 鍦ˋpp涓幏寰桵ainFrame鎸囬拡
3) 鍦╒iew涓幏寰桵ainFrame鎸囬拡
4) 鑾峰緱View錛堝凡寤虹珛錛夋寚閽?/u>
5) 鑾峰緱褰撳墠鏂囨。鎸囬拡
6) 鑾峰緱鐘舵佹爮涓庡伐鍏鋒爮鎸囬拡
7) 鑾峰緱鐘舵佹爮涓庡伐鍏鋒爮鍙橀噺
8) 鍦∕ainframe鑾峰緱鑿滃崟鎸囬拡
9) 鍦ㄤ換浣曠被涓幏寰楀簲鐢ㄧ▼搴忕被
10) 浠庢枃妗g被鍙栧緱瑙嗗浘綾葷殑鎸囬拡(1)
11) 鍦ˋpp涓幏寰楁枃妗fā鏉挎寚閽?/u>
12) 浠庢枃妗fā鏉胯幏寰楁枃妗g被鎸囬拡
13) 鍦ㄦ枃妗g被涓幏寰楁枃妗fā鏉挎寚閽?/u>
14) 浠庢枃妗g被鍙栧緱瑙嗗浘綾葷殑鎸囬拡(2)
15) 浠庝竴涓鍥劇被鍙栧緱鍙︿竴瑙嗗浘綾葷殑鎸囬拡
VC涓紪紼嬪浜庡垰鍒氬紑濮嬪涔犵殑鍚屽錛屾渶澶х殑闅滅鍜岄棶棰樺氨鏄秷鎭満鍒跺拰鎸囬拡鑾峰彇涓庢搷浣溿傚叾瀹炶繖浜涘唴瀹瑰熀鏈笂鏄瘡鏈琕C瀛︿範宸ュ叿涔︿笂蹇呰鐨勫唴瀹癸紝鑰屼笖閫氳繃MSDN寰堝闂閮借兘瑙e喅銆?br>涓嬮潰鏂囧瓧涓昏鏄釜浜哄湪緙栫▼涓寚閽堜嬌鐢ㄧ殑涓浜涗綋浼氾紝璇寸殑涓嶅綋鐨勫湴鏂硅鎸囨銆?br>涓鑸垜浠嬌鐢ㄧ殑妗嗘灦鏄疺C鎻愪緵鐨刉izard鐢熸垚鐨凪FC App Wizard(exe)妗嗘灦錛屾棤璁烘槸澶氭枃妗h繕鏄崟鏂囨。錛岄兘瀛樺湪鎸囬拡鑾峰彇鍜屾搷浣滈棶棰樸?br>涓嬮潰榪欒妭鍐呭涓昏鏄竴鑸殑妗嗘灦錛岀劧鍚庡啀璁插綰跨▼涓殑鎸囬拡浣跨敤銆備嬌鐢ㄥ埌鐨勭被闇瑕佸寘鍚搷搴旂殑澶存枃浠躲傞鍏堜竴鑸幏寰楁湰綾?瑙嗭紝鏂囨。錛屽璇濇閮芥敮鎸?瀹炰緥鎸囬拡this錛岀敤this鐨勭洰鐨勶紝涓昏鍙互閫氳繃綾諱腑鐨勫嚱鏁板悜鍏朵粬綾繪垨鑰呭嚱鏁頒腑鍙戞寚閽堬紝浠ヤ究浜庡湪闈炴湰綾諱腑鎿嶄綔鍜屼嬌鐢ㄦ湰綾諱腑鐨勫姛鑳姐?br> 1錛?鍦╒iew涓幏寰桪oc鎸囬拡
CYouSDIDoc *pDoc=GetDocument();涓涓鍙兘鏈変竴涓枃妗c?/pre>
2) 鍦ˋpp涓幏寰桵ainFrame鎸囬拡
CWinApp 涓殑 m_pMainWnd鍙橀噺灝辨槸MainFrame鐨勬寚閽?br>涔熷彲浠ワ細
CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
3) 鍦╒iew涓幏寰桵ainFrame鎸囬拡
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
4) 鑾峰緱View錛堝凡寤虹珛錛夋寚閽?
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();
5) 鑾峰緱褰撳墠鏂囨。鎸囬拡
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
6) 鑾峰緱鐘舵佹爮涓庡伐鍏鋒爮鎸囬拡
CStatusBar * pStatusBar錛?CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
7) 濡傛灉妗嗘灦涓姞鍏ュ伐鍏鋒爮鍜岀姸鎬佹爮鍙橀噺榪樺彲浠ヨ繖鏍?
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
8) 鍦∕ainframe鑾峰緱鑿滃崟鎸囬拡
CMenu *pMenu=m_pMainWnd->GetMenu();
9) 鍦ㄤ換浣曠被涓幏寰楀簲鐢ㄧ▼搴忕被
鐢∕FC鍏ㄥ眬鍑芥暟AfxGetApp()鑾峰緱銆?br> 10) 浠庢枃妗g被鍙栧緱瑙嗗浘綾葷殑鎸囬拡
鎴戞槸浠?a target=_blank>http://download.cqcnc.com/soft/program/article/vc/vc405.html瀛﹀埌鐨勶紝浠庢枃妗h幏寰楄鍥劇被鎸囬拡鐩殑涓鑸負浜嗘帶鍒跺悓涓鏂囨。鐨勫涓鍥劇殑瀹氫綅闂錛屾垜鐨勪綋浼氱壒鍒槸鏂囧瓧澶勭悊CEditView褰撲駭鐢熷涓鍥劇被鏃訛紝榪欎釜鍔熻兘鏄潪甯擱渶瑕佺殑銆?
CDocument綾繪彁渚涗簡涓や釜鍑芥暟鐢ㄤ簬瑙嗗浘綾葷殑瀹氫綅錛?br>GetFirstViewPosition()鍜孏etNextView()
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
娉ㄦ剰錛欸etNextView()鎷彿涓殑鍙傛暟鐢ㄧ殑鏄紩鐢ㄦ柟寮忥紝鍥犳鎵ц鍚庡煎彲鑳芥敼鍙樸?br>GetFirstViewPosition()鐢ㄤ簬榪斿洖絎竴涓鍥句綅緗紙榪斿洖鐨勫茍闈炶鍥劇被鎸囬拡錛岃屾槸涓涓狿OSITION綾誨瀷鍊鹼級錛孏etNextView()鏈変袱涓姛鑳斤細榪斿洖涓嬩竴涓鍥劇被鐨勬寚閽堜互鍙婄敤寮曠敤璋冪敤鐨勬柟寮忔潵鏀瑰彉浼犲叆鐨凱OSITION綾誨瀷鍙傛暟鐨勫箋傚緢鏄庢樉錛屽湪Test紼嬪簭涓紝鍙湁涓涓鍥劇被錛屽洜姝ゅ彧闇灝嗚繖涓や釜鍑芥暟璋冪敤涓嬈″嵆鍙緱鍒癈TestView鐨勬寚閽堝涓嬶紙闇瀹氫箟涓涓狿OSITION緇撴瀯鍙橀噺鏉ヨ緟鍔╂搷浣滐級錛?
CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
榪欐牱錛屼究鍙埌浜咰TestView綾葷殑鎸囬拡pTestView.鎵ц瀹屽嚑鍙ュ悗錛屽彉閲弍os=NULL,鍥犱負娌℃湁涓嬩竴涓鍥劇被錛岃嚜鐒朵篃娌℃湁涓嬩竴涓鍥劇被鐨凱OSITION.浣嗘槸榪欏嚑鏉¤鍙ュお綆鍗曪紝涓嶅叿鏈夊お寮虹殑閫氱敤鎬у拰瀹夊叏鐗瑰緛錛涘綋璞″墠闈㈣鐨勯偅鏍鳳紝褰撹鍦ㄥ涓鍥句負涓繑鍥炴煇涓寚瀹氱被鐨勬寚閽堟椂錛屾垜浠渶瑕侀亶鍘嗘墍鏈夎鍥劇被錛岀洿鍒版壘鍒版寚瀹氱被涓烘銆傚垽鏂竴涓被鎸囬拡鎸囧悜鐨勬槸鍚︽煇涓被鐨勫疄渚嬫椂錛屽彲鐢↖sKindOf()鎴愬憳鍑芥暟鏃惰媯鏌ワ紝濡傦細
pView->IsKindOf(RUNTIME_CLASS(CTestView));
鍗沖彲媯鏌View鎵鎸囨槸鍚︽槸CTestView綾匯?br>
鏈変簡浠ヤ笂鍩虹錛屾垜浠凡緇忓彲浠ヤ粠鏂囨。綾誨彇寰椾換浣曠被鐨勬寚閽堛備負浜嗘柟渚匡紝鎴戜滑灝嗗叾浣滀負涓涓枃妗g被鐨勬垚鍛樺嚱鏁幫紝瀹冩湁涓涓弬鏁幫紝琛ㄧず瑕佽幏寰楀摢涓被鐨勬寚閽堛傚疄鐜板涓嬶細
CView* CTestDoc::GetView(CRuntimeClass* pClass)
{
CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL){
pView=GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.\r\n http://www.VCKBASE.com");
return NULL;
}
return pView;
}
鍏朵腑鐢ㄤ簡涓ゆ瑙嗗浘綾葷殑鎴愬憳鍑芥暟IsKindOf()鏉ュ垽鏂紝鏄洜涓洪鍑簑hile寰幆鏈変笁縐嶅彲鑳斤細
1.pos涓篘ULL錛屽嵆宸茬粡涓嶅瓨鍦ㄤ笅涓涓鍥劇被渚涙搷浣滐紱
2.pView宸茬鍚堣姹傘?br>
1鍜?鍚屾槸婊¤凍銆傝繖鏄洜涓篏etNextView()鐨勫姛鑳芥槸灝嗗綋鍓嶈鍥炬寚閽堟敼鍙樻垚涓涓鍥劇殑浣嶇疆鍚屾椂榪斿洖褰撳墠瑙嗗浘鎸囬拡錛屽洜姝os鏄痯View鐨勪笅涓涓鍥劇被鐨凱OSITION,瀹屽叏鏈夊彲鑳芥棦鏄痯os==NULL鍙堟槸pView絎﹀悎闇瑕併傚綋鎵闇鐨勮鍥炬槸鏈鍚庝竴涓鍥炬槸鏈鍚庝竴涓鍥劇被鏃跺氨濡傚紩銆傚洜姝ら渶閲囩敤涓ゆ鍒ゆ柇銆?br>浣跨敤璇ュ嚱鏁板簲閬靛驚濡備笅鏍煎紡錛堜互鍙栧緱CTestView鎸囬拡涓轟緥錛夛細
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS鏄竴涓畯錛屽彲浠ョ畝鍗曞湴鐞嗚В瀹冪殑浣滅敤錛氬皢綾葷殑鍚嶅瓧杞寲涓篊RuntimeClass涓烘寚閽堛?br>鑷充簬寮哄埗綾誨瀷杞崲涔熸槸涓轟簡瀹夊叏鐗規ц冭檻鐨勶紝鍥犱負浠庡悓涓涓熀綾諱箣闂寸殑鎸囬拡綾誨瀷鏄簰鐩稿吋瀹圭殑銆傝繖縐嶅己鍒剁被鍨嬭漿鎹篃璁稿茍涓嶅繀瑕侊紝浣嗚兘閬垮厤涓浜涘彲鑳藉嚭鐜扮殑楹葷儲銆?br>
3.浠庝竴涓鍥劇被鍙栧緱鍙︿竴瑙嗗浘綾葷殑鎸囬拡 緇煎悎1鍜?錛屽緢瀹規槗寰楀嚭瑙嗗浘綾諱箣闂翠簰鐩歌幏寰楁寚閽堢殑鏂規硶錛氬氨鏄敤鏂囨。綾諱綔涓漿錛屽厛鐢?鐨勬柟娉曞緱鍒版枃妗g被鐨勬寚閽堬紝鍐嶇敤2鐨勬柟娉曪紝浠ユ枃妗g被鐨勮鍥懼畾浣嶅嚱鏁板彇寰楀彟涓涓鍥劇被銆傚悓鏍鳳紝鍙互瀹炵幇鎴愪竴涓嚱鏁幫細
錛堝亣璁捐浠嶤TestAView涓彇寰楁寚鍚戝叾瀹冭鍥劇被鐨勬寚閽堬級
CView* CTestAView::GetView(CRuntimeClass* pClass)
{
CTestDoc* pDoc=(CTestDoc*)GetDocument();
CView* pView;
POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
pView=pDoc->GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.");
return NULL;
}
return pView;
}
榪欎釜鍑芥暟鍜?涓殑GetView()鐩告瘮錛屼竴鏄浜嗙涓鍙ヤ互鍙栧緱鏂囨。綾繪寚閽堬紝浜屾槸鍦℅etFirstViewPosition()鍜孏etNextView()鍓嶅姞涓婁簡鏂囨。綾繪寚閽堬紝浠ヨ〃紺哄畠浠槸鏂囨。綾繪垚鍛樺嚱鏁般?br>鏈変簡姝ゅ嚱鏁幫紱褰撹浠嶤TestAView涓彇寰桟TestBView鐨勬寚閽堟椂錛屽彧闇濡備笅錛?
CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
11錛夊浜庡崟鏂囨。涓篃鍙互鍔犲叆澶氫釜鏂囨。妯℃澘錛屼絾鏄竴鑸殑寮鍙戝氨浣跨敤MDI鏂瑰紡寮鍙戝鏂囨。妯℃澘錛屽叾鏂規硶涓庝笂榪拌鍥劇殑鑾峰彇鏂規硶寰堟帴榪戯紝榪欓噷紼嶅仛瑙i噴錛屽鏋滀笉娓呮錛岃鏌ラ槄MSDN錛岋紙浠ヤ笅鍥涗釜鍐呭錛?1銆?2銆?3銆?4錛夋潵婧愶細http://sanjianxia.myrice.com/vc/vc45.htm錛?br>
鍙互鐢–WinApp::GetFirstDocTemplatePostion鑾峰緱搴旂敤紼嬪簭娉ㄥ唽鐨勭涓涓枃妗fā鏉跨殑浣嶇疆錛?br>鍒╃敤璇ュ兼潵璋冪敤CWinApp::GetNextDocTemplate鍑芥暟錛岃幏寰楃涓涓狢DocTemplate瀵硅薄鎸囬拡銆?
POSITION GetFirstDocTemplate( ) const;
CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;
絎簩涓嚱鏁拌繑鍥炵敱pos 鏍囪瘑鐨勬枃妗fā鏉褲侾OSITION鏄疢FC瀹氫箟鐨勪竴涓敤浜庤凱浠f垨瀵硅薄鎸囬拡媯绱㈢殑鍊箋傞氳繃榪欎袱涓嚱鏁幫紝搴旂敤紼嬪簭鍙互閬嶅巻鏁翠釜鏂囨。妯℃澘鍒楄〃銆傚鏋滆媯绱㈢殑鏂囨。妯℃澘鏄ā鏉垮垪琛ㄤ腑鐨勬渶鍚庝竴涓紝鍒檖os鍙傛暟琚疆涓篘ULL銆?br> 12錛変竴涓枃妗fā鏉垮彲浠ユ湁澶氫釜鏂囨。錛屾瘡涓枃妗fā鏉塊兘淇濈暀騫剁淮鎶や簡涓涓墍鏈夊搴旀枃妗g殑鎸囬拡鍒楄〃銆?
鐢–DocTemplate::GetFirstDocPosition鍑芥暟鑾峰緱涓庢枃妗fā鏉跨浉鍏崇殑鏂囨。闆嗗悎涓涓涓枃妗g殑浣嶇疆錛屽茍鐢≒OSITION鍊間綔涓篊DocTemplate::GetNextDoc鐨勫弬鏁版潵閲嶅閬嶅巻涓庢ā鏉跨浉鍏崇殑鏂囨。鍒楄〃銆傚嚱鏁板師褰負錛?
viaual POSITION GetFirstDocPosition( ) const = 0;
visual CDocument *GetNextDoc(POSITION & rPos) const = 0;
濡傛灉鍒楄〃涓虹┖錛屽垯rPos琚疆涓篘ULL. 13錛夊湪鏂囨。涓彲浠ヨ皟鐢–Document::GetDocTemplate鑾峰緱鎸囧悜璇ユ枃妗fā鏉跨殑鎸囬拡銆傚嚱鏁板師褰㈠涓嬶細
CDocTemplate * GetDocTemplate ( ) const;
濡傛灉璇ユ枃妗d笉灞炰簬鏂囨。妯℃澘綆$悊錛屽垯榪斿洖鍊間負NULL銆? 14)涓涓枃妗e彲浠ユ湁澶氫釜瑙嗐傛瘡涓涓枃妗i兘淇濈暀騫剁淮鎶や竴涓墍鏈夌浉鍏寵鐨勫垪琛ㄣ侰Document::AddView灝嗕竴涓榪炴帴鍒版枃妗d笂錛屽皢璇ヨ鍔犲叆鍒版枃妗g浉鑱旂郴鐨勮鐨勫垪琛ㄤ腑錛屽茍灝嗚鐨勬枃妗f寚閽堟寚鍚戣鏂囨。銆傚綋鏈塅ile/New銆丗ile/Open銆乄indows/New鎴朩indow/Split鐨勫懡浠よ屽皢涓涓柊鍒涘緩鐨勮鐨勫璞¤繛鎺ュ埌鏂囨。涓婃椂錛?MFC浼氳嚜鍔ㄨ皟鐢ㄨ鍑芥暟錛屾鏋墮氳繃鏂囨。/瑙嗙殑緇撴瀯灝嗘枃妗e拰瑙嗚仈緋昏搗鏉ャ傚綋鐒訛紝紼嬪簭鍛樹篃鍙互鏍規嵁鑷繁鐨勯渶瑕佽皟鐢ㄨ鍑芥暟銆?
Virtual POSITION GetFirstViewPosition( ) const;
Virtual CView * GetNextView( POSITION &rPosition) cosnt;
搴旂敤紼嬪簭鍙互璋冪敤CDocument::GetFirstViewPosition榪斿洖涓庤皟鐢ㄦ枃妗g浉鑱旂郴鐨勮鐨勫垪琛ㄤ腑鐨勭涓涓鐨勪綅緗紝騫惰皟鐢–Document::GetNextView榪斿洖鎸囧畾浣嶇疆鐨勮錛屽茍灝唕Positon鐨勫肩疆涓哄垪琛ㄤ腑涓嬩竴涓鐨凱OSITION鍊箋傚鏋滄壘鍒扮殑瑙嗕負鍒楄〃涓殑鏈鍚庝竴涓錛屽垯灝唕Position緗負NULL. 15)浠庝竴涓鍥劇被鍙栧緱鍙︿竴瑙嗗浘綾葷殑鎸囬拡
榪欎釜搴旂敤鍦ㄥ瑙嗙殑搴旂敤紼嬪簭涓緢澶氳錛屼竴鑸鏋滆嚜宸卞湪涓葷▼搴忔垨鑰呬富妗嗘灦涓仛濂藉彉閲忚鍙鳳紝涔熷彲浠ヨ幏寰楋紝榪樻湁姣旇緝閫氱敤鐨勫氨鏄敤鏂囨。綾諱綔涓漿錛屼互鏂囨。綾葷殑瑙嗗浘閬嶅巻瀹氫綅錛屽彇寰楀彟涓涓鍥劇被銆傝繖涓姛鑳戒粠鏈枃絎?0欏逛腑鍙互寰楀埌銆?br>
榪欎簺璧勬枡澶ч儴鍒嗛兘鏄粠緗戜笂鍜孧SDN涓幏寰楃殑錛屽啓榪欎釜鏂囨。灝辨槸涓轟簡璁╁ぇ瀹朵笉鐢ㄥ啀瀵繪壘錛屽垪鍑烘爣棰橈紝鍙搷浣滄ф洿寮恒?br>
{
CDC maskDC, ImageDC;
maskDC.CreateCompatibleDC(pDestDC);
ImageDC.CreateCompatibleDC(pDestDC);
CBitmap maskBMP;
maskBMP.CreateBitmap(nWidth, nHeight, 1, 1, NULL);//鍒涘緩鍗曡壊鎺╃爜浣嶅浘
CBitmap *pOldBMP = ImageDC.SelectObject(pBitmap);
CBitmap *maskOldBMP = maskDC.SelectObject(&maskBMP);
ImageDC.SetBkColor(clr);// 璁劇疆閫忔槑鑹?br> maskDC.BitBlt(0, 0, nWidth, nHeight, &ImageDC, nXsrc, nYsrc, SRCCOPY);
//璁劇疆鑳屾櫙鑹蹭負榛戣壊錛屽墠鏅壊涓虹櫧鑹詫紝灝嗘帺鐮佷綅鍥句笌鍘熶綅鍥劇浉"涓?
ImageDC.SetBkColor(RGB(0, 0, 0));
ImageDC.SetTextColor(RGB(255, 255, 255));
ImageDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, nXsrc, nYsrc, SRCAND);
//璁劇疆鑳屾櫙鑹蹭負鐧借壊錛屽墠鏅壊涓洪粦鑹詫紝灝嗘帺鐮佷綅鍥句笌鑳屾櫙榪涜“涓?#8221;榪愮畻
pDestDC->SetBkColor(RGB(255, 255, 255));
pDestDC->SetTextColor(RGB(0, 0, 0));
pDestDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, nXsrc, nYsrc, SRCAND);
// "鎴?榪愮畻,鐢熸垚鏈緇堟晥鏋?br> pDestDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &ImageDC, nXsrc, nYsrc, SRCPAINT);
if (pOldBMP) ImageDC.SelectObject(pOldBMP);
ImageDC.DeleteDC();
if (maskOldBMP) maskDC.SelectObject(maskOldBMP);
maskDC.DeleteDC();
if (maskBMP.m_hObject) maskBMP.DeleteObject();
}
BOOL TransparentBlt( HDC hdcDest, // 鐩爣DC int nXOriginDest, // 鐩爣X鍋忕Щ int nYOriginDest, // 鐩爣Y鍋忕Щ int nWidthDest, // 鐩爣瀹藉害 int hHeightDest, // 鐩爣楂樺害 HDC hdcSrc, // 婧怐C int nXOriginSrc, // 婧怷璧風偣 int nYOriginSrc, // 婧怸璧風偣 int nWidthSrc, // 婧愬搴? int nHeightSrc, // 婧愰珮搴? UINT crTransparent // 閫忔槑鑹?COLORREF綾誨瀷 );浣跨敤紺轟緥:
CBitmap FootballBMP; FootballBMP.LoadBitmap(IDB_FOOTBALLBMP); CDC ImageDC; ImageDC.CreateCompatibleDC(pDC); CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP); TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff)); ImageDC.SelectObject(pOldImageBMP);浜屻佸疄鐜癟ransparentBlt鍑芥暟
HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 寤虹珛鍗曡壊浣嶅浘 SetBkColor(hImageDC, RGB(0,0,0xff)); // 璁劇疆鑳屾櫙鑹蹭負钃濊壊 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 鎷瘋礉鍒癶MaskDC榪欐牱瓚崇悆浣嶅浘涓摑鑹插尯鍩熷湪鎺╃爜浣嶅浘涓垚浜嗙櫧鑹詫紝鍏跺畠鍖哄煙涓洪粦鑹詫紝姝ゆ椂hMaskBMP 濡備笅鍥?
SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);榪欐牱錛屾帺鐮佷綅鍥句腑鑳屾櫙鑹詫紙榛戣壊錛夌殑鍖哄煙鍦╤ImageBMP涓淇濈暀錛屽墠鏅壊錛堢櫧鑹詫級鐨勯儴鍒嗗彉涓洪粦鑹層?姝ゆ椂hImageBMP 濡備笅鍥?
SetBkColor(hdcDest,RGB(255,255,255)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);鎺╃爜涓櫧鑹插尯鍩燂紙鏁版嵁涓?鐩?#8220;涓?#8221;緇撴灉涓嶅彉錛変嬌鑳屾櫙淇濇寔涓嶅彉錛岄粦鑹插尯鍩熷彉鎴愰粦鑹詫紝姝ゆ椂鑳屾櫙鏄劇ず濡備笅:
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);榪欐牱灝卞皢瓚崇悆緇樺埗鍒拌儗鏅笂浜嗐?br>
void TransparentBlt2( HDC hdcDest, // 鐩爣DC int nXOriginDest, // 鐩爣X鍋忕Щ int nYOriginDest, // 鐩爣Y鍋忕Щ int nWidthDest, // 鐩爣瀹藉害 int nHeightDest, // 鐩爣楂樺害 HDC hdcSrc, // 婧怐C int nXOriginSrc, // 婧怷璧風偣 int nYOriginSrc, // 婧怸璧風偣 int nWidthSrc, // 婧愬搴? int nHeightSrc, // 婧愰珮搴? UINT crTransparent // 閫忔槑鑹?COLORREF綾誨瀷 ) { HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 鍒涘緩鍏煎浣嶅浘 HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 鍒涘緩鍗曡壊鎺╃爜浣嶅浘 HDC hImageDC = CreateCompatibleDC(hdcDest); HDC hMaskDC = CreateCompatibleDC(hdcDest); hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP); hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP); // 灝嗘簮DC涓殑浣嶅浘鎷瘋礉鍒頒復鏃禗C涓? if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc) BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY); else StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY); // 璁劇疆閫忔槑鑹? SetBkColor(hImageDC, crTransparent); // 鐢熸垚閫忔槑鍖哄煙涓虹櫧鑹詫紝鍏跺畠鍖哄煙涓洪粦鑹茬殑鎺╃爜浣嶅浘 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 鐢熸垚閫忔槑鍖哄煙涓洪粦鑹詫紝鍏跺畠鍖哄煙淇濇寔涓嶅彉鐨勪綅鍥? SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 閫忔槑閮ㄥ垎淇濇寔灞忓箷涓嶅彉錛屽叾瀹冮儴鍒嗗彉鎴愰粦鑹? SetBkColor(hdcDest,RGB(255,255,255)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // "鎴?榪愮畻,鐢熸垚鏈緇堟晥鏋? BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); // 娓呯悊銆佹仮澶? SelectObject(hImageDC, hOldImageBMP); DeleteDC(hImageDC); SelectObject(hMaskDC, hOldMaskBMP); DeleteDC(hMaskDC); DeleteObject(hImageBMP); DeleteObject(hMaskBMP); }2.3 TransparentBlt鐨勫彟澶栦竴涓増鏈?TransparentBltU
bool TransparentBltU( HDC dcDest, // handle to Dest DC int nXOriginDest, // x-coord of destination upper-left corner int nYOriginDest, // y-coord of destination upper-left corner int nWidthDest, // width of destination rectangle int nHeightDest, // height of destination rectangle HDC dcSrc, // handle to source DC int nXOriginSrc, // x-coord of source upper-left corner int nYOriginSrc, // y-coord of source upper-left corner int nWidthSrc, // width of source rectangle int nHeightSrc, // height of source rectangle UINT crTransparent // color to make transparent ) { if (nWidthDest < 1) return false; if (nWidthSrc < 1) return false; if (nHeightDest < 1) return false; if (nHeightSrc < 1) return false; HDC dc = CreateCompatibleDC(NULL); HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc, BITSPIXEL), NULL); if (bitmap == NULL) { DeleteDC(dc); return false; } HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap); if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY)) { SelectObject(dc, oldBitmap); DeleteObject(bitmap); DeleteDC(dc); return false; } HDC maskDC = CreateCompatibleDC(NULL); HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL); if (maskBitmap == NULL) { SelectObject(dc, oldBitmap); DeleteObject(bitmap); DeleteDC(dc); DeleteDC(maskDC); return false; } HBITMAP oldMask = (HBITMAP)SelectObject(maskDC, maskBitmap); SetBkColor(maskDC, RGB(0,0,0)); SetTextColor(maskDC, RGB(255,255,255)); if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS)) { SelectObject(maskDC, oldMask); DeleteObject(maskBitmap); DeleteDC(maskDC); SelectObject(dc, oldBitmap); DeleteObject(bitmap); DeleteDC(dc); return false; } SetBkColor(dc, crTransparent); BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT); SetBkColor(dc, RGB(0,0,0)); SetTextColor(dc, RGB(255,255,255)); BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND); HDC newMaskDC = CreateCompatibleDC(NULL); HBITMAP newMask; newMask = CreateBitmap(nWidthDest, nHeightDest, 1, GetDeviceCaps(newMaskDC, BITSPIXEL), NULL); if (newMask == NULL) { SelectObject(dc, oldBitmap); DeleteDC(dc); SelectObject(maskDC, oldMask); DeleteDC(maskDC); DeleteDC(newMaskDC); DeleteObject(bitmap); DeleteObject(maskBitmap); return false; } SetStretchBltMode(newMaskDC, COLORONCOLOR); HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask); StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0, nWidthSrc, nHeightSrc, SRCCOPY); SelectObject(maskDC, oldMask); DeleteDC(maskDC); DeleteObject(maskBitmap); HDC newImageDC = CreateCompatibleDC(NULL); HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1, GetDeviceCaps(newMaskDC, BITSPIXEL), NULL); if (newImage == NULL) { SelectObject(dc, oldBitmap); DeleteDC(dc); DeleteDC(newMaskDC); DeleteObject(bitmap); return false; } HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage); StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc, nHeightSrc, SRCCOPY); SelectObject(dc, oldBitmap); DeleteDC(dc); DeleteObject(bitmap); BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, newMaskDC, 0, 0, SRCAND); BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, newImageDC, 0, 0, SRCPAINT); SelectObject(newImageDC, oldNewImage); DeleteDC(newImageDC); SelectObject(newMaskDC, oldNewMask); DeleteDC(newMaskDC); DeleteObject(newImage); DeleteObject(newMask); return true; }
棣栧厛錛屽垱寤哄璇濇璧勬簮錛氬湪瀵硅瘽妗嗚祫婧愮紪杈戝櫒鍐呯敓鎴愪竴涓?/span>Dialog璧勬簮錛屽茍灝嗗叾椋庢牸錛?/span>Style錛夊睘鎬у繀欏昏緗負Child錛屼笉鑳借緗負Overlapped鎴?/span>Popup錛屽惁鍒欒繍琛岃偗瀹氬嚭閿欙紱鑷充簬杈圭晫灞炴у垯闅忕敤鎴瘋嚜宸卞枩嬈紝涓鑸兘鏄夋嫨None銆傚叾浣欏睘鎬т篃闅忕敤鎴烽夋嫨錛屼竴鑸病鏈夌壒孌婅姹傝繕鏄夋嫨榛樿鐨勫ソ銆?/span>
鍏舵錛屽垱寤哄熀浜?/span>CDialog鐨勬淳鐢熺被錛氭墦寮ClassWizard錛屼負浠ヤ笂鍒涘緩鐨勮祫婧愭坊鍔犱竴涓互CDialog涓哄熀綾葷殑媧劇敓綾伙紙鍥犱負ClassWizard娌℃湁灝?/span>CDialogBar鍒楀湪鍩虹被鐩綍娓呭崟涓紝鎵浠ョ敤鎴峰彧鑳藉厛浠?/span>CDialog綾繪淳鐢燂級銆?/span>
鍐嶆錛屼慨鏀規淳鐢熺被浠?/span>CDialogBar涓哄熀綾伙細閫氬父闇瑕佹墜宸ヤ慨鏀瑰嚑澶勪唬鐮侊紝鍦ㄦ湰渚嬩腑媧劇敓綾諱互CDataStatus鍛藉悕銆傦紙娉細浠ュ悗璁茶В涓嚒鏄墜宸ユ敼鍔ㄩ兘鏄互鐏拌儗鏅樉紺猴級
1銆?/span> 鍦ㄥご鏂囦歡涓慨鏀圭戶鎵垮叧緋?/span>
灝?/span>class CDataStatus : public CDialog 鏀逛負class CDataStatus : public CDialogBar
2銆?/span> 鍦ㄤ唬鐮佹枃浠朵腑淇鏋勯犲嚱鏁扮戶鎵垮叧緋?/span>
灝?/span>CDataStatus::CDataStatus(CWnd* pParent /*=NULL*/)
: CDialog(CDataStatus::IDD, pParent)
{
//{{AFX_DATA_INIT(CDataStatus)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
鏀逛負
CDataStatus::CDataStatus(CWnd* pParent /*=NULL*/)
{
//{{AFX_DATA_INIT(CDataStatus)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
3銆?/span> 灝?/span>DDX緇戝畾鍑芥暟涓殑緇ф壙鍏崇郴鍘繪帀
鍗沖皢void CDataStatus::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCurrentCheckDlg)
………..
//}}AFX_DATA_MAP
}
鏀逛負
void CDataStatus::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CCurrentCheckDlg)
………….
//}}AFX_DATA_MAP
}
4銆?/span> 閲嶆柊鍒濆鍖栧嚱鏁幫紙榪欎釜鐩稿綋閲嶈錛屽鏋滀笉榪欎箞鍋氱殑璇濓紝DDX鍑芥暟褰㈠悓铏氳錛屽綋鐒剁敤鎴風殑宸ュ叿鏉″鏋滄病鏈夌敤鍒?/span>DDX鐨勮瘽褰撶劧鍙互涓嶅姞榪欐浠g爜錛夛細
棣栧厛鍦?/span>ClassWizard鐨?/span>MessageMap涓娑堟伅璇?/span>CDataStatus綾葷殑WM_INITDIALOG娑堟伅娣誨姞澶勭悊鍑芥暟榛樿鍚嶄負OnInitDialog銆?/span>
鍏舵鎵嬪伐淇敼浠g爜濡備笅錛?/span>
1銆?/span> 娣誨姞娑堟伅鏄犲皠鍑芥暟銆傜敱浜庡璇濇褰㈠紡鐨勫垵濮嬪寲鍑芥暟娑堟伅騫舵湭鍔犺澆鍒版秷鎭槧灝勫唴錛屼負姝ゆ垜浠渶瑕佹墜宸ユ坊鍔狅紝瑕佷笉鐒朵唬鐮佹棤娉曟嫤鎴宸ュ叿鏉$殑鍒濆鍖栨秷鎭紝褰㈠紡濡備笅錛?/span>
灝?/span>BEGIN_MESSAGE_MAP(CDataStatus, CDialogBar)
//{{AFX_MSG_MAP(CDataStatus)
.......
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
鏀逛負錛?/span>
BEGIN_MESSAGE_MAP(CDataStatus, CDialogBar)
//{{AFX_MSG_MAP(CDataStatus)
.......
ON_MESSAGE(WM_INITDIALOG,OnInitDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
2銆?/span> 淇敼OnInitDialog鍑芥暟錛屾鍑芥暟騫舵湭浼犻掑弬鏁幫紝浣嗘槸鍦ㄨ繖閲屾垜浠渶瑕佽瀹冧紶閫掑弬鏁幫紝浠g爜濡備笅淇敼錛堝綋鐒跺ご鏂囦歡涓紝瀵瑰0鏄庝篃瑕佸仛淇敼錛屽湪榪欓噷灝變笉浣滆禈榪頒簡錛?/span>
灝?/span>BOOL CDataStatus::OnInitDialog()
{
CDialogBar::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
鏀逛負錛?/span>
BOOL CDataStatus::OnInitDialog(UINT wParam,LONG lParam)
{
//CDialogBar::OnInitDialog();
// TODO: Add extra initialization here
BOOL bRet = HandleInitDialog(wParam,lParam);
if (!UpdateData(FALSE))
{
TRACE("InitCDataStatus Failed錛?/span>");
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
浜屻?/span>鍦ㄦ鏋剁被涓疄鐜拌媧劇敓綾葷殑瀵硅薄鍖?/span>
棣栧厛錛屽湪妗嗘灦綾葷殑澶存枃浠跺唴澹版槑瀹炰緥瀵硅薄錛屾湰渚嬪疄渚嬪寲錛?/span>CDataStatus m_wndDataStatus;褰撶劧澶存枃浠朵腑涓嶅彲閬垮厤瑕佸寘鍚柊媧劇敓綾葷殑澶存枃浠躲?/span>
鍏舵錛屽湪妗嗘灦綾葷殑OnCreate鍑芥暟鍐呭垱寤哄璞″茍灝嗗璞$粦瀹氬璇濇璧勬簮銆傚艦寮忎笌鍒涘緩ToolBar鍘熺悊涓鏍鳳紝鏈緥瀹炰緥濡備笅錛?/span>
if (!m_wndDataStatus.Create(this,IDD_DATASTATUS,WS_VISIBLE|WS_CHILD
|CBRS_SIZE_DYNAMIC|CBRS_BOTTOM,IDD_DATASTATUS))
{
TRACE0("Failed to create CDataStatus bar!");
return -1;
}
鍐嶆錛屾渶涓哄叧閿殑涓鐐瑰氨鏄噸鍐欐鏋剁被鐨?/span>OnCmdMsg铏氬嚱鏁般傚鏋滀笉閲嶅啓璇ュ嚱鏁幫紝閭d箞涓嶅厜DDX鍔熻兘鏃犳硶瀹炵幇錛岃繛鏈鍩烘湰鐨?/span>OnCommand浜嬩歡閮芥棤娉曞疄鐜般傝屼笖榪樺緱鎵嬪伐娣誨姞浠g爜錛屽艦寮忓涓嬶細
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: Add your specialized code here and/or call the base class
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
鏀逛負錛?/span>
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: Add your specialized code here and/or call the base class
if (m_wndDataStatus.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))
return TRUE;
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
涓夈?/span>鍦?/span>CReBar涓婃坊鍔犺瀹炰緥鍖栧璞?/span>
鍏跺疄榪欎竴姝ュ掓槸鐩稿綋綆鍗曪紝鍙槸鑷繁浠ュ墠娌$敤榪囪繖涓被錛屾墍浠ュ湪榪欓噷涔熼『渚跨敤浜嗕竴涓嬨?/span>
棣栧厛錛屽湪妗嗘灦綾葷殑澶存枃浠朵腑鐢?/span>CRebar澹版槑涓涓璞★紝濡?/span>CReBar m_wndReBar;
鍏舵錛屽湪妗嗘灦綾葷殑浠g爜鏂囦歡涓殑OnCreat鍑芥暟浣撳唴錛岀敓鎴愬璞★紝浠g爜濡備笅錛?/span>
if (!m_wndReBar.Create(this,RBS_BANDBORDERS,WS_CHILD |
WS_VISIBLE| CBRS_BOTTOM|WS_CLIPSIBLINGS|WS_CLIPCHILDREN))
{
TRACE0("Failed to create Rebar \n");
return -1;
}
鍐嶆錛屽氨鏄皢鎵瑕佹坊鍔犵殑toolbar浠ュ強鏂扮敓鎴愮殑CDataStatus瀵硅薄m_wndDataStatus鍔犺繘Rebar鐨勫璞?/span>m_wndReBar涓紝浠g爜濡備笅錛?/span>
m_wndReBar.AddBar(&m_wndDataStatus,NULL,NULL,
RBBS_GRIPPERALWAYS|RBBS_FIXEDBMP);