锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浠ヤ笅鏈粡璇存槑錛宭istctrl榛樿view 椋庢牸涓簉eport 鐩稿叧綾誨強澶勭悊鍑芥暟 MFC錛欳ListCtrl綾?/p>
SDK錛氫互 “ListView_”寮澶寸殑涓浜涘畯銆傚 ListView_InsertColumn LVS_ICON: 涓烘瘡涓猧tem鏄劇ず澶у浘鏍?br> LVS_SMALLICON: 涓烘瘡涓猧tem鏄劇ず灝忓浘鏍?br> LVS_LIST: 鏄劇ず涓鍒楀甫鏈夊皬鍥炬爣鐨刬tem 鐩磋鐨勭悊瑙o細windows璧勬簮綆$悊鍣紝“鏌ョ湅”鏍囩涓嬬殑“澶у浘鏍囷紝灝忓浘鏍囷紝鍒楄〃錛岃緇嗚祫鏂?#8221; LONG lStyle; m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//鎻掑叆鍒?br> m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 ); int nIndex = 0; m_list.SetExtendedStyle(LVS_EX_CHECKBOXES); 鏂規硶浜岋細 TCHAR szBuf[1024]; 鍏充簬寰楀埌璁劇疆item鐨勭姸鎬侊紝榪樺彲浠ュ弬鑰僲sdn鏂囩珷 LVCOLUMN lvcol; nColNum = 0; 鏂規硶涓錛?br> while ( m_list.DeleteColumn (0)) 鏂規硶浜岋細 娣誨姞listctrl鎺т歡鐨凬M_CLICK娑堟伅鐩稿簲鍑芥暟 娣誨姞listctrl鎺т歡鐨凬M_CLICK娑堟伅鐩稿簲鍑芥暟 娣誨姞listctrl鎺т歡鐨凬M_RCLICK娑堟伅鐩稿簲鍑芥暟 娣誨姞listctrl鎺т歡鐨凩VN_ITEMCHANGED娑堟伅鐩稿簲鍑芥暟 17. 鏀瑰彉閫変腑琛岀殑棰滆壊 ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST1, OnDrawColorForMyList ) //涓烘敼鍙橀鑹叉坊鍔犵殑娑堟伅 鍐嶆坊鍔犵被鎴愬憳鍑芥暟,灝監K浜? 鍦ㄧ▼搴忎腑鎸囧畾棰滆壊涓鑸瘯鐢≧GB鍑芥暟,鍒嗗埆杈撳叆R銆丟銆丅鍊箋俁GB鍑芥暟榪斿洖棰滆壊鍊?Long)銆傚鏋滃湪紼嬪簭涓洿鎺ユ寚瀹氶鑹插搴旂殑鍊鹼紝鍙互紼嶅井鍔犲揩紼嬪簭鐨勮繍琛岄熷害銆傜壒鍒湪浣垮崟鍙岃鏄劇ず涓嶅悓棰滆壊絳夐綣佽皟鐢≧GB鍑芥暟鏃訛紝鏁堟灉瑕佸ソ涓浜涖?nbsp; //鏇村淇℃伅錛?a >http://www.webcha.com/gongju/chaxun1/search_121.htm http://www.wy265.com/cha/rgbyanse.htm
渚嬶細CString csStr;
CString( const CString& stringSrc );
渚嬶細CString csStr("ABCDEF涓枃123456");
CString csStr2(csStr);
CString( TCHAR ch, int nRepeat = 1 );
渚嬶細CString csStr('a',5);
//csStr="aaaaa"
CString( LPCTSTR lpch, int nLength );
渚嬶細CString csStr("abcdef",3);
//csStr="abc"
CString( LPCWSTR lpsz );
渚嬶細wchar_t s[]=L"abcdef";
CString csStr(s);
//csStr=L"abcdef"
CString( const unsigned char* psz );
渚嬶細const unsigned char s[]="abcdef";
const unsigned char* sp=s;
CString csStr(sp);
//csStr="abcdef"
CString( LPCSTR lpsz );
渚嬶細CString csStr("abcdef");
//csStr="abcdef"
榪斿洖瀛楃涓茬殑闀垮害錛屼笉鍖呭惈緇撳熬鐨勭┖瀛楃銆?br>渚嬶細csStr="ABCDEF涓枃123456";
printf("%d",csStr.GetLength()); //16
棰犲掑瓧絎︿覆鐨勯『搴?br>渚嬶細csStr="ABCDEF涓枃123456";
csStr.MakeReverse();
cout<<csStr; //654321鏂囦腑FEDCBA
灝嗗皬鍐欏瓧姣嶈漿鎹負澶у啓瀛楁瘝
渚嬶細csStr="abcdef涓枃123456";
csStr.MakeUpper();
cout<<csStr; //ABCDEF涓枃123456
灝嗗ぇ鍐欏瓧姣嶈漿鎹負灝忓啓瀛楁瘝
渚嬶細csStr="ABCDEF涓枃123456";
csStr.MakeLower();
cout<<csStr; //abcdef涓枃123456
鍖哄垎澶у皬鍐欐瘮杈冧袱涓瓧絎︿覆錛岀浉絳夋椂榪斿洖0錛屽ぇ浜庢椂榪斿洖1錛屽皬浜庢椂榪斿洖-1
渚嬶細csStr="abcdef涓枃123456";
csStr2="ABCDEF涓枃123456";
cout<<csStr.CompareNoCase(csStr2); //0
涓嶅尯鍒嗗ぇ灝忓啓姣旇緝涓や釜瀛楃涓詫紝鐩哥瓑鏃惰繑鍥?錛屽ぇ浜庢椂榪斿洖1錛屽皬浜庢椂榪斿洖-1
渚嬶細csStr="abcdef涓枃123456";
csStr2="ABCDEF涓枃123456";
cout<<csStr.CompareNoCase(csStr2); //-1
鍒犻櫎瀛楃錛屽垹闄や粠涓嬫爣nIndex寮濮嬬殑nCount涓瓧絎?br>渚嬶細csStr="ABCDEF";
csStr.Delete(2,3);
cout<<csStr; // ABF
//褰搉Index榪囧ぇ錛岃秴鍑哄鍍忔墍鍦ㄥ唴瀛樺尯鍩熸椂錛屽嚱鏁版病鏈変換浣曟搷浣溿?br>//褰搉Index涓鴻礋鏁版椂錛屼粠絎竴涓瓧絎﹀紑濮嬪垹闄ゃ?br>//褰搉Count榪囧ぇ錛屽鑷村垹闄ゅ瓧絎﹁秴鍑哄鍍忔墍鍦ㄥ唴瀛樺尯鍩熸椂錛屼細鍙戠敓鏃犳硶棰勬枡鐨勭粨鏋溿?br>//褰搉Count涓鴻礋鏁版椂錛屽嚱鏁版病鏈変換浣曟搷浣溿?/font>
int Insert( int nIndex, LPCTSTR pstr )
鍦ㄤ笅鏍囦負nIndex鐨勪綅緗紝鎻掑叆瀛楃鎴栧瓧絎︿覆銆傝繑鍥炴彃鍏ュ悗瀵硅薄鐨勯暱搴?br>渚嬶細csStr="abc";
csStr.Insert(2,'x');
cout<<csStr; //abxc
csStr.Insert(2,"xyz");
cout<<csStr; //abxyzc
//褰搉Index涓鴻礋鏁版椂錛屾彃鍏ュ湪瀵硅薄寮澶?br>//褰搉Index瓚呭嚭瀵硅薄鏈熬鏃訛紝鎻掑叆鍦ㄥ璞℃湯灝?/font>
縐婚櫎瀵硅薄鍐呯殑鎸囧畾瀛楃銆傝繑鍥炵Щ闄ょ殑鏁扮洰
渚嬶細csStr="aabbaacc";
csStr.Remove('a');
cout<<csStr; //bbcc
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
鏇挎崲瀛椾覆
渚嬶細csStr="abcdef";
csStr.Replace('a','x');
cout<<csStr; //xbcdef
csStr="abcdef";
csStr.Replace("abc","xyz");
cout<<csStr; //xyzdef
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
浠庡乏鍒犻櫎瀛楃錛岃鍒犵殑瀛楃涓巆hTarget鎴杔pszTargets鍖歸厤錛屼竴鐩村垹鍒扮涓涓笉鍖歸厤鐨勫瓧絎︿負姝?br>渚嬶細csStr="aaabaacdef";
csStr.TrimLeft('a');
cout<<csStr; //baacdef
csStr.TrimLeft("ab");
cout<<csStr; //cdef
//鏃犲弬鏁版椂鍒犻櫎絀烘牸
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
浠庡彸鍒犻櫎瀛楃錛岃鍒犵殑瀛楃涓巆hTarget鎴杔pszTargets鍖歸厤錛屼竴鐩村垹鍒扮涓涓笉鍖歸厤鐨勫瓧絎︿負姝?br>渚嬶細csStr="abcdeaafaaa";
csStr.TrimRight('a');
cout<<csStr; //abcdeaaf
csStr="abcdeaafaaa";
csStr.TrimRight("fa");
cout<<csStr; //abcde
//鏃犲弬鏁版椂鍒犻櫎絀烘牸
娓呯┖
渚嬶細csStr="abcdef";
csStr.Empty();
printf("%d",csStr.GetLength()); //0
嫻嬭瘯瀵硅薄鏄惁涓虹┖錛屼負絀烘椂榪斿洖闆訛紝涓嶄負絀烘椂榪斿洖闈為浂
渚嬶細csStr="abc";
cout<<csStr.IsEmpty(); //0;
cout<<csStr.IsEmpty(); //1;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR pstr, int nStart ) const;
鏌ユ壘瀛椾覆錛宯Start涓哄紑濮嬫煡鎵劇殑浣嶇疆銆傛湭鎵懼埌鍖歸厤鏃惰繑鍥?1錛屽惁鍒欒繑鍥炲瓧涓茬殑寮濮嬩綅緗?br>渚嬶細csStr="abcdef";
cout<<csStr.Find('b'); //1
cout<<csStr.Find('b',3); //-1
cout<<csStr.Find('b',0); //1
cout<<csStr.Find("de",4); //-1
cout<<csStr.Find("de",0); //3
//褰搉Start瓚呭嚭瀵硅薄鏈熬鏃訛紝榪斿洖-1銆?br>//褰搉Start涓鴻礋鏁版椂錛岃繑鍥?1銆?/font>
鏌ユ壘lpszCharSet涓換鎰忎竴涓瓧絎﹀湪CString瀵硅薄涓殑鍖歸厤浣嶇疆銆傛湭鎵懼埌鏃惰繑鍥?1錛屽惁鍒欒繑鍥炲瓧涓茬殑寮濮嬩綅緗?br>渚嬶細csStr="abcdef";
cout<<csStr.FindOneOf("cxy"); //2
榪斿洖瀵硅薄涓笌lpszCharSet涓換鎰忓尮閰嶇殑絎竴涓瓧絎︿箣鍓嶇殑瀛愪覆
渚嬶細csStr="abcdef";
cout<<csStr.SpanExcluding("cf"); //ab
浠庡璞′腑鏌ユ壘涓巐pszCharSe涓換鎰忓瓧絎︿笉鍖歸厤鐨勫瓧絎︼紝騫惰繑鍥炵涓涓笉鍖歸厤瀛楃涔嬪墠鐨勫瓧涓?br>渚嬶細csStr="abcdef";
cout<<csStr.SpanIncluding("fdcba"); //abcd
浠庡悗鍚戝墠鏌ユ壘絎竴涓尮閰嶏紝鎵懼埌鏃惰繑鍥炰笅鏍囥傛病鎵懼埌鏃惰繑鍥?1
渚嬶細csStr="abba";
cout<<csStr.ReverseFind('a'); //3
void Format( UINT nFormatID, ... );
鏍煎紡鍖栧璞★紝涓嶤璇█鐨剆printf鍑芥暟鐢ㄦ硶鐩稿悓
渚嬶細csStr.Format("%d",13);
cout<<csStr; //13
榪斿洖涓嬫爣涓簄Index鐨勫瓧絎︼紝涓庡瓧絎︿覆鐨刐]鐢ㄦ硶鐩稿悓
渚嬶細csStr="abcdef";
cout<<csStr.GetAt(2); //c
//褰搉Index涓鴻礋鏁版垨瓚呭嚭瀵硅薄鏈熬鏃訛紝浼氬彂鐢熸棤娉曢鏂欑殑緇撴灉銆?/font>
緇欎笅鏍囦負nIndex鐨勫瓧絎﹂噸鏂拌祴鍊?br>渚嬶細csStr="abcdef";
csStr.SetAt(2,'x');
cout<<csStr; //abxdef
//褰搉Index涓鴻礋鏁版垨瓚呭嚭瀵硅薄鏈熬鏃訛紝浼氬彂鐢熸棤娉曢鏂欑殑緇撴灉銆?/font>
浠庡乏鍙栧瓧涓?br>渚嬶細csStr="abcdef";
cout<<csStr.Left(3); //abc
//褰搉Count絳変簬0鏃訛紝榪斿洖絀恒?br>//褰搉Count涓鴻礋鏁版椂錛岃繑鍥炵┖銆?br>//褰搉Count澶т簬瀵硅薄闀垮害鏃訛紝榪斿洖鍊間笌瀵硅薄鐩稿悓銆?/font>
浠庡彸鍙栧瓧涓?br>渚嬶細csStr="abcdef";
cout<<csStr.Right(3); //def
//褰搉Count絳変簬0鏃訛紝榪斿洖絀恒?br>//褰搉Count涓鴻礋鏁版椂錛岃繑鍥炵┖銆?br>//褰搉Count澶т簬瀵硅薄闀垮害鏃訛紝榪斿洖鍊間笌瀵硅薄鐩稿悓銆?/font>
CString Mid( int nFirst, int nCount ) const;
浠庝腑闂村紑濮嬪彇瀛椾覆
渚嬶細csStr="abcdef";
cout<<csStr.Mid(2); //cdef
cout<<csStr.Mid(2,3); //cde
//褰搉First涓?鍜屼負璐熸暟鏃訛紝浠庣涓涓瓧絎﹀紑濮嬪彇銆?br>//褰搉First絳変簬瀵硅薄鏈熬鏃訛紝榪斿洖絀哄瓧涓層?br>//褰搉First瓚呭嚭瀵硅薄鏈熬鏃訛紝浼氬彂鐢熸棤娉曢鏂欑殑緇撴灉銆?br>//褰搉Count瓚呭嚭瀵硅薄鏈熬鏃訛紝榪斿洖浠巒First寮濮嬩竴鐩村埌瀵硅薄鏈熬鐨勫瓧涓?br>//褰搉Count涓?鍜屼負璐熸暟鏃訛紝榪斿洖絀哄瓧涓層?/font>
鐢寵鏂扮殑絀洪棿錛屽茍榪斿洖鎸囬拡
渚嬶細csStr="abcde";
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,"12345");
csStr.ReleaseBuffer();
pStr=NULL;
cout<<csStr //12345
//浣跨敤瀹孏etBuffer鍚庯紝蹇呴』浣跨敤ReleaseBuffer浠ユ洿鏂板璞″唴閮ㄦ暟鎹紝鍚﹀垯浼氬彂鐢熸棤娉曢鏂欑殑緇撴灉銆?/font>
浣跨敤GetBuffer鍚庯紝蹇呴』浣跨敤ReleaseBuffer浠ユ洿鏂板璞″唴閮ㄦ暟鎹?br>渚嬶細csStr="abc";
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,"12345");
cout<<csStr.GetLength(); //3(閿欒鐨勭敤娉?
csStr.ReleaseBuffer();
cout<<csStr.GetLength(); //5(姝g‘)
//CString瀵硅薄鐨勪換浣曟柟娉曢兘搴斿湪ReleaseBuffer涔嬪悗璋冪敤
鐢寵鏂扮殑絀洪棿錛屽茍榪斿洖鎸囬拡
渚嬶細csStr="abc";
csStr.GetBufferSetLength(20);
cout<<csStr; //abc
count<<csStr.GetLength(); //3;
//浣跨敤GetBufferSetLength鍚庡彲浠ヤ笉蹇呬嬌鐢≧eleaseBuffer銆?br>
]]>
1. CListCtrl 椋庢牸
LVS_REPORT: 鏄劇ずitem璇︾粏璧勬枡
2. 璁劇疆listctrl 椋庢牸鍙婃墿灞曢鏍?/span>
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//鑾峰彇褰撳墠紿楀彛style
lStyle &= ~LVS_TYPEMASK; //娓呴櫎鏄劇ず鏂瑰紡浣?br> lStyle |= LVS_REPORT; //璁劇疆style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//璁劇疆style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//閫変腑鏌愯浣挎暣琛岄珮浜紙鍙傜敤涓巖eport椋庢牸鐨刲istctrl錛?br> dwStyle |= LVS_EX_GRIDLINES;//緗戞牸綰匡紙鍙傜敤涓巖eport椋庢牸鐨刲istctrl錛?br> dwStyle |= LVS_EX_CHECKBOXES;//item鍓嶇敓鎴恈heckbox鎺т歡
m_list.SetExtendedStyle(dwStyle); //璁劇疆鎵╁睍椋庢牸
娉細listview鐨剆tyle璇鋒煡闃卪sdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
3. 鎻掑叆鏁版嵁
int nRow = m_list.InsertItem(0, “11”);//鎻掑叆琛?br> m_list.SetItemText(nRow, 1, “jacky”);//璁劇疆鏁版嵁
4. 涓鐩撮変腑item
閫変腑style涓殑Show selection always錛屾垨鑰呭湪涓婇潰絎?鐐逛腑璁劇疆LVS_SHOWSELALWAYS
5. 閫変腑鍜屽彇娑堥変腑涓琛?/span>
//閫変腑
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//鍙栨秷閫変腑
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
6. 寰楀埌listctrl涓墍鏈夎鐨刢heckbox鐨勭姸鎬?/span>
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("絎?d琛岀殑checkbox涓洪変腑鐘舵?), i);
AfxMessageBox(str);
}
}
7. 寰楀埌listctrl涓墍鏈夐変腑琛岀殑搴忓彿
鏂規硶涓錛?br> CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("閫変腑浜嗙%d琛?), i);
AfxMessageBox(str);
}
}
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
8. 寰楀埌item鐨勪俊鎭?/span>
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);
Q173242: Use Masks to Set/Get Item States in CListCtrl
http://support.microsoft.com/kb/173242/en-us
9. 寰楀埌listctrl鐨勬墍鏈夊垪鐨刪eader瀛楃涓插唴瀹?/span>
char str[256];
int nColNum;
CString strColumnName[4];//鍋囧鏈?鍒?/p>
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
10. 浣縧istctrl涓竴欏瑰彲瑙侊紝鍗蟲粴鍔ㄦ粴鍔ㄦ潯
m_list.EnsureVisible(i, FALSE);
11. 寰楀埌listctrl鍒楁暟
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
12. 鍒犻櫎鎵鏈夊垪
鍥犱負浣犲垹闄や簡絎竴鍒楀悗錛屽悗闈㈢殑鍒椾細渚濇鍚戜笂縐誨姩銆?/p>
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
13. 寰楀埌鍗曞嚮鐨刲istctrl鐨勮鍒楀彿
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// 鏂規硶涓錛?br> /*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("鍗曞嚮鐨勬槸絎?d琛岀%d鍒?, lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*/
// 鏂規硶浜?
/*
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("鍗曞嚮鐨勬槸絎?d琛岀%d鍒?,
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult = 0;
}
14. 鍒ゆ柇鏄惁鐐瑰嚮鍦╨istctrl鐨刢heckbox涓?/span>
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
UINT nFlag;
int nItem = m_list.HitTest(point, &nFlag);
//鍒ゆ柇鏄惁鐐瑰湪checkbox涓?br> if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("鐐瑰湪listctrl鐨刢heckbox涓?);
}
*pResult = 0;
}
15. 鍙抽敭鐐瑰嚮listctrl鐨刬tem寮瑰嚭鑿滃崟
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
*pResult = 0;
}
16. item鍒囨崲鐒︾偣鏃?鍖呮嫭鐢ㄩ敭鐩樺拰榧犳爣鍒囨崲item鏃?錛岀姸鎬佺殑涓浜涘彉鍖栭『搴?/span>
void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CString sTemp;
if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&
(pNMListView->uNewState & LVIS_FOCUSED) == 0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}
if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
(pNMListView->uNewState & LVIS_SELECTED) == 0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
(pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}
*pResult = 0;
}
棣栧厛鏄坊鍔犱互涓嬫秷鎭?/p>

//鏀瑰彉 m_List 鎺т歡鍗曡鐨勯鑹?/span>
void CSSDTDlg::OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult )

{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNmHdr );
*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
//閫変腑琛屾樉紺哄瓧浣撲負綰㈣壊,鍚﹀垯涓洪粦鑹?/span>
if(m_item == nItem) //璁劇疆涓虹孩鑹?/span>
{
clrNewTextColor = RGB( 255, 0, 0 );
}
else //璁劇疆涓洪粦鑹?/span>
{
clrNewTextColor = RGB( 0, 0, 0 );
}
//璁劇疆鑳屾櫙鑹?/span>
if( nItem%2 ==0 )
{
clrNewBkColor = RGB( 240, 240, 240 ); //鍋舵暟琛岃儗鏅壊涓虹伆鑹?/span>
}
else
{
clrNewBkColor = RGB( 255, 255, 255 ); //濂囨暟琛岃儗鏅壊涓虹櫧鑹?/span>
}
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
*pResult = CDRF_DODEFAULT;
}
}

鏇村鎶宸у弬瑙佷互涓嬮摼鎺ワ細
http://blog.csdn.net/danforn/archive/2008/06/03/2508070.aspx
]]>
涓嬭〃鏄竴浜涘父鐢ㄩ鑹茬殑鍊?nbsp;
Colour Red Green Blue 鍊?nbsp;
榛戣壊 Black 0 0 0 0
鐧借壊 White 255 255 255 16777215
鐏拌壊 Gray 192 192 192 12632256
娣辯伆鑹?nbsp; Dark Grey 128 128 128 8421504
綰㈣壊 Red 255 0 0 255
娣辯孩鑹?nbsp; Dark Red 128 0 0 128
緇胯壊 Green 0 255 0 65280
娣辯豢鑹?nbsp; Dark Green 0 128 0 32768
钃濊壊 Blue 0 0 255 16711680
娣辮摑鑹?nbsp; Dark Blue 0 0 128 8388608
绱孩鑹?nbsp; Magenta 255 0 255 16711935
娣辯傳綰?nbsp; Dark Magenta 128 0 128 8388736
绱壊 Cyan 0 255 255 16776960
娣辯傳 Dark Cyan 0 128 128 8421376
榛勮壊 Yellow 255 255 0 65535
媯曡壊 Brown 128 128 0 32896
鐗規畩棰滆壊
Button Face 79741120
Text 33554432
Background 1090519039
App. Workspace 276856960
RGB鍑芥暟璁$畻鍏紡: 棰滆壊鍊?nbsp; 錛?nbsp; (65536 * Blue) + (256 * Green) + (Red)
==============================================
rgb(r,g,b)=r+g*256+b*256*256
=================================
Dim color As Double
Dim r, g, b As Integer
color = RGB(0, 0, 0)
r = color Mod 256
g = (color \ 256) Mod 256
b = (color \ 256 \ 256) Mod 256
Print r
Print g
Print b
]]>
閫夋嫨鐩綍瀵硅瘽妗?br>
//閫夋嫨鐩綍鎸夐挳
void CDcPackerDlg::OnBnClickedDecgen() 

{
char szPath[MAX_PATH]; //瀛樻斁閫夋嫨鐨勭洰褰曡礬寰?nbsp;
CString str;
ZeroMemory(szPath, sizeof(szPath)); 
BROWSEINFO bi;
bi.hwndOwner = m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szPath;
bi.lpszTitle = "璇烽夋嫨闇瑕佹墦鍖呯殑鐩綍錛?/span>";
bi.ulFlags = 0;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
//寮瑰嚭閫夋嫨鐩綍瀵硅瘽妗?/span>
LPITEMIDLIST lp = SHBrowseForFolder(&bi); 
if(lp && SHGetPathFromIDList(lp, szPath)) 
{
str.Format("閫夋嫨鐨勭洰褰曚負 %s", szPath);
AfxMessageBox(str); 

}
else
AfxMessageBox("鏃犳晥鐨勭洰褰曪紝璇烽噸鏂伴夋嫨");
}
閫夋嫨鏂囦歡瀵硅瘽妗?br>
CString CDcPackerDlg::BootOpenDialog() //榪斿洖閫夋嫨鐨勬枃浠跺悕縐?/span>

{
CString strFile = _T("");
CFileDialog dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);
if (dlgFile.DoModal())
{
strFile = dlgFile.GetPathName();
}
return strFile;
}
//鍔犺澆鏂囦歡鎸夐挳
void CDcPackerDlg::OnBnClickedSelectdec()

{
// TODO: Add your control notification handler code here
m_strDescPath = ""; //綾葷殑鎴愬憳鍙橀噺
//"鎵撳紑鏂囦歡"瀵硅瘽妗嗭紝閫夋嫨鏂囦歡錛岃繑鍥炲叾璺緞
m_strDescPath = BootOpenDialog();

}
]]>
涓.鏁版嵁搴撴妧鏈垵姝?
1.ODBC鍩烘湰姒傚康
ODBC(Open Database Connectivity錛屽紑鏀炬暟鎹簱浜掕繛)鏄井杞叕鍙稿紑鏀炬湇鍔$粨鏋?WOSA錛學indows Open Services Architecture)涓湁鍏蟲暟鎹簱鐨勪竴涓粍鎴愰儴鍒嗭紝瀹冨緩绔嬩簡涓緇勮鑼冿紝騫舵彁渚涗簡涓緇勫鏁版嵁搴撹闂殑鏍囧噯API錛堝簲鐢ㄧ▼搴忕紪紼嬫帴鍙o級銆傝繖浜汚PI鍒╃敤SQL鏉ュ畬鎴愬叾澶ч儴鍒嗕換鍔°侽DBC鏈韓涔熸彁渚涗簡瀵筍QL璇█鐨勬敮鎸侊紝鐢ㄦ埛鍙互鐩存帴灝哠QL璇彞閫佺粰ODBC銆?
銆銆涓涓熀浜嶰DBC鐨勫簲鐢ㄧ▼搴忓鏁版嵁搴撶殑鎿嶄綔涓嶄緷璧栦換浣旸BMS錛屼笉鐩存帴涓嶥BMS鎵撲氦閬擄紝鎵鏈夌殑鏁版嵁搴撴搷浣滅敱瀵瑰簲鐨凞BMS鐨凮DBC椹卞姩紼嬪簭瀹屾垚銆備篃灝辨槸璇達紝涓嶈鏄疐oxPro銆丄ccess榪樻槸Oracle鏁版嵁搴擄紝鍧囧彲鐢∣DBC API榪涜璁塊棶銆傜敱姝ゅ彲瑙侊紝ODBC鐨勬渶澶т紭鐐規槸鑳戒互緇熶竴鐨勬柟寮忓鐞嗘墍鏈夌殑鏁版嵁搴撱?
銆銆涓涓畬鏁寸殑ODBC鐢變笅鍒楀嚑涓儴浠剁粍鎴愶細
銆銆搴旂敤紼嬪簭(Application)銆?
銆銆ODBC綆$悊鍣?Administrator)銆傝紼嬪簭浣嶄簬Windows 95鎺у埗闈㈡澘(Control Panel)鐨?2浣峅DBC鍐咃紝鍏朵富瑕佷換鍔℃槸綆$悊瀹夎鐨凮DBC椹卞姩紼嬪簭鍜岀鐞嗘暟鎹簮銆?
銆銆椹卞姩紼嬪簭綆$悊鍣?Driver Manager)銆傞┍鍔ㄧ▼搴忕鐞嗗櫒鍖呭惈鍦∣DBC32.DLL涓紝瀵圭敤鎴鋒槸閫忔槑鐨勩傚叾浠誨姟鏄鐞哋DBC椹卞姩紼嬪簭錛屾槸ODBC涓渶閲嶈鐨勯儴浠躲?
銆銆ODBC API銆?
銆銆ODBC 椹卞姩紼嬪簭銆傛槸涓浜汥LL錛屾彁渚涗簡ODBC鍜屾暟鎹簱涔嬮棿鐨勬帴鍙c?
銆銆鏁版嵁婧愩傛暟鎹簮鍖呭惈浜嗘暟鎹簱浣嶇疆鍜屾暟鎹簱綾誨瀷絳変俊鎭紝瀹為檯涓婃槸涓縐嶆暟鎹繛鎺ョ殑鎶借薄銆?
銆銆搴旂敤紼嬪簭瑕佽闂竴涓暟鎹簱錛岄鍏堝繀欏葷敤ODBC綆$悊鍣ㄦ敞鍐屼竴涓暟鎹簮錛岀鐞嗗櫒鏍規嵁鏁版嵁婧愭彁渚涚殑鏁版嵁搴撲綅緗佹暟鎹簱綾誨瀷鍙奜DBC椹卞姩紼嬪簭絳変俊鎭紝寤虹珛璧稯DBC涓庡叿浣撴暟鎹簱鐨勮仈緋匯傝繖鏍鳳紝鍙搴旂敤紼嬪簭灝嗘暟鎹簮鍚嶆彁渚涚粰ODBC錛孫DBC灝辮兘寤虹珛璧蜂笌鐩稿簲鏁版嵁搴撶殑榪炴帴銆?
銆銆鍦∣DBC涓紝ODBC API涓嶈兘鐩存帴璁塊棶鏁版嵁搴擄紝蹇呴』閫氳繃椹卞姩紼嬪簭綆$悊鍣ㄤ笌鏁版嵁搴撲氦鎹俊鎭傞┍鍔ㄧ▼搴忕鐞嗗櫒璐熻矗灝嗗簲鐢ㄧ▼搴忓ODBC API鐨勮皟鐢ㄤ紶閫掔粰姝g‘鐨勯┍鍔ㄧ▼搴忥紝鑰岄┍鍔ㄧ▼搴忓湪鎵ц瀹岀浉搴旂殑鎿嶄綔鍚庯紝灝嗙粨鏋滈氳繃椹卞姩紼嬪簭綆$悊鍣ㄨ繑鍥炵粰搴旂敤紼嬪簭銆?
銆銆鍦ㄨ闂甇DBC鏁版嵁婧愭椂闇瑕丱DBC椹卞姩紼嬪簭鐨勬敮鎸併傜敤Visual C++ 5.0瀹夎紼嬪簭鍙互瀹夎SQL Server銆? Access銆? Paradox銆? dBase銆? FoxPro銆? Excel銆? Oracle 鍜孧icrosoft Text絳夐┍鍔ㄧ▼搴忥紟鍦ㄧ己鐪佹儏鍐典笅錛孷C5.0鍙細瀹夎SQL Server銆? Access銆? FoxPro鍜宒Base鐨勯┍鍔ㄧ▼搴忥紟濡傛灉鐢ㄦ埛闇瑕佸畨瑁呭埆鐨勯┍鍔ㄧ▼搴忥紝鍒欓渶瑕侀噸鏂拌繍琛孷C 5.0鐨勫畨瑁呯▼搴忓茍閫夋嫨鎵闇鐨勯┍鍔ㄧ▼搴忋?
2.ADO瀵硅薄璁塊棶妯″瀷
1)ADO鏄井杞暣涓狢OM鎴樼暐浣撶郴涓殑涓涓粍鎴愰儴鍒?
銆 媧誨姩鏁版嵁瀵硅薄錛圓DO錛夋槸涓緇勭敱寰蔣鎻愪緵鐨凜OM緇勪歡銆? ADO寤虹珛鍦ㄥ井杞墍鎻愬$殑COM浣撶郴緇撴瀯涔嬩笂錛屽畠鐨勬墍鏈夋帴鍙i兘鏄嚜鍔ㄥ寲鎺ュ彛錛屽洜姝ゅ湪C++銆乂isualBasic銆丏elphi絳夋敮鎸丆OM鐨勫紑鍙戣璦涓氳繃鎺ュ彛閮藉彲浠ヨ闂埌ADO銆侫DO閫氳繃浣跨敤OLE DB榪欎竴鏂版妧鏈疄鐜頒簡浠ョ浉鍚屾柟寮忓彲浠ヨ闂叧緋繪暟鎹簱銆佹枃鏈枃浠躲侀潪鍏崇郴鏁版嵁搴撱佺儲寮曟湇鍔″櫒鍜屾椿璺冪洰褰曟湇鍔$瓑鐨勬暟鎹紝鎵╁ぇ浜嗗簲鐢ㄧ▼搴忎腑鍙嬌鐢ㄧ殑鏁版嵁婧愯寖鍥達紝浠庤屾垚涓哄井杞暣涓狢OM鎴樼暐浣撶郴涓闂暟鎹簮緇勪歡鐨勯閫夛紝鏄疧DBC鐨勬浛浠d駭鍝併?
2)ADO瀵硅薄妯″瀷緇勬垚
銆涓庡井杞殑鍏跺畠鏁版嵁璁塊棶妯″瀷DAO鍜孯DO鐩告瘮錛孉DO瀵硅薄妯″瀷闈炲父綺劇偧錛屼粎鐢變笁涓富瑕佸璞onnection銆丆ommand銆丷ecordset鍜屽嚑涓緟鍔╁璞$粍鎴愩侰onnection瀵硅薄鎻愪緵OLE DB鏁版嵁婧愬拰瀵硅瘽瀵硅薄涔嬮棿鐨勫叧鑱旓紝瀹冮氳繃鐢ㄦ埛鍚嶇О鍜屽彛浠ゆ潵澶勭悊鐢ㄦ埛韜喚鐨勯壌鍒紝騫舵彁渚涗簨鍔″鐞嗙殑鏀寔錛涘畠榪樻彁渚涙墽琛屾柟娉曪紝浠庤岀畝鍖栨暟鎹簮鐨勮繛鎺ュ拰鏁版嵁媯绱㈢殑榪涚▼銆侰ommand瀵硅薄灝佽浜嗘暟鎹簮鍙互瑙i噴鐨勫懡浠わ紝璇ュ懡浠ゅ彲浠ユ槸SQL鍛戒護銆佸瓨鍌ㄨ繃紼嬫垨搴曞眰鏁版嵁婧愬彲浠ョ悊瑙g殑浠諱綍鍐呭銆俁ecord set鐢ㄤ簬琛ㄧず浠庢暟鎹簮涓繑鍥炵殑琛ㄦ牸鏁版嵁錛屽畠灝佽浜嗚褰曢泦鍚堢殑瀵艱埅銆佽褰曟洿鏂般佽褰曞垹闄ゅ拰鏂拌褰曠殑娣誨姞絳夋柟娉曪紝榪樻彁渚涗簡鎵歸噺鏇存柊璁板綍鐨勮兘鍔涖傚叾瀹冭緟鍔╁璞″垯鍒嗗埆鎻愪緵灝佽ADO閿欒銆佸皝瑁呭懡浠ゅ弬鏁板拰灝佽璁板綍闆嗗悎鐨勫垪銆?
銆3)ADO鐨勭壒鐐瑰垎鏋?
銆銆(a)鐢變簬灝佽浜嗚澶氬簳灞傚伐浣滐紝浣跨敤ADO涓庝嬌鐢∣DBC鍑犱箮鏄竴鏍鋒柟渚褲?
銆銆(b) ADO涓嶄粎鍏鋒湁ODBC鐨勪富瑕佸姛鑳斤紝鑰屼笖ADO閫傜敤鐨勬暟鎹簮鐨勮寖鍥磋澶х殑澶氥?
銆銆(c)鍦ㄥ畾涔堿DO璁板綍闆嗗彉閲忓拰鏁版嵁搴撹〃瀛楁緇戝畾綾繪椂錛岃姹傝褰曢泦鐨勫瓧孌靛彉閲忋佺姸鎬佸彉閲忎笌鏁版嵁搴撹〃瀛楁鐨勪釜鏁般侀『搴忓繀欏葷浉鍚屻傝繖涓鐐規瘮鍦‵MC涓嬌鐢∣DBC瑕佸鏉備竴浜涖備絾鍦ㄦ暟鎹簱瀛楁涓嶢DO璁板綍闆嗗瓧孌靛彉閲忕粦瀹氱殑瀹忎腑錛孉DO 鎻愪緵鐨勬暟鎹被鍨嬭榪滃浜嶧MC涓殑RFX錛堝鏃ユ湡鏃墮棿綾誨瀷錛屽湪ODBC涓彧鑳借漿鎹負Cstring綾誨瀷錛夈?
銆銆(d)ADO鍏佽鍚屼竴Connection瀹炰緥涓嬫湁澶氫釜Record set瀹炰緥銆?
4) ADO鍦╒isual C++涓殑浣跨敤
銆銆鍒╃敤寰蔣鍦∕icrsoft Studio 6涓彁渚涚殑ADO2錛屽彲浠ュ湪Visual C++涓嬌鐢ˋDO鎺ュ彛鎿嶇旱SQL SERVER鏁版嵁搴撱傚湪緙栬瘧鍨嬮珮綰ц璦涓嬌鐢ˋDO,姣旇搗鍦ㄤ竴浜涜剼鏈璦錛堝Visual Basic Scropt鍜孞avaScript錛変腑浣跨敤ADO瑕佸洶闅句竴浜涖?
銆銆浠ヤ笅緇欏嚭涓涓猇isual C++涓嬩嬌鐢ˋDO鐨凜onnection瀵硅薄鍙婂叾Record set瀵硅薄鐨勫熀鏈楠わ細
銆銆錛坅錛? 浣跨敤import鎸囦護寮曞叆ADO2緇勪歡
銆銆渚嬶細#import "C:\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
銆銆錛坆錛? 瀹氫箟CADORecordBinding 鐨勬淳鐢熺被錛岀敤浜庣▼搴忎笌鏁版嵁搴撹〃瀛楁鐨勪氦浜掞紝璇ョ被鐨勫畾涔夊彲鍙傝icrsint.h銆?
銆銆渚嬶細
class CIntlive : public CADORecordBinding
{
public:
DBTIMESTAMP m_datetime; //瀹氫箟ADO璁板綍闆嗗瓧孌靛彉閲忥紙涓庢暟鎹簱琛ㄥ瓧孌電浉瀵瑰簲錛?
long m_key;
long m_value;
long m_quality;
WORD m_stsdatetime; //瀹氫箟ADO璁板綍闆嗙姸鎬佸彉閲?
WORD m_stskey;
WORD m_stsvalue;
WORD m_stsquality;
BEGIN_ADO_BINDING(CIntlive) //灝嗘暟鎹簱瀛楁涓嶢DO璁板綍闆嗗瓧孌靛彉閲忕粦瀹?
ADO_VARIABLE_LENGTH_ENTRY2(1,adDBTimeStamp,m_datetime,sizeof(m_datetime),m_stsdatetime,true)
ADO_NUMERIC_ENTRY(2,adInteger,m_key,10,0,m_stskey,true)
ADO_NUMERIC_ENTRY(3,adInteger,m_value,10,0,m_stsvalue,true)
ADO_NUMERIC_ENTRY(4,adInteger,m_quality,10,0,m_stsquality,true)
END_ADO_BINDING()
};
銆銆錛坈錛? 璋冪敤CoInitialize鍒濆鍖朇OM ::CoInitialize(NULL);
銆銆錛坉錛? 澹版槑ADO鐨凜onnection瀵硅薄鎸囬拡鍜孯ecordset瀵硅薄鎸囬拡騫跺垵濮嬪寲銆傦紙綾誨瀷鍚嶅湪 msado15.dll涓凡瀹氫箟錛?
銆銆渚嬶細
_ConnectionPtr pConnection1 = NULL;
_RecordsetPtr rstADO1 = NULL;
銆銆錛坋錛? 瀹氫箟CADORecordBinding媧劇敓綾葷殑瀹炰緥鍙婂叾Bind鎺ュ彛鎸囬拡銆?
銆銆渚嬶細
CIntlive m_intdata;
IADORecordBinding *rstADOBind1 = NULL;
銆銆錛坒錛? 浜х敓Connection瀵硅薄瀹炰緥鍜孯ecord set瀵硅薄瀹炰緥銆?
銆銆渚嬶細
pConnection1.CreateInstance(_uuidof(Connection));
rstADO1.CreateInstance(__uuidof(Recordset)) ;
銆銆錛坓錛? 榪炴帴鍒版暟鎹簱騫舵墦寮Record set瀵硅薄錛屽叾涓璷pen鍑芥暟鐨勫弬鏁扮殑浣跨敤鏂規硶鍙弬瑙佸井杞疢SDN涓瑼DO 鐩稿簲瀵硅薄鍙傛暟鐨凚asic鎻忚堪銆?
銆銆渚?
PConnection1->Open("driver={SQL server};server=servera;uid=sa;pwd=;database=pubs","","",NULL);
rstADO1->Open("data", _variant_t((IDispatch *)pConnection1,true),
adOpenKeyset,adLockBatchOptimistic, adCmdTable);
銆銆錛坔錛? 灝咰ADORecordBinding媧劇敓綾葷殑瀹炰緥鑱旂紪鍒癛ecord set瀵硅薄鐨凚ind鎺ュ彛銆?
銆銆渚?
RstADOBind1->BindToRecordset(&m_intdata);
銆銆錛坕錛? 瀵筊ecord set瀵硅薄瀹炰緥榪涜鎿嶄綔銆傛搷浣滄柟娉曞彲鍙傝寰蔣MSDN涓瑼DO Record set瀵硅薄鐩稿簲鏂規硶鐨凚asic鎻忚堪銆?
銆銆 渚?
rstADO1->Move Next(); //縐誨姩娓告爣鍒頒笅涓鏉¤褰?
rstADO1->Update(_variant_t("quality"),_variant_t("3"))); //淇敼璁板綍鐨剄uality瀛楁鐨勫間負3
rstADO1->Update Batch(adAffectAll)); //灝嗗湪Record set瀵硅薄涓婄殑鎵鏈夋洿鏂頒竴嬈¢佸叆鏁版嵁搴?
銆銆錛坖錛? 鍏抽棴Record set瀵硅薄騫墮噴鏀綛ind鎺ュ彛銆?
銆銆渚?
RstADO1->Close();
RstADOBind2->Release();
銆銆錛坘錛? 鍏抽棴榪炴帴 pConnection1->Close();
銆銆錛坙錛? 璋冪敤CoUnitialize閲婃斁COM璧勬簮 ::CoUninitialize();
銆5) 緇撹
銆銆浣滀負ODBC鐨勬浛浠d駭鍝侊紝ADO紜疄鏈夊叾榪囦漢涔嬪銆傜敱浜嶢DO鏁版嵁婧愬嚑涔庤鐩栦簡鐩墠甯歌鐨勬暟鎹簮綾誨瀷錛屽浜嶰DBC鎵涓嶆敮鎸佺殑鏁版嵁婧愶紝ADO鏃犵枒鏄敮涓鐨勯夋嫨銆傝孉DO鐨勬壒鏇存柊鍔熻兘錛屾洿鏄綉緇滅幆澧冧笅澶ф暟鎹噺鏇存柊搴旂敤鐨勯噸瑕佸洜绱犮傜敱浜嶢DO緙轟箯澶ч噺鐨勭涓夋柟鍘傚晢鐨勬敮鎸侊紝浣垮緱ADO鐩墠榪滀笉濡侽DBC鏅強錛屼絾鍏墮潰鍚戝璞$殑鐗規у皢浣緼DO鍏鋒湁姣旇緝騫塊様鐨勫彂灞曞墠鏅?br>
3.ADO涓嶰DBC鐨勫尯鍒?
鏈夊緢澶氱浣跨敤鏁版嵁搴撶殑鏂規硶錛屽澶у鏁版暟鎹簱鏉ヨ錛岄夋嫨C++榪欑浜у搧涔熻騫朵笉閫傚疁銆傛垜浠煡閬擄紝鍍廳BASE IV錛孎oxPro錛孫racle鍜孉ccess榪欐牱鐨勪駭鍝佹槸瀹屽叏浠ユ暟鎹簱綆$悊涓轟腑蹇冪殑銆備簨瀹炰笂錛岃繖浜涗駭鍝侀潪甯稿杽浜庡垱寤烘暟鎹簱綆$悊鍣紝浠ヨ嚦浜庡畠浠‘瀹炲茍涓嶅杽浜庡仛澶鍏跺畠鐨勫伐浣溿傚嵆浣胯鐢ㄦ洿閫氱敤鍖栬岄潪鏇翠笓鐢ㄥ寲鐨勬暟鎹簱浜у搧鏉ユ墽琛屼竴浜涚被鍨嬬殑宸ヤ綔錛屽湪浣跨▼搴忚璁℃洿瀹規槗榪欎竴鏂歸潰錛屽儚VisualBasic鍜孌elphi榪欐牱鐨凴AD鐜涔熻姣擵isual C++寮哄緢澶氥?
銆銆浣犳槸涓嶆槸瀵規垜鐨勮娉曟劅鍒板緢濂囨紵涓嬮潰鎴戝氨瑕佽皥涓璋堬紝鍦ㄨ皥鍒頒嬌鐢ㄦ暟鎹簱綆$悊緋葷粺(DBMS)榪欎釜璇濋鏃訛紝鐢╒isual C++瀹為檯涓婂彲浠ュ仛浜涗粈涔堛傝櫧鐒朵笂榪板叾瀹冭璦浣垮緱緙栧啓鎴愮啛鐨勫寘鎷敤鎴風晫闈㈠拰楂橀熸悳绱㈣兘鍔涚殑DBMS灝卞儚瀛╁瓙鍋氭父鎴忎竴鏍峰鏄擄紝浣嗘槸錛屽畠浠己灝慥isual C++鍙互鎻愪緵鐨勬煇浜涢噸瑕佷笢瑗褲備綘涓嶈兘涓轟嬌鐢ˋccess鐨勬暟鎹簱杞繪澗鍦扮紪鍐欏嚭瀹炵敤紼嬪簭銆傛鍍忓疄鐢ㄧ▼搴忕殑瀹氫箟鎵璇寸殑錛屽疄鐢ㄧ▼搴忓簲璇ュ緢灝忓茍涓斿叿澶囧彲縐繪鎬р斺擜ccess搴旂敤紼嬪簭鍗翠笉鏄繖鏍楓傚嵆浣跨敤Access榪欐牱鐨勪駭鍝佸垱寤虹殑紼嬪簭鍙互寰堝皬騫朵笖鍙互縐繪錛屼綘浠嶆湁鍏跺畠鏂歸潰鐨勯渶姹傦細搴曞眰鐨勫姛鑳姐?
銆銆娉細緙栧啓鏁版嵁搴撳疄鐢ㄧ▼搴忓強椹卞姩紼嬪簭鏃訛紝鍙互閫夋嫨Visual C++璇█銆?
銆銆鎯沖儚涓涓嬶紝浣跨敤鍍廣isual Basic榪欐牱鐨勮璦鏉ヤ笌瀹炴椂鏁版嵁閲囬泦璁懼鎵撲氦閬撶殑鎯呭喌銆傚湪榪涜搴曞眰璁塊棶鏃訛紝RAD鐨勪繚鎶ょ幆澧冨父甯鎬嬌紼嬪簭鍛樹笉鑳借繘琛屾湁鏁堢殑澶勭悊銆傚綋鐒訛紝鏁版嵁閲囬泦璁懼鍑犱箮涓嶄緷璧栦簬綆鏄庣殑榪炴帴銆備綘鎵撶畻濡備綍鎶奦isual Basic鍜屽閮ㄧ殑鏁版嵁婧愯繛鎺ヨ搗鏉ュ憿錛熸暟鎹簮鐢氳嚦鍙兘涓嶄簡瑙indows錛孌OS鎴栫被浼肩殑鎴愮啛鐨勬搷浣滅郴緇熴?
銆銆鍙浣跨敤寰楀綋錛屽緢瀹規槗鐪嬪埌Visual C++鏄竴縐嶄笉鍙垨緙虹殑鏁版嵁搴撶鐞嗗伐鍏楓傞拡瀵瑰ぇ瑙勬ā鐨勫簲鐢ㄧ▼搴忥紝鍗充嬌浣犱粛鎯充緷璧栦簬Visual Basic榪欐牱鐨凴AD璇█錛屼篃璇瘋冭檻涓涓媀isual C++錛屽畠鍒涘緩鐨勭▼搴忚妯″皬銆佹彁渚涘簳灞傝闂茍鑳芥彁渚涘疄鏃惰闂備簨瀹炰笂錛屼綘鍙兘榪樻病鏈夋兂鍒幫紝Visual C++鏁版嵁搴撳簲鐢ㄧ▼搴忕殑甯傚満鏄緢鏈夋綔鍔涚殑銆傞殢鐫浜轟滑鍦ㄦ梾閫斾腑瓚婃潵瓚婂鍦頒嬌鐢ㄨ啙涓婂瀷鍜屾帉涓婂瀷鐢佃剳錛岃繖涓ょ被鐢佃剳涓婄殑鏁版嵁搴撳簲鐢ㄧ▼搴忎篃鍙樺緱瓚婃潵瓚婃櫘閫氥備綘涔熻鑳藉閫傚簲浠婂ぉ鐨勮啙涓婂瀷鐢佃剳涓婄殑Access搴旂敤紼嬪簭錛屼絾璋堝埌紜洏澶у皬鎴栧唴瀛橀渶姹傛椂錛屽叕鍙擱噷杈冭佺殑鑶濅笂鍨嬬數鑴戝彲鑳藉氨杈句笉鍒拌姹傘傝繍琛學indows CE鐨勬帉涓婂瀷鐢佃剳鍦ㄨ繍琛岃繖涓狝ccess搴旂敤紼嬪簭鏃訛紝鑲畾浼氬彂鐢熸晠闅溿傚湪榪欎竴鏁版嵁搴撳競鍦虹殑鏂伴鍩燂紝Visual C++鎻愪緵浜嗘棤浠鋒棤闄愮殑宸ュ叿銆?
銆銆Web閾炬帴 璋堝埌浣跨敤Visual C++鍜屾暟鎹簱錛屽叾瀹炰綘騫朵笉瀛ゅ崟銆備粠涓寮濮嬪氨鏈夋暟鎹簱涓撶敤鏂伴椈緇勬彁渚涙湁鍏蟲暟鎹簱鍒涘緩鎶宸х殑甯姪錛屾瘮濡俶icrosoft.public.access銆備笉榪囷紝榪欎簺鏂伴椈緇勬彁渚涚殑鏄氱敤淇℃伅錛屽瀹為檯緙栧啓搴旂敤紼嬪簭騫墮潪鍏ㄩ兘閭d箞鏈夌敤銆備笓闂ㄩ拡瀵筕isual C++闂鐨勬柊闂葷粍鏄痬icrosoft.public.vc.database鍜宮icrosoft.public.vc.mfcdatabase銆傚鏋滀綘鍐沖畾鐢∣DBC璁塊棶鏁版嵁搴擄紝鍙兘榪樿鏌ョ湅涓涓媘icrosoft.public.odbc.sdk鏂伴椈緇勶紝瀹冭璁虹殑涓嶄粎浠呮槸SDK銆傚鏈鏂版妧鏈劅鍏磋叮鐨勭▼搴忓憳鍙互鏌ラ槄microsoft.public.ado鏂伴椈緇勶紝鎴栬卪icrosoft.public.oledb錛堝璞¢摼鎺ュ拰宓屽叆鏁版嵁搴擄級鏂伴椈緇勶紝鍓嶈呰璁? ADO錛屽悗鑰呰璁篈DO鐨勫熀紜鎶鏈傚湪microsoft.public.ado.rds鏈変竴涓狝DO瀛愮粍錛屽畠璁ㄨ榪滅▼鏁版嵁璁塊棶銆?
銆銆鏃㈢劧鎵鏈夌殑鐤戞儜閮芥秷闄や簡錛屽ぇ澶氭暟浜虹殑淇″績涔熷氨澧炲己浜嗭紝涓嬮潰鎴戜滑灝變粙緇嶄袱縐嶄嬌C++璁塊棶鏁版嵁搴撲腑鐨勬暟鎹殑涓昏鏂規硶錛歄DBC錛堝紑鏀炬暟鎹簱浜掕繛錛夊拰ADO錛圓ctiveX鏁版嵁瀵硅薄錛夈傚湪鏈珷涓紝灝嗕粙緇嶈繖涓ょ綾誨瀷鐨勮闂柟娉曪紝浣嗘垜鎯充綘浼氬彂鐜幫紝ADO鏂規硶鏄拡瀵規柊鐨勭▼搴忚璁℃儏褰㈣岄噰鐢ㄧ殑銆傚畠鍏嬫湇浜嗘棭鏈熸妧鏈殑璇稿闄愬埗錛屼緷璧栦簬Microsoft鏂扮殑搴曞眰璁塊棶鏂規硶OLE-DB錛堝璞¢摼鎺ュ拰宓屽叆鏁版嵁搴擄級銆傚湪鏈功鐨勫悗闈㈡垜浠細鐪嬪埌錛岀敤ADO鍜孷isual C++鎻愪緵鐨勫悇縐嶅悜瀵兼潵姹囬泦鏁版嵁搴撳伐紼嬶紝鍏墮熷害鏈夊蹇?
銆銆娉? ODBC閫氬父鐢ㄦ潵璁塊棶涓嶅叿澶嘜LE-DB鐗規х殑闈濵icrosoft鏁版嵁搴撲腑鐨勬暟鎹紱16浣嶇殑ODBC椹卞姩紼嬪簭宸ヤ綔璧鋒潵鍙兘闈炲父緙撴參銆?
銆銆ODBC绱犱互鏈鎱㈢殑鏁版嵁璁塊棶鏂規硶鑰岃憲縐幫紝浣嗘槸寰堝彲鎯滐紝褰揂DO鎴朌AO閮戒笉鏀寔鏌愪釜鏁版嵁搴撶鐞嗗櫒鑰孫DBC鏀寔榪欎釜鏁版嵁搴撶鐞嗗櫒鏃訛紝鍦ㄨ繖縐嶇壒瀹氱殑鎯呭艦涓嬶紝浣犱粛鐒墮渶瑕佷嬌鐢∣DBC銆傚湪澶у鏁版儏鍐典笅錛岃繖鎰忓懗鐫瑕佷粠鏁版嵁搴撳巶鍟嗛偅閲岃幏寰楁墍闇鐨勯┍鍔ㄧ▼搴忥紝铏界劧Visual C++紜疄闄勫甫浜嗕竴浜涗駭鍝佺殑椹卞姩紼嬪簭錛堝鏋滀綘姝e湪浣跨敤鏁版嵁搴撶鐞嗗櫒鐨勬煇浜涚縐樺姛鑳斤紝閭d箞灝遍渶瑕佸緩绔嬭嚜宸辯殑鎺ュ彛媯楄繖騫朵笉鏄竴浠跺崄鍒嗗洶闅劇殑浜嬶級銆傛湰璐ㄤ笂璁詫紝浣犳繪槸瑕佷嬌鐢∣DBC鏉ヨ闂甅icrosoft浜у搧涔嬪鐨勫叾瀹僁BMS浜у搧鎵鍒涘緩鐨勬暟鎹簱錛岃繖浜涙暟鎹簱騫朵笉鍏峰OLE-DB鍔熻兘銆侽DBC榪樿姹傚仛涓浜涢澶栫殑宸ヤ綔媯椾負ADO璋冩暣Visual C++涓殑澶ч儴鍒嗗悜瀵箋?
銆銆楂樼駭鎶宸?
銆銆闄や簡浣跨敤ADO鍜孫DBC澶栵紝浣犺繕鍙互浣跨敤鍍廌AO錛堟暟鎹闂璞★級榪欐牱鐨勬棭鏈熸妧鏈紝璇ユ妧鏈寘鍚湪鍍廇ccess榪欐牱鐨凪icrosoft浜у搧涓侱AO渚濊禆浜庣敤Microsoft Access鑷姩鑾峰緱鐨凪icrosoft Jet鏁版嵁搴撳紩鎿庛侱AO榪樻槸杈冩棭鐗堢殑Visual Basic鎵浣跨敤鐨勫紩鎿庯紙鏈鏂扮増鐨刅isual Basic鍜孷isual C++渚濊禆浜庣浉鍚岀殑ADO/OLE-DB緇勫悎錛夛紝鎵浠ュ鏋滈渶瑕佹敮鎸佽緝鏃╃殑Visual Basic搴旂敤紼嬪簭錛岄偅涔圖AO浠嶆槸涓涓笉閿欑殑閫夋嫨銆?
銆銆灝界Microsoft鏂囦歡澹版槑錛屽彲浠ョ敤DAO璁塊棶闈濵icrosoft浜у搧寤虹珛鐨勬暟鎹簱錛屼絾浣犱粛浼氬彂鐜幫紝鍦ㄨ繖縐嶆儏鍐典笅錛屼嬌鐢ˋDO鍜孫DBC瑕佸ソ寰楀銆傝繖鏍風殑璇濓紝涓嶄絾鍏煎鎬ч棶棰樹細灝戜竴浜涳紝閫熷害涔熷皢鏈夋墍鎻愰珮錛屽洜涓烘暟鎹姹傜粡榪囩殑鎺ュ彛灞傚噺灝戜簡銆傛湁涓鏉$粡楠岃璁頒綇錛孌AO鏄璁$敤鏉ュ鐞哅DB鏂囦歡鐨勩?
銆銆ADO鐨勪竴涓棶棰樻槸錛屽畠涓嶆敮鎸佽繙紼嬮氫俊銆傝繖鏄疢icrosoft鎻愬嚭RDO錛堣繙紼嬫暟鎹璞★級鐨勫師鍥犱箣涓銆傝繖縐嶇壒鍒妧鏈湪Visual Basic搴旂敤紼嬪簭涓殑浣跨敤錛岃姣斿湪Visual C++涓殑浣跨敤澶氬緱澶氾紝鎵浠ユ垜鐚滄兂錛屼綘浠腑鏈夊緢澶氫漢閮藉湪浣跨敤瀹冦備絾鏄紝璁頒綇RDO浠嶆槸涓縐嶇敓鍛藉姏寰堝己鐨勬妧鏈紝榪欎竴鐐瑰緢閲嶈銆侫DO紜疄鍏鋒湁鏇夸唬RDO鐨勮繙紼嬫暟鎹湇鍔?RDS)鐗瑰緛銆傛崲璦涔嬶紝ADO鍦ㄤ竴涓蔣浠跺寘涓彁渚涗簡DAO鍜孯DO涓ょ鍔熻兘鎬с?br>
4.MFC涓浉鍏崇被鍜孉DO綾誨簱綆浠?
1)鍗曠嫭浣跨敤CRecordSet
涓鑸儏鍐典笅AppWizard浼氬湪鏁版嵁搴撳簲鐢ㄧ▼搴忎腑鑷姩浜х敓CRecordset鐨勬淳鐢熺被錛屽茍灝嗘淳鐢熺被鍜屾煇涓暟鎹簮涓殑琛ㄨ仈緋昏搗鏉ヤ篃鍙互鍜岃鍥句笂鐨勫瓙紿楀彛鑱旂郴璧鋒潵銆備絾鏄湁鏃惰繖鏍峰仛浼氬獎鍝嶅埌紼嬪簭鐨勭伒媧繪э紝榪欐椂鍊欐垜浠彲浠ュ崟鐙嬌鐢–RecordSet綾匯傚埄鐢–RecordSet綾繪垜浠彲浠ユ墽琛孲QL璇彞錛屽茍鍙互璇誨嚭緇撴灉闆嗕腑鏁版嵁銆?
棣栧厛鎴戜滑闇瑕佸寘鍚ご鏂囦歡afxdb.h錛屽彲浠ュ皢#include 娣誨姞鍒皊tdafx.h鏂囦歡涓傛澶栧湪浣跨敤CRecordset鏃跺繀欏繪湁涓涓張涓涓狢Database瀵硅薄錛岃瀵硅薄鐨勪綔鐢ㄦ槸綆$悊鏁版嵁婧愯繛鎺ャ傜劧鍚庡彲浠ヤ駭鐢熶竴涓狢Recordset瀵硅薄錛屽埄鐢˙OOL CRecordset::Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none )鍙互鎵цSQL璇彞銆?
浣嗘墽琛屾垚鍔熷悗錛屽彲浠ヨ皟鐢ㄤ互涓嬬殑鍑芥暟婊氬姩鍏夋爣錛岃鍙栨暟鎹?
MoveFirst 縐誨姩鍏夋爣鍒扮涓鏉¤褰曞
MoveNext 縐誨姩鍏夋爣鍒板悗涓鏉¤褰曞
MovePrev 縐誨姩鍏夋爣鍒板墠涓鏉¤褰曞
MoveLast 縐誨姩鍏夋爣鍒版渶鍚庝竴鏉¤褰曞
IsBOF 媯嫻嬪厜鏍囨槸鍚﹀湪絎竴鏉¤褰曚笂
IsEOF 媯嫻嬪厜鏍囨槸鍚﹀湪鏈鍚庝竴鏉¤褰曚笂
GetFieldValue 寰楀埌緇撴灉涓暟鎹?
涓嬮潰鏄叿浣撲唬鐮?
/*
鍋囪CDatabase m_dbConn涓烘垚鍛樺彉閲?
鍋囪鏈変竴涓〃鏈夊涓婼QL璇彞浜х敓錛欳REATE TABLE table1(loc_id not null)
*/
void CYourClass::ConnectToDB()
{//榪炴帴鏁版嵁搴?
BOOL fOK = m_dbConn.Open("test");
TRACE("connect fOK=%d\n",m_dbConn);
}
void CYourClass::Select()
{//鎵цSELECT璇彞
CRecordset rec(&m_dbConn);
BOOL fOK = rec.Open(CRecordset::forwardOnly,"select loc_id from table1 order by loc_id");
TRACE("select fOK = %d\n",fOK);
TRACE("榪斿洖鐨勫垪鏁頒負錛?d\n",rec.GetRowsetSize());
CString szResult;
while(!rec.IsEOF())
{
rec.GetFieldValue((int)0,szResult);
rec.MoveNext();
TRACE("fetch : %s\n",szResult);
}
}
姝ゅCRecordset::GetFieldValue鏈夊緢澶氱鍘熷瀷錛屼綘鍙互閫氳繃鎸囧畾鍒椾綅緗垨鏄瓧孌靛悕鏉ヨ幏鍙栨暟鎹細
void GetFieldValue( LPCTSTR lpszName, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
void GetFieldValue( short nIndex, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
void GetFieldValue( LPCTSTR lpszName, CString& strValue );
void GetFieldValue( short nIndex, CString& strValue );
濡傛灉浣跨敤CDBVariant綾誨瀷鍙橀噺鏉ヨ幏鍙栫粨鏋滐紝浣犲彲浠ュ緱鍒頒換浣曠被鍨嬬殑緇撴灉銆傚湪CDBVariant::m_dwType鎴愬憳鍙橀噺涓褰曚簡璇ュ彉閲忔墍鍖呭惈鐨勬暟鎹被鍨嬶紝鏍規嵁璇ュ彉閲忕殑鍊間綘鍙互紜畾鏁版嵁綾誨瀷騫跺紩鐢–DBVariant瀵硅薄涓殑鐩稿簲鎴愬憳鍙橀噺銆?br>
2)vc鏁版嵁搴撶紪紼嬩腑CDatabase綾葷殑鐢ㄦ硶綆浠?
瑕佸緩绔嬩笌鏁版嵁婧愮殑榪炴帴錛岄鍏堝簲鏋勯犱竴涓狢Database瀵硅薄錛岀劧鍚庡啀璋冪敤CDatabase鐨凮pen鎴愬憳鍑芥暟錛嶰pen鍑芥暟璐熻矗寤虹珛榪炴帴錛屽叾澹版槑涓?
virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = “ODBC;”, BOOL bUseCursorLib = TRUE ); throw( CDBException, CMemoryException );
銆銆鍙傛暟lpszDSN鎸囧畾浜嗘暟鎹簮鍚嶏紙鏋勯犳暟鎹簮鐨勬柟娉曞皢鍦ㄥ悗闈粙緇嶏級錛屽湪lpszConnect鍙傛暟涓篃鍙寘鎷暟鎹簮鍚嶏紝姝ゆ椂lpszDSN蹇呴渶涓篘ULL錛岃嫢鍦ㄥ嚱鏁頒腑鏈彁渚涙暟鎹簮鍚嶄笖浣縧pszDSN涓篘ULL錛屽垯浼氭樉紺轟竴涓暟鎹簮瀵硅瘽妗嗭紝鐢ㄦ埛鍙互鍦ㄨ瀵硅瘽妗嗕腑閫夋嫨涓涓暟鎹簮錛庡弬鏁癰Exclusive璇存槑鏄惁鐙崰鏁版嵁婧愶紝鐢變簬鐩墠鐗堟湰鐨勭被搴撹繕涓嶆敮鎸佺嫭鍗犳柟寮忥紝鏁呰鍙傛暟鐨勫煎簲璇ユ槸FALSE錛岃繖璇存槑鏁版嵁婧愭槸琚叡浜殑錛庡弬鏁癰ReadOnly鑻ヤ負TRUE鍒欏鏁版嵁婧愮殑榪炴帴鏄彧璇葷殑錛庡弬鏁發pszConnect鎸囧畾浜嗕竴涓繛鎺ュ瓧絎︿覆錛岃繛鎺ュ瓧絎︿覆涓彲浠ュ寘鎷暟鎹簮鍚嶃佺敤鎴峰笎鍙?ID)鍜屽彛浠ょ瓑淇℃伅錛屽瓧絎︿覆涓殑錛侽DBC錛傝〃紺鴻榪炴帴鍒頒竴涓狾DBC鏁版嵁婧愪笂錛庡弬鏁癰UseCursorLib鑻ヤ負TRUE錛屽垯浼氳杞藉厜鏍囧簱錛屽惁鍒欎笉瑁呰澆錛屽揩鐓ч渶瑕佸厜鏍囧簱錛屽姩鎬侀泦涓嶉渶瑕佸厜鏍囧簱錛? 鑻ヨ繛鎺ユ垚鍔燂紝鍑芥暟榪斿洖TRUE錛岃嫢榪斿洖FALSE錛屽垯璇存槑鐢ㄦ埛鍦ㄦ暟鎹簮瀵硅瘽妗嗕腑鎸変簡Cancel鎸夐挳銆傝嫢鍑芥暟鍐呴儴鍑虹幇閿欒錛屽垯妗嗘灦浼氫駭鐢熶竴涓紓甯搞?
銆銆涓嬮潰鏄竴浜涜皟鐢∣pen鍑芥暟鐨勪緥瀛愩?
CDatabase m_db; //鍦ㄦ枃妗g被涓祵鍏ヤ竴涓狢Database瀵硅薄
//榪炴帴鍒頒竴涓悕涓猴紓Student Registration錛傜殑鏁版嵁婧?
m_db.Open("Student Registration");
//鍦ㄨ繛鎺ユ暟鎹簮鐨勫悓鏃舵寚瀹氫簡鐢ㄦ埛甯愬彿鍜屽彛浠?
m_db.Open(NULL,FALSE,FALSE,"ODBC;DSN=Student Registration;UID=ZYF;PWD=1234");
m_db.Open(NULL); //灝嗗脊鍑轟竴涓暟鎹簮瀵硅瘽妗?
銆
銆銆瑕佷粠涓涓暟鎹簮涓劚紱伙紝鍙皟鐢ㄥ嚱鏁癈lose銆傚湪鑴辯鍚庯紝鍙互鍐嶆璋冪敤Open鍑芥暟鏉ュ緩绔嬩竴涓柊鐨勮繛鎺ワ紟璋冪敤IsOpen鍙垽鏂綋鍓嶆槸鍚︽湁涓涓繛鎺ワ紝璋冪敤GetConnect鍙繑鍥炲綋鍓嶇殑榪炴帴瀛楃涓層傚嚱鏁扮殑澹版槑涓?
virtual void Close( );
BOOL IsOpen( ) const; //榪斿洖TRUE鍒欒〃鏄庡綋鍓嶆湁涓涓繛鎺?
const CString& GetConnect( ) const;
銆銆CDatabase鐨勬瀽鏋勫嚱鏁頒細璋冪敤Close錛屾墍浠ュ彧瑕佸垹闄や簡CDatabase瀵硅薄灝卞彲浠ヤ笌鏁版嵁婧愯劚紱匯?br>
3)vc鏁版嵁搴撶紪紼嬩腑CRecordView綾葷畝浠?
CRecordView錛堣褰曡鍥撅級鏄疌FormView鐨勬淳鐢熺被錛屽畠鎻愪緵浜嗕竴涓〃鍗曡鍥炬潵鏄劇ず褰撳墠璁板綍錛庣敤鎴峰彲浠ラ氳繃琛ㄥ崟瑙嗗浘鏄劇ず褰撳墠璁板綍錛庨氳繃璁板綍瑙嗗浘錛屽彲浠ヤ慨鏀廣佹坊鍔犲拰鍒犻櫎鏁版嵁錛庣敤鎴蜂竴鑸渶瑕佸垱寤轟竴涓狢RecordView鐨勬淳鐢熺被騫跺湪鍏跺搴旂殑瀵硅瘽妗嗘ā鏉夸腑鍔犲叆鎺т歡錛?
璁板綍瑙嗗浘浣跨敤DDX鏁版嵁浜ゆ崲鏈哄埗鍦ㄨ〃鍗曚腑鐨勬帶浠跺拰璁板綍闆嗕箣闂翠氦鎹㈡暟鎹傚湪鍓嶉潰浠嬬粛鐨凞DX閮芥槸鍦ㄦ帶浠跺拰鎺т歡鐖剁獥鍙g殑鏁版嵁鎴愬憳涔嬮棿浜ゆ崲鏁版嵁錛岃岃褰曡鍥懼垯鏄湪鎺т歡鍜屼竴涓閮ㄥ璞★紙CRecordset鐨勬淳鐢熺被瀵硅薄錛変箣闂翠氦鎹㈡暟鎹紟娓呭崟10.3鏄劇ず浜嗕竴涓狢RecordView鐨勬淳鐢熺被鐨凞oDataExchange鍑芥暟錛岃鑰呭彲浠ョ湅鍑猴紝璇ュ嚱鏁版槸涓巑_pSet鎸囬拡鎸囧悜鐨勮褰曢泦瀵硅薄鐨勫煙鏁版嵁鎴愬憳浜ゆ崲鏁版嵁鐨勶紝鑰屼笖錛屼氦鎹㈡暟鎹殑浠g爜鏄疌lassWizard鑷姩鍔犲叆鐨勶紟鍦ㄥ悗闈㈢殑渚嬪瓙涓紝灝嗗悜璇昏呬粙緇嶇敤ClassWizard榪炴帴璁板綍瑙嗗浘涓庤褰曢泦瀵硅薄鐨勬柟娉曪紟
鐢ㄦ潵涓庤褰曢泦瀵硅薄鐨勫煙鏁版嵁鎴愬憳浜ゆ崲鏁版嵁鐨凞oDataExchange鍑芥暟
void CSectionForm::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSectionForm)
DDX_FieldText(pDX, IDC_COURSE, m_pSet->m_CourseID, m_pSet);
DDX_FieldText(pDX, IDC_SECTION, m_pSet->m_SectionNo, m_pSet);
DDX_FieldText(pDX, IDC_INSTRUCTOR, m_pSet->m_InstructorID, m_pSet);
DDX_FieldText(pDX, IDC_ROOM, m_pSet->m_RoomNo, m_pSet);
DDX_FieldText(pDX, IDC_SCHEDULE, m_pSet->m_Schedule, m_pSet);
DDX_FieldText(pDX, IDC_CAPACITY, m_pSet->m_Capacity, m_pSet);
//}}AFX_DATA_MAP
}
CRecordView鏈韓鎻愪緵浜嗗涓嬮潰鍥涗釜鍛戒護鐨勬敮鎸侊細
ID_RECORD_FIRST //婊氬姩鍒拌褰曢泦鐨勭涓涓褰?
ID_RECORD_LAST //婊氬姩鍒拌褰曢泦鐨勬渶鍚庝竴涓褰?
ID_RECORD_NEXT //鍓嶈繘涓涓褰?
ID_RECORD_PREV //鍚庨涓涓褰?
CRecordView鎻愪緵浜哋nMove鎴愬憳鍑芥暟澶勭悊榪欏洓涓懡浠ゆ秷鎭紝OnMove鍑芥暟瀵圭敤鎴鋒槸閫忔槑鐨勶紝涓嬮潰鍒楀嚭浜哋nMove鐨勬簮浠g爜錛?
BOOL CRecordView::OnMove(UINT nIDMoveCommand)
{
CRecordset* pSet = OnGetRecordset();
if (pSet->CanUpdate())
{
pSet->Edit();
if (!UpdateData())
return TRUE;
pSet->Update();
}
switch (nIDMoveCommand)
{
case ID_RECORD_PREV:
pSet->MovePrev();
if (!pSet->IsBOF())
break;
case ID_RECORD_FIRST:
pSet->MoveFirst();
break;
case ID_RECORD_NEXT:
pSet->MoveNext();
if (!pSet->IsEOF())
break;
if (!pSet->CanScroll())
{
// clear out screen since we're sitting on EOF
pSet->SetFieldNull(NULL);
break;
}
case ID_RECORD_LAST:
pSet->MoveLast();
break;
default:
// Unexpected case value
ASSERT(FALSE);
}
// Show results of move operation
UpdateData(FALSE);
return TRUE;
}
鍦ㄥ嚱鏁扮殑寮澶村厛璋冪敤CRecordset::Edit榪涘叆緙栬緫妯″紡錛屾帴鐫璋冪敤UpdateData灝嗘帶浠朵腑鐨勬暟鎹洿鏂板埌璁板綍闆嗗璞$殑鍩熸暟鎹垚鍛樹腑錛岀劧鍚庤皟鐢–Recordset::Update灝嗗煙鏁版嵁鎴愬憳鐨勫煎啓鍏ユ暟鎹簮錛庤繖璇存槑OnMove鍦ㄦ粴鍔ㄨ褰曠殑鍚屾椂浼氬畬鎴愬鍘熸潵璁板綍鐨勪慨鏀癸紟
銆銆鍦ㄥ嚱鏁扮殑涓棿鏈変竴涓垎鏀鍙ョ敤鏉ュ鐞嗗洓涓笉鍚岀殑鍛戒護錛屽湪榪欎釜鍒嗘敮璇彞涓皟鐢ㄤ簡CRecordset鐨勫悇縐嶇敤浜庢粴鍔ㄨ褰曠殑鎴愬憳鍑芥暟錛岃繖浜涘嚱鏁板湪婊氬姩鍒頒竴涓柊鐨勮褰曟椂浼氭妸璇ヨ褰曠殑鍐呭璁劇疆鍒板煙鏁版嵁鎴愬憳涓紟鍦ㄥ嚱鏁扮殑鏈熬璋冪敤UpdateData(FALSE)鎶婃柊鐨勫綋鍓嶈褰曠殑鍐呭璁劇疆鍒拌〃鍗曠殑鎺т歡涓?
銆銆鐢辨鍙錛孫nMove涓鏉ヤ竴鍥炲畬鎴愪簡涓ゆ琛ㄥ崟鎺т歡鍜屾暟鎹簮鐨勬暟鎹氦鎹㈣繃紼嬶紟閫氳繃鍒嗘瀽璇ュ嚱鏁幫紝璇昏呭彲浠ュ浼氬湪嫻忚璁板綍鏃跺浣曟帶鍒禗DX鍜孌FX鏁版嵁浜ゆ崲錛?
]]>
1. 鐢熸垚搴旂敤紼嬪簭妗嗘灦騫跺垵濮嬪寲OLE/COM搴撶幆澧?鍒涘緩涓涓爣鍑嗙殑MFC AppWizard(exe)搴旂敤紼嬪簭錛岀劧鍚庡湪搴旂敤紼嬪簭綾葷殑InitInstance鍑芥暟涓垵濮嬪寲OLE/COM搴擄紙鍥犱負ADO搴撴槸涓涓狢OM DLL搴擄級銆?br> 銆
BOOL CADOTestApp::InitInstance() 銆銆

{ //鍒濆鍖朞LE/COM搴撶幆澧?nbsp;
AfxOleInit();
}
銆銆
2. 寮曞叆ADO搴撴枃浠?nbsp; 銆銆
浣跨敤ADO鍓嶅繀欏誨湪宸ョ▼鐨剆tdafx.h鏂囦歡閲岀敤鐩存帴寮曞叆絎﹀彿錛僫mport寮曞叆ADO搴撴枃浠訛紝浠ヤ嬌緙栬瘧鍣ㄨ兘姝g‘緙栬瘧銆備唬鐮佸涓嬶細
銆銆
錛僫nclude 銆坈omdef.h銆?nbsp; 銆銆
錛僫mport "c:\program files\common files\system\ado\msado15.dll" 銆銆
no_namespace 銆銆
rename ("EOF","adoEOF")
銆銆
澶存枃浠禼omdef.h浣挎垜浠殑搴旂敤紼嬪簭鑳藉浣跨敤Visual C錛嬶紜涓殑涓浜涚壒孌奀OM鏀寔綾伙紝榪欎簺綾諱嬌寰楀鐞哋LE鑷不鏇翠負瀹規槗涓浜涳紝OLE鑷不鏄疉DO浣跨敤鐨勬暟鎹被鍨嬨傚悗涓夎浣跨敤錛僫mport鎸囦護鍦ㄦ垜浠殑搴旂敤紼嬪簭涓緭鍏DO綾誨簱瀹氫箟銆?nbsp; 銆銆
ADO綾葷殑瀹氫箟鏄綔涓轟竴縐嶈祫婧愬瓨鍌ㄥ湪ADO DLL(msado15.dll錛変腑錛屽湪鍏跺唴閮ㄧО涓虹被鍨嬪簱銆傜被鍨嬪簱鎻忚堪浜嗚嚜娌繪帴鍙o紝浠ュ強C錛嬶紜浣跨敤鐨凜OM vtable鎺ュ彛銆傚綋浣跨敤錛僫mport鎸囦護鏃訛紝鍦ㄨ繍琛屾椂Visual C錛嬶紜闇瑕佷粠ADO DLL涓鍙栬繖涓被鍨嬪簱錛屽茍浠ユ鍒涘緩涓緇凜錛嬶紜澶存枃浠躲傝繖浜涘ご鏂囦歡鍏鋒湁.tli 鍜?tlh鎵╁睍鍚嶏紝璇昏呭彲浠ュ湪欏圭洰鐨勭洰褰曚笅鎵懼埌榪欎袱涓枃浠躲傚湪C錛嬶紜紼嬪簭浠g爜涓皟鐢ㄧ殑ADO綾昏鍦ㄨ繖浜涙枃浠朵腑瀹氫箟銆?nbsp; 銆銆
紼嬪簭鐨勭涓夎鎸囩ずADO瀵硅薄涓嶄嬌鐢ㄥ悕縐扮┖闂淬傚湪鏈変簺搴旂敤紼嬪簭涓紝鐢變簬搴旂敤紼嬪簭涓殑瀵硅薄涓嶢DO涓殑瀵硅薄涔嬮棿鍙兘浼氬嚭鐜板懡鍚嶅啿紿侊紝鎵浠ユ湁蹇呰浣跨敤鍚嶇О絀洪棿銆傚鏋滆浣跨敤鍚嶇О絀洪棿錛屽垯鍙妸絎笁琛岀▼搴忎慨鏀逛負錛?rename_namespace("AdoNS")銆傜鍥涜浠g爜灝咥DO涓殑EOF(鏂囦歡緇撴潫)鏇村悕涓篴doEOF錛屼互閬垮厤涓庡畾涔変簡鑷繁鐨凟OF鐨勫叾浠栧簱鍐茬獊銆?br> 銆銆
3錛庡埄鐢ㄦ櫤鑳芥寚閽堣繘琛屾暟鎹簱鎿嶄綔 銆銆
鍦–aboutDlg澶存枃浠朵腑瀹氫箟涓や釜ADO鏅鴻兘鎸囬拡綾誨疄渚?騫跺湪瀵硅瘽妗嗕腑鍔犲叆涓涓狶istCtrl銆?br>
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset; 銆銆
ClistCtrl m_List;
ADO搴撳寘鍚笁涓櫤鑳芥寚閽?_ConnectionPtr銆乢CommandPtr鍜宊RecordsetPtr銆?nbsp;
_ConnectionPtr閫氬父琚敤鏉ュ垱寤轟竴涓暟鎹繛鎺ユ垨鎵ц涓鏉′笉榪斿洖浠諱綍緇撴灉鐨凷QL璇彞錛屽涓涓瓨鍌ㄨ繃紼嬨?nbsp;
_CommandPtr榪斿洖涓涓褰曢泦銆傚畠鎻愪緵浜嗕竴縐嶇畝鍗曠殑鏂規硶鏉ユ墽琛岃繑鍥炶褰曢泦鐨勫瓨鍌ㄨ繃紼嬪拰SQL璇彞銆傚湪浣跨敤_CommandPtr鎺ュ彛鏃訛紝鍙互鍒╃敤鍏ㄥ眬_ConnectionPtr鎺ュ彛錛屼篃鍙互鍦╛CommandPtr鎺ュ彛閲岀洿鎺ヤ嬌鐢ㄨ繛鎺ヤ覆銆?nbsp;
_RecordsetPtr鏄竴涓褰曢泦瀵硅薄銆備笌浠ヤ笂涓ょ瀵硅薄鐩告瘮錛屽畠瀵硅褰曢泦鎻愪緵浜嗘洿澶氱殑鎺у埗鍔熻兘錛屽璁板綍閿佸畾銆佹父鏍囨帶鍒剁瓑銆?br> 銆銆
鍦∣nInitDialog()涓姞鍏ヤ互涓嬩唬鐮?
BOOL CAboutDlg::OnInitDialog()

{
CDialog::OnInitDialog();
_variant_t TheValue;
m_List.ResetContent();
m_pConnection.CreateInstance(_uuidof(Connection));
m_pRecordset.CreateInstance(_uuidof(Recordset));
try
{
m_pConnection->Open("DSN=ADOTest","","",0); //榪炴帴鍙綔ADOTest鐨凮DBC鏁版嵁婧?/span>
m_pRecordset->Open("SELECT * FROM BlockDefine",(IDispatch*)m_pConnection,
adOpenDynamic,
adLockOptimistic,
adCmdText);
//鎵цSQL璇彞寰楀埌涓涓褰曢泦
while(!m_pRecordset->adoEOF)
//閬嶅巻鎵鏈夎褰?/span>
{
TheValue = m_pRecordset->GetCollect("BlockIndex");
//寰楀埌瀛楁BlockIndex鐨勫?/span>
if(TheValue.vt!=VT_NULL)
m_List.AddString((char*)_bstr_t(TheValue)); //灝嗚鍊煎姞鍏ュ埌鍒楄〃鎺т歡涓?/span>
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_pConnection->Close();
}
catch(_com_error e) //寮傚父澶勭悊
{
AfxMessageBox(e->ErrorMessage());
}
m_pRecordset = NULL;
m_pConnection = NULL;
return TRUE; // return TRUE unless you set the focus to a control
}
public string reverse( string inputString)
{
if (inputString == null)
return null;
else
{
char[] tar = inputString.ToCharArray(); //string to char array
for (int i = 0; i < tar.Length / 2; i++)
{
char temp = tar[i];
tar[i] = tar[tar.Length - i - 1];
tar[tar.Length - i - 1] = temp;
}
string re = new string(tar); //char array to string
return re;
}
}
MFC microsoft foundation classes
API application programming interface
DLL dynamic link library
GUI graphics user interface
MDI multiple document interface
SDI sigle document interface
OLE object linking&embeded
SDM software development kit
UI user interface
WinApp windows application
windows紼嬪簭鏄俊鎭負鍩虹錛屼簨浠墮┍鍔?message based錛宔vent driven
windows紼嬪簭鍒嗕負紼嬪簭緙栫爜鍜孶I璧勬簮涓ら儴鍒嗭紝鐢╮c緙栬瘧鍣ㄩ泦鎴愪竴涓畬鏁寸殑exe鏂囦歡
win32 紼嬪簭寮鍙戞祦紼嬶細
璧勬簮鎻忚堪鏂囦歡.rc涓弿榪板悇縐峌I璧勬簮錛孯C緙栬瘧鍣≧C.EXE璇誨彇RC鏂囦歡鎻忚堪鐨勬墍鏈塙I璧勬簮
鏂囦歡闆嗕腑鍒朵綔涓涓?RES鏂囦歡錛屽啀鍜岀▼搴忕紪鐮佺粨鍚堝湪涓璧鳳紝鎴愪負涓涓畬鏁寸殑windows鍙?/p>
鎵ц鏂囦歡銆?/p>
WINDOWS紼嬪簭涓轟粈涔堝繀欏諱嬌鐢ㄥ鍏ュ嚱鏁板簱錛?br>windows紼嬪簭璋冪敤鐨勫嚱鏁板垎涓猴細c runtimes 浠ュ強 windows api涓ゅぇ閮ㄥ垎銆?br>windows api錛岀敱鎿嶄綔緋葷粺鏈韓鎻愪緵錛坵indows 涓夊ぇ妯″潡
GUI32.DLL,USER32.DLL,KERNEL32.DLL錛?
瀵煎叆鍑芥暟搴擄紝灝辨槸瀛樻斁鍦?a onclick="javascript:tagshow(event, '%C1%B4%BD%D3');" href="javascript:;" target=_self>閾炬帴鐨勬椂鍊欓渶瑕佷嬌鐢ㄤ粈涔堟牱鐨刣ll鏂囦歡錛屼互鍙婅繖浜涙枃浠跺瓨鏀?/p>
鐨勫湴鏂廣傝屼笁澶фā鍧楁墍瀵瑰簲鐨勫鍏ュ嚱鏁板簱鍒負
GUI32.LIB,USER32.LIB,KERNEL32.LIB.
涓鑸嚱鏁版槸瀛樻斁鍒頒簡涓婅竟鐨勪笁澶фā鍧椾腑錛岃繕鏈夋柊鐨刟pi鍑芥暟錛屾斁鍦╠ll鏂囦歡涓紝姣斿
COMMDLG.DLL,TOOLHELP.DLL,涓紝濡傛灉浣跨敤榪欎簺API錛岄摼鎺ユ椂榪樺緱鍔犱笂榪欎簺dll瀵瑰簲鐨?/p>
瀵煎叆鍑芥暟錛屾瘮濡侰OMDLG32.LIB鍜孴H32.LIB.
WINDOWS紼嬪簭闇瑕佷粈涔堝ご鏂囦歡錛?br>windows紼嬪簭蹇呴』鍖呭惈windows.h.瀹冨寘鍚殑鏄笁澶фā鍧楁墍鎻愪緵鐨刟pi鍑芥暟錛屽鏋滅敤鍒?/p>
鍏朵粬system dlls錛屾瘮濡侰OMMDLG.DLL,MAPI.DLL,TAPI.DLL,灝辮浣跨敤鐩稿搴旂殑澶存枃浠?/p>
COMMDLG.H MAPI.H TAPI.H絳夌瓑銆?/p>
windows鐨勮繍琛屾満鍒訛紵
淇℃伅涓哄熀紜錛屼互浜嬩歡椹卞姩銆?br>windows紼嬪簭榪愯渚濋潬澶栭儴鍙戠敓鐨勪簨浠舵潵椹卞姩鐨勩傜▼搴忕瓑寰呬換浣曞彲鑳界殑杈撳叆錛岀劧鍚庡垽
鏂紝鏈鍚庡仛鍑洪傚綋澶勭悊銆?br>杈撳叆鏄敱鎿嶄綔緋葷粺鎹曟崏鍒幫紝浠ヤ俊鎭艦寮忚繘鍏ョ▼搴忎箣涓?br>淇℃伅錛屽氨鏄痺indows鍐呰鐨勪竴縐嶆暟鎹粨鏋勩?/p>
杈撳叆鍒嗙被錛?br>紜歡璁劇疆鎵浜х敓鐨勪俊鎭細鏀懼埌緋葷粺闃熷垪錛坰ystem queue錛?br>windows緋葷粺鎴栨槸鍏朵粬windows紼嬪簭浼犻佽繃鏉ョ殑淇℃伅錛氭斁鍒扮▼搴忛槦鍒楋紙application
queue錛夈?/p>
淇℃伅錛?br>淇℃伅錛屽氨鏄痺indows鍐呰鐨勪竴縐嶆暟鎹粨鏋勩?br>typedef struct tagMSG
{
HWND hwnd;
UINT message;(WM_)
WPARAM wParam;(WM_MOUSEMOVE,WM_SIZE,WM_LBUTTONDOWN)
LPARM lParm;
DWORD time;
POINT pt;
}MSG;
鎺ュ彈騫跺鐞嗕俊鎭殑灝辨槸紿楀彛銆傛瘡涓獥鍙i兘鏈変竴涓嚱鏁拌礋璐e鐞嗕俊鎭紝榪欎釜鍑芥暟灝卞彨
紿楀彛鍑芥暟錛坵indow procedure錛寃indow function錛?/p>
紿楀彛娉ㄥ唽鍜岀獥鍙g殑璇炵敓錛?br>紿楀彛鍑芥暟灝辨槸紿楀彛鎺ユ敹淇℃伅鍚庣殑鍙嶅簲銆?br>浜х敓紿楀彛鍓嶇敤API鍑芥暟RegisterClass璁懼畾紿楀彛灞炴э紙灝辨槸娉ㄥ唽紿楀彛錛?/p>
紿楀彛鐨勬敞鍐岀敤鐨勬槸RegisterClass (琚皝瑁呭湪InitApplication鍑芥暟涓?
紿楀彛鐨勮癁鐢熸槸鐢–reateWindow(琚皝瑁呭湪InitInstance鍑芥暟涓?
InitApplication 鍜?InitInstance鍖哄埆錛?/p>
鍑芥暟娉ㄥ唽錛氱獥鍙g被鍙渶瑕佹敞鍐屼竴嬈★紝浠ュ悗鍙緵鍚屼竴紼嬪簭鐨勫悗緇ф瘡涓涓疄渚?/p>
錛坕nstance錛変嬌鐢紙鎵鏈夎繘紼嬪叕鍦ㄤ竴涓湴鍧絀洪棿涓級錛屽洜姝ゅ皢RegisterClass榪欎釜鍔?/p>
浣滄斁鍦?#8220;鍙湁絎竴涓疄渚嬫墠浼氳繘鍏?#8221;鐨処nitApplication鍑芥暟涓?br>涓涓繘紼嬫槸鍚︽槸鏌愪釜紼嬪簭鐨勭涓涓疄渚嬶紝鍙互鐢╓inMain鐨勫弬鏁癶PrevInstance鏉ュ垽
鏂?br>浜х敓紿楀彛錛欳reateWindow鏄換浣曞疄渚嬮兘鍙互榪涘叆錛屾斁鍒癐nitInstance鍑芥暟涓?/p>
淇℃伅寰幆錛?br>while(GetMessage(&msg,...))
{
TranslateMessage(&msg);//涓轟簡灝嗛敭鐩樹俊鎭漿鍖?br> DispatchMessage(&msg);//灝嗕俊鎭紶緇欑獥鍙e嚱鏁板幓澶勭悊
}
紿楀彛鍑芥暟錛?/p>
DispatchMessage(&msg)鏄竴縐嶅洖璋冨嚱鏁幫紝灝辨槸浣犺嚜宸卞啓鐨勭▼搴忎腑鐨勮windows緋葷粺
璋冪敤鐨勫嚱鏁般?br>紿楀彛鍑芥暟褰㈠紡錛?br>LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
璧勬簮瀹氫箟鏂囦歡(.RC)錛?br>.RC鏂囦歡鏄竴涓敤鏂囧瓧鎻忚堪璧勬簮鐨勫湴鏂廣傚父鐢ㄨ祫婧愭湁涔濋」錛欼CON錛堝浘鏍囷級,CURSOR錛?/p>
鎸囬拡錛?BITMAP錛堜綅鍥撅級,FONT錛堝瓧浣擄級,DIALOG錛堝璇濇錛?MENU錛堣彍
鍗曪級,ACCELERATOR錛堝姞閫熷櫒錛?STRING錛堝瓧絎︿覆錛?VERSIONINFO.
鏍稿績瀵硅薄錛?br>緋葷粺鐨勪竴縐嶈祫婧愶紝涓鏃︿駭鐢燂紝浠諱綍搴旂敤紼嬪簭閮藉彲浠ュ紑鍚茍浣跨敤榪欎釜瀵硅薄銆傜郴緇熺粰鏍?/p>
蹇冨璞?涓涓鏁板兼潵綆$悊瀹冦?br>鏍稿績瀵硅薄鍖呮嫭錛?nbsp; 浜х敓鏂規硶
event CreateEvent
mutex CreateMutex
semaphore CreateSemphore
浠ヤ笂鐢ㄤ簬綰跨▼鍚屾鍖?br>file CreateFile
file-mapping CreateFileMapping 鐢ㄤ簬鍐呭瓨鏄犲皠鏂囦歡
process CreateProcess
thread CreateThread
榪涚▼鐨勮癁鐢熷拰姝?
shell涓互榧犳爣鍙屽嚮涓涓彲鎵ц鏂囦歡鍥炬爣錛屽氨鍙互鎵ц榪欎釜(姣斿)App.exe鐨勬祦紼嬶細
1shell璋冪敤CreateProcess鍚姩App.exe銆?#8216;
2緋葷粺浜х敓涓涓?#8220;榪涚▼鏍稿績瀵硅薄”錛岃鏁板間負1銆?br>3緋葷粺涓烘榪涚▼寤虹珛涓涓?GB鍦板潃絀洪棿
4杞藉叆鍣ㄥ皢蹇呰鐨勬暟鎹澆鍏ュ埌涓婅堪鍦板潃絀洪棿涓紝鍖呮嫭App.exe鐨勭▼搴忥紝鏁版嵁錛屼互鍙婃墍
闇瑕佺殑榪炴帴鍑芥暟搴擄紙DLL錛?杞藉叆鍣ㄦ槸鏍規嵁.idata section涓殑錛圥E鏂囦歡鏍煎紡錛夌殑璁?/p>
褰曟枃浠躲?br>5緋葷粺涓烘榪涚▼寤虹珛涓涓嚎紼嬶紝縐頒負涓葷嚎紼嬨傜嚎紼嬫墠鏄垎閰峜pu鏃墮棿鐨勫垎閰嶅璞°?br>6緋葷粺璋冪敤 C runtime鍑芥暟搴撶殑Startup code銆?br>7Startup code璋冪敤App紼嬪簭鐨刉inMain鍑芥暟銆?br>8App紼嬪簭榪愯寮濮?br>9浣跨敤鑰呭叧闂瑼pp涓葷獥鍙o紝鏄疻inMain涓殑淇℃伅寰幆緇撴潫鎺夛紝浜庢槸WinMain緇撴潫銆?br>10 榪斿洖鍒癝tartup code銆?br>11榪斿洖鍒扮郴緇燂紝緋葷粺璋冪敤ExitProcess緇撴潫榪涚▼銆?/p>
浜х敓瀛愯繘紼嬶紵
鐢–reateProcess
緇撴潫榪涚▼錛?br>VOID ExitProcess(UINT fuExitCode);
浜х敓棰濆鐨勭嚎紼?
CreateThread()
褰撹繘紼嬪緩绔嬭搗鏉ュ悗錛岀郴緇熶細瀹屾垚浠涔堬紙灝辨槸宸茬粡鏈変簡涓葷嚎紼嬶級錛?br>1閰嶇疆“綰跨▼瀵硅薄”錛屽叾handle灝嗘垚涓篊reateThread鐨勮繑鍥炲?br>2璁懼畾璁℃暟鍊間負1
3閰嶇疆綰跨▼鐨刢ontext錛堝伐浣滐級
4淇濈暀綰跨▼鐨勫爢鏍?br>5灝哻ontext涓殑鍫嗘爤鎸囬拡瀵勫瓨鍣紙ss錛夊拰鎸囦護鎸囬拡瀵勫瓨鍣紙ip錛夎瀹氬Ε褰?/p>
綰跨▼浼樺厛綰э紵
0錛?1 浠庝綆鍒伴珮錛?/p>
綰у埆 浠g爜 浼樺厛鏉冨?br>idle IDLE_PRIORITY_CLASS 4
normal NORMAL_PRIORITY_CLASS 9
high HIGH_PRIORITY_CLASS 13
realtime REALTIME_PRIORITY_CLASS 24
MFC鍏ぇ鍏抽敭鎶鏈槸浠涔堬紵
1MFC紼嬪簭鐨勫垵濮嬪寲榪囩▼
2RTTI 鍔ㄦ佺被鍨嬫爣璇?nbsp;
3Dynamic Creation 鍔ㄦ佺敓鎴?br>4Persistence 姘鎬箙淇濈暀
5Message Mapping 淇℃伅鏄犲皠
6Message Routing 淇℃伅浼犻?/font>
鎬庢牱鑷埗RTTI錛?br>鎴戜滑浣滀負綾誨簱鐨勮璁¤呰鍦ㄧ被鏋勯犺搗鏉ョ殑鏃跺欙紝璁板綍蹇呰鐨勪俊鎭紝浠ュ緩绔嬪瀷褰曘傚瀷褰曚腑鐨勭被鐨勪俊鎭紝鏈濂戒互閾捐〃鏂瑰紡榪炴帴璧鋒潵銆備竴鑸?#8220;綾誨埆鍨嬪綍”鏄竴涓粨鏋勶紝鍏朵腑鑷沖皯闇瑕佺被鍚嶅瓧錛岄摼琛ㄧ殑Next鎸囬拡錛屼互鍙婇摼琛ㄧ殑First鎸囬拡銆侳irst灞炰簬鏁翠綋鍙橀噺錛屼竴浠藉氨濂斤紝鎵浠ョ敤static淇グ銆?br>涓轟簡灝嗘瘡涓涓被閮借兘鎷ユ湁鎴愬憳鍙橀噺闆嗗悎錛屽茍涓旀渶濂芥湁涓瀹氱殑鍛藉悕瑙勫垯錛岀劧鍚庣粡鏌愮鎵嬫灝嗘暣涓被搴撴瀯閫犲ソ涔嬪悗錛?#8220;綾誨埆鍨嬪綍”錛堝氨鏄悇涓狢RuntimeClass瀵硅薄錛夊垯鑳藉憟鐜頒負錛?/p>
浠涔堟槸DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 瀹忥紵浣滅敤灝辨槸瀹屾垚RTTI鐨?#8220;綾誨埆鍨嬪綍”銆?/font>
涓轟簡灝嗕竴涓被瀵硅薄濉炲埌綾諱箣涓紝騫跺畾涔変竴涓彲浠ユ崟鎹夊埌璇ュ璞″湴鍧鐨勫嚱鏁幫紝瀹氫箟涓涓畯涓猴細
#define DECLARE_DYNAMIC(class_name)
public:
static CRuntimeClass class##class_name;
virtual CRuntimeClass* GetRuntimeClass()const;
姣斿鎴戜嬌鐢ㄤ簡DECLARE_DYNAMIC(CView)
緙栬瘧鍣ㄩ澶勭悊鍣ㄤ負鎴戝仛鍑虹殑浠g爜鏄細
public:
static CRuntimeClass classCView;
virtual CRuntimeClass * GetRuntimeClass()const;
涔熷氨鏄畾涔夌被鏃訛紝灝嗙被鏀懼叆DECLARE_DYNAMIC瀹忓氨鏄妸瑕佹斁鐨勫璞℃斁鍒頒簡閲岃竟銆傚叿浣撹繛鎺ュ伐浣滄槸鐢盜MPLEMENT_DYNAMIC瀹忔潵瀹炵幇錛?br>#define IMPLEMENT_DYNAMIC(class_name,base_class_name)
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)
榪欓噷涓嶅仛鎵╁睍錛屾諱箣錛孖MPLEMENT_DYNAMIC鍐呭涓嶄粎鍒跺畾鍒濆鹼紝瀹冧嬌鐢ㄤ簡涓涓猻truct AFX_CLASSINIT {AFX_CLASSINTI(CRuntimeClass * pNewClass);};
(c++鐨剆truct鍜宑lass閮芥湁鏋勯犲嚱鏁?錛?br>AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass*pNewClass)
{ pNewClass->m_NextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}
灝辨槸涓婅竟鐨勮繖涓瀯閫犲嚱鏁板畬鎴愪簡榪炴帴宸ヤ綔銆?br>涓鑸嬌鐢ㄧ殑褰㈠紡鏄細
class CView:public CWnd
{
DECLARE_DYNAMIC(CView)
...
};
// in implementation file
IMPLEMENT_DYNAMIC(CView CWnd)
榪欎袱涓畯灝卞畬鎴愪簡鏋勯犳暟鎹摼琛ㄧ殑宸ヤ綔銆?/p>
鎬庢牱鐢熸垚mfc灞傛緇撴瀯鐨勭被鍒瀷褰曪紵
.h鏂囦歡涓?br>class CObject{...};
class CCmdTarget:public CObject
{
DECLARE_DYNCMIC (CCmdTarget)
...
};
class CWinThread:public CCmdTarget
{
DECLARE_DYNAMIC (CWinThread)
...
};
class CWinApp:public CWinThread
{
DECLARE_DYNAMIC (CWinApp)
...
};
class CDocument:public CCmdTarget
{
DECLARE_DYNAMIC (CDocument)
...
};
class CWnd:public CCmdTarget
{
DECLARE_DYNAMIC (CWnd)
...
};
class CFrameWnd:public CWnd
{
DECLARE_DYNAMIC (CFrameWnd)
...
};
class CView:public CWnd
{
DECLARE_DYNAMIC (CView)
...
};
class CMyWinApp:public CWinApp
{...};
class CMyFrameWnd:public CFrameWnd
{...};
class CMyDoc:public CDocument
{...};
class CMyView:public CView
{...};
.cpp鏂囦歡涓?br>IMPLEMENT_DYNAMIC(CCmdTarget,CObject)
IMPLEMENT_DYNAMIC(CWinThread,CCmdTarget)
IMPLEMENT_DYNAMIC(CWinApp,CWinThread)
IMPLEMENT_DYNAMIC(CWnd,CCmdTarget)
IMPLEMENT_DYNAMIC(CView,CWnd)
IMPLEMENT_DYNAMIC(CFrameWnd,CWnd)
IMPLEMENT_DYNAMIC(CDocument,CCmdTarget)
IsKindOf鏄粈涔堬紵
瀹冩槸綾誨瀷璇嗗埆錛屽氨璇村湪寤虹珛浜?#8220;綾誨埆鍨嬪綍”緗戝悗錛屽湪鏌愪釜綾諱腑瀛樺湪榪欎釜鍑芥暟錛屽氨鏄湅榪欎釜鎸囬拡鏄笉鏄瓨鍦ㄦ煇涓被鐨勪笅鏀腑銆?br>姣斿錛?br>CMyDoc * pMyDoc = new CMyDoc;
CMyView * pMyView = new CMyView;
cout<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyDoc));//TURE
cout<<pMyDoc->IsKindOf(RUNTIME_CLASS(CDocument));//TURE
cout<<pMyDoc->IsKindOf(RUNTIME_CLASS(CCmdTarget));//TURE
cout<<pMyDoc->IsKindOf(RUNTIME_CLASS(CObject));//TURE
cout<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWinApp));//FALSE
鎬庢牱 鑷埗Dynamic Create(鍔ㄦ佺敓鎴?錛?/font>
灝嗙被鐨勫ぇ灝忚褰曞湪綾誨埆鍨嬪綍涓紝鎶婃瀯閫犲嚱鏁頒篃璁板綍鍦ㄧ被鍒瀷褰曚腑錛屽綋紼嬪簭鍦ㄨ繍琛屾椂鏈熻幏寰椾竴涓被鍚嶅瓧錛屽畠灝卞彲浠ュ湪“綾誨埆鍨嬪綍緗?#8221;涓壘鍒板搴旂殑鍏冪礌錛岀劧鍚庢牴鎹被鐨勫ぇ灝忥紝璋冪敤鏋勯犲嚱鏁幫紝浜х敓鍑鴻瀵硅薄銆?/p>
榪欓噷浣跨敤鐨勬槸DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE瀹?br>浣跨敤鍜屽畬鎴愮被鍒瀷褰曠殑鏂瑰紡宸笉澶氾細
class CFrameWnd:public CWnd
{
DECLARE_DYNCREATE(CFrameWnd)
...
};(灝辨槸鍦ㄥご鏂囦歡涓?
// in implement 錛堝氨鏄湪cpp鏂囦歡涓疄鐜幫級
IMPLEMENT_DYNCREATE(CFrameWnd,CWnd)
serialize鏈哄埗灝辨槸鑰冭檻鍒版瘡嬈¤褰曞璞″唴瀹圭殑鏃跺欙紝鍏堝啓鍏ヤ竴涓唬鐮侊紝琛ㄧず姝ゅ璞$被鏄惁鏇懼湪鏂囦歡涓褰曡繃浜嗐傚鏋滄槸鏂扮被錛屽氨璁板綍綾葷殑鍚嶅瓧錛屽鏋滄槸灝辯被錛屽氨鐢ㄤ唬鐮佽〃紺恒傝繕鏈夊氨鏄彲浠ユ帶鍒剁増鏈彿鐨勯棶棰樸傛湁涓涓笓闂ㄧ殑serialization鍑芥暟錛岀敤浜庤礋璐h繖浜涗換鍔°?br>姣忎竴涓彲鍐欏埌鏂囦歡鎴栧彲浠庢枃浠朵腑璇誨嚭鐨勭被錛岄兘搴旇鏈夊畠鑷繁鐨剆erailize鍑芥暟銆傝礋璐e畠鑷繁鏁版嵁璇誨啓鎿嶄綔錛屽茍涓斿簲璇ユ敼鍐?#8220;<<”“>>”,鎶婃暟鎹嫻佸archive涓?/p>
class CRectangle :public CObject }; class CCircle:public CObjcet .cpp鏂囦歡涓繀欏繪湁 褰撴垜浠殑綾誨簱鎴愮珛錛屽鏋滃叾涓笌淇℃伅鏈夊叧鐨勭被錛堝氨鏄?#8220;淇℃伅鏍囩殑綾?#8221;mfc涓氨鏄疌CmdTarget錛夐兘鏄竴鏉¢摼寮忓湴緇ф壙錛屾垜浠簲璇ヤ負姣忎竴涓?#8220;淇℃伅琛ㄧ殑綾?#8221;鍑嗗涓涓俊鎭槧灝勮〃錛屾瘮涓斿皢鍩虹被涓庢淳鐢熺被鐨勪俊鎭槧灝勮〃榪炴帴璧鋒潵銆傜劧鍚庯紝褰撶獥鍙e嚱鏁板仛淇℃伅鐨勬瘮杈冩椂錛屾垜浠氨鍙互鎯沖姙娉曞紩瀵煎畠娌跨潃榪欐潯璺蛋榪囧幓銆?/p>
瀹氫箟娑堟伅鏄犲皠鐨勬暟鎹粨鏋勶細 涔嬪悗瀹氫箟鐨勫畯灝辨槸 MFC瀵規秷鎭紶閫掔殑瑙勫畾鏄粈涔堬紵錛坢essage routing錛?br>濡傛灉鏄竴鑸殑windows淇℃伅錛圵M_xxx錛?涓瀹氭槸浠庢淳鐢熺被嫻佸悜鍩虹被銆?/p>
鎬庢牱鑷埗Persistence錛堟案涔呬繚瀛橈級鏈哄埗錛?/font>
鍐欏埌鏂囦歡涓幓銆?br>鎶婃暟鎹啓鍒版枃浠朵腑銆傛柟娉曟槸錛氬湪Document/View緇撴瀯涓紝鏁版嵁閮芥斁鍦ㄤ竴浠絛ocument閲屽ご錛屾垜浠彧瑕佹妸鍏朵腑鐨勬垚鍛樺彉閲忛檰緇啓榪涙枃浠朵腑鍗沖彲銆傚鏋滄垚鍛樺彉閲忔槸涓璞★紝灝遍渶瑕佸厛璁拌澆綾葷殑鍚嶅瓧錛岀劧鍚庢墠鏄璞′腑鐨勬暟鎹?/p>
浠涔堟槸Serialize鏈哄埗錛?/font>
灝辨槸鎶婃枃浠跺悕鐨勯夋嫨銆佹枃浠剁殑璁塊棶銆佺紦鍐插尯鐨勫緩绔嬨佹暟鎹殑璇誨啓銆佽繍綆楃錛?gt;>錛夊拰榪愮畻絎?<<)鐨勯噸杞姐佸璞$殑鍔ㄦ佺敓鎴愰兘鍖呰璧鋒潵銆傚畠鐨勬暟鎹鍐欏拰瀵硅薄鐨勫姩浠g敓鎴愭槸鍏抽敭錛屽姩鎬佺敓鎴愬凡緇忓叿鏈夛紝榪欓噷灝遍噸鐐硅璁烘暟鎹殑璇誨啓鎿嶄綔銆?/p>
鎬庢牱瀹屾垚serialize錛?br>浣跨敤DECLARE_SERIAL/IMPLEMENT_SERIAL瀹忋傝繖涓畯鐨勫姛鑳芥槸灝?#8220;<<”鍜?#8220;>>”涓や釜榪愮畻絎﹂噸杞斤紝榪樺彲浠ュ皢serialize鍑芥暟鏀懼埌綾誨畾涔変腑銆傜被鑳藉榪涜鏂囦歡璇誨啓錛屽叾鍓嶆彁鏄嫢鏈夊姩鎬佺敓鎴愮殑鑳藉姏銆?br>#define DECLARE_SERIAL(class_name)
DECLARE_DYNCREATE(class_name)
friend CArchive& AFXAPI operator >>(CArchive& ar,class_name *&pOb)
#define IMPLEMENT_SERIAL(class_name,base_name,wSchema)
CObject * PASCAL class_name::CreateObject()
{return new class_name;}
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,
class_name::CreateObject)
CArchive& AFXAPI operator>>(CArchive& ar,class_name *&pOb)
{pOb = (class_name*)ar.ReadObject(RUNTIME_CLASS(class_name));
return ar;}
涓涓璞″鐞嗕箣鍓嶏紝鍒ゆ柇鏄惁絎竴嬈″嚭鐜般佽褰曠増鏈彿銆佽褰曟枃浠跺悕鎬庢牱瀹炵幇錛?br>鐢–RuntimeClass涓殑涓や釜鍑芥暟Load鍜孲tore銆?br>struct CRuntimeClass
{
//attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema;//schema number of the loaded class
CObject *(PASCAL * m_pfnCreateObject)();
CRuntimeClass * m_pBaseClass;
CObject *CreateObject();
void Store (CArchive&ar)const;
static CRuntimeClass * PASCAL Load(CArchive &ar,UINT *pwSchemaNum);
//CRuntimeClass objects linked together in simple list
static CRuntimeClass * pFirstClass;//start of class list
CRuntimeClass * m_pNextClass;//linked list of registered classes
};
涓轟簡璁╂暣涓猻erialization鏈哄埗榪愯璧鋒潵錛屽繀欏誨仛瀹氫箟涓猴細
.h鏂囦歡涓繀欏繪湁
class CScribDoc:public CDocument
{
DECLARE_DYNCREATE(CScribDoc)
...
};
class CStroke:public CObject
{
DECLARE_SERIAL(CStroke)
public:
void Serialize(CArchive&);
...
};
{
DECLARE_SERIAL(CRectangle)
public
void Serialize(CArchive&)
{
DECLARE_SERIAL(CCircle)
public:
void Seiralize(CArchive&);
...
};
IMPLEMENT_DYNCREATE(CScribDoc,CDocument)
IMPLEMENT_SERIAL(CStroke,CObjcet,2)
IMPLEMENT_SERIAL(CRectangle,CObjcet,1)
IMPLEMENT_SERIAL(CCircle,CObjcet,1)
鎬庢牱鑷埗Message Mapping(娑堟伅鏄犲皠)錛?/p>
struct AFX_MSGMAP
{
AFX_MSGMAP * pBaseMessagMap;
AFX_MSGMAP_ENTRY *lpEntries;
};
鍏朵腑鐨凙FX_MSGMAP_ENTRY鍙堟槸鍙︿竴涓暟鎹粨鏋勶細
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT nSig;
AFX_PMSG pfn;
}
鍏朵腑鐨凙FX_PMSG瀹氫箟涓哄嚱鏁版寚閽堬細
typedef void (CCmdTarget::*AFX_PMSG)(void);
#define DECLARE_MESSAGE_MAP();
static AFX_MSGMAP_ENTRY_ messageEntries[];
static AFX_MSGMAP messageMap;
virtual AFX_MSGMAP *GetMessageMap()const;
MFC紼嬪簭鏄笉鍖呮嫭涓昏鍑芥暟鍜屾椂闂村驚鐜傛墍鏈夌殑浜嬩歡澶勭悊閮芥槸浣滀負CWinApp鐨勪竴閮ㄥ垎鍦ㄥ悗鍙板鐞嗙殑銆傝屾秷鎭槧灝勫氨鏄瘑鍒劅鍏磋叮鐨勪簨浠剁劧鍚庤皟鐢ㄥ嚱鏁版潵鍝嶅簲榪欎簺浜嬩歡銆?/p>
涓錛岄鍏堟槸姝e父鐨勭▼搴?/p>
// button1.cpp
銆銆#include
銆銆#define IDB_BUTTON 100
銆銆// Declare the application class
銆銆class CButtonApp : public CWinApp
銆銆{
銆銆public:
銆銆virtual BOOL InitInstance();
銆銆};
銆銆// Create an instance of the application class
銆銆CButtonApp ButtonApp;
銆銆// Declare the main window class
銆銆class CButtonWindow : public CFrameWnd
銆銆{
銆銆CButton *button;
銆銆public:
銆銆CButtonWindow();
銆銆};
銆銆// The InitInstance function is called once
銆銆// when the application first executes
銆銆BOOL CButtonApp::InitInstance()
銆銆{
銆銆m_pMainWnd = new CButtonWindow();
銆銆m_pMainWnd->ShowWindow(m_nCmdShow);
銆銆m_pMainWnd->UpdateWindow();
銆銆return TRUE;
銆銆}
銆銆// The constructor for the window class
銆銆CButtonWindow::CButtonWindow()
銆銆{
銆銆CRect r;
銆銆// Create the window itself
銆銆Create(NULL,
銆銆"CButton Tests",
銆銆WS_OVERLAPPEDWINDOW,
銆銆CRect(0,0,200,200));
銆銆// Get the size of the client rectangle
銆銆GetClientRect(&r);
銆銆r.InflateRect(-20,-20);
銆銆// Create a button
銆銆button = new CButton();
銆銆button->Create("Push me",
銆銆WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
銆銆r,
銆銆this,
銆銆IDB_BUTTON);
銆銆}
| 褰撲綘榪愯浠g爜鏃訛紝浼氭敞鎰忓埌鎸夐挳鍝嶅簲浜嗙敤鎴蜂簨浠躲傛棦瀹冨姞浜簡銆傞櫎姝や箣澶栧畠娌℃湁鍋氫換浣曚簨鎯咃紝鍥犱負鎴戜滑榪樻病鏈夋暀瀹冩庢牱鍘誨仛銆傛垜浠渶瑕佺紪鍐欐秷鎭槧灝勬潵浣挎寜閽仛涓浜涙劅鍏磋叮鐨勪簨鎯呫?/font> |
浜岋紝寤虹珛娑堟伅鏄犲皠
// button2.cpp
銆銆#include
銆銆#define IDB_BUTTON 100
銆銆// Declare the application class
銆銆class CButtonApp : public CWinApp
銆銆{
銆銆public:
銆銆virtual BOOL InitInstance();
銆銆};
銆銆// Create an instance of the application class
銆銆CButtonApp ButtonApp;
銆銆// Declare the main window class
銆銆class CButtonWindow : public CFrameWnd
銆銆{
銆銆CButton *button;
銆銆public:
銆銆CButtonWindow();
銆銆afx_msg void HandleButton(); //
銆銆DECLARE_MESSAGE_MAP()
銆銆};
銆銆// The message handler function
銆銆void CButtonWindow::HandleButton()
銆銆{
銆銆MessageBeep(-1);
銆銆}
銆銆// The message map
銆銆BEGIN_MESSAGE_MAP(CButtonWindow, CFrameWnd)
銆銆ON_BN_CLICKED(IDB_BUTTON, HandleButton)
銆銆END_MESSAGE_MAP()
/*鐢ㄥ畯鏉ュ緩绔嬫秷鎭槧灝勩傚湪浠g爜涓紝浣犲彲浠ョ湅瑙丅EGIN_MESSAGE_MAP瀹忔帴鏀朵袱鍚勫弬鏁般傜涓涓寚瀹氫簡浣跨敤娑堟伅鏄犲皠鐨勭被鐨勫悕縐般傜浜屼釜鏄熀綾匯傜劧鍚庢槸ON_BN_CLICKED瀹忥紝鎺ュ彈涓や釜鍙傛暟鎺у埗鐨処D鍜岃ID鍙戦佸懡浠ゆ秷鎭椂鎵璋冪敤鐨勫嚱鏁般傛渶鍚庯紝娑堟伅鏄犲皠鐢‥ND_MESSAGE_MAP鏉ョ粨鏉熴?/font>
褰撶敤鎴峰崟鍑繪寜閽椂錛屽畠鍚戝叾鍖呭惈璇ユ寜閽殑鐖剁獥鍙e彂閫佷簡涓涓寘鍚叾ID鐨勫懡浠ゆ秷鎭傞偅鏄寜閽殑緙虹渷琛屼負錛岃繖灝辨槸璇ヤ唬鐮佸伐浣滅殑鍘熷洜銆傛寜閽悜鍏剁埗紿楀彛鍙戦佹秷鎭紝鏄洜涓哄畠鏄瓙紿楀彛銆傜埗紿楀彛鎴彇璇ユ秷鎭茍鐢ㄦ秷鎭槧灝勬潵紜畾鎵瑕佽皟鐢ㄧ殑鍑芥暟銆侻FC鏉ュ畨鎺掞紝鍙鎸囧畾鐨勬秷鎭竴鍑虹幇錛岀浉搴旂殑鍑芥暟灝變細琚皟鐢ㄣ?br>銆銆ON_BN_CLICKED娑堟伅鏄疌Button鍙戦佺殑鍞竴鎰熷叴瓚g殑娑堟伅銆傚畠絳夊悓浜嶤Wnd涓殑ON_COMMAND娑堟伅錛屽彧鏄竴涓洿綆鍗曟柟渚跨殑鍚屼箟璇嶈屽凡銆?/
銆銆// The InitInstance function is called once
銆銆// when the application first executes
銆銆BOOL CButtonApp::InitInstance()
銆銆{
銆銆m_pMainWnd = new CButtonWindow();
銆銆m_pMainWnd->ShowWindow(m_nCmdShow);
銆銆m_pMainWnd->UpdateWindow();
銆銆return TRUE;
銆銆}
銆銆// The constructor for the window class
銆銆CButtonWindow::CButtonWindow()
銆銆{
銆銆CRect r;
銆銆// Create the window itself
銆銆Create(NULL,
銆銆"CButton Tests",
銆銆WS_OVERLAPPEDWINDOW,
銆銆CRect(0,0,200,200));
銆銆// Get the size of the client rectangle
銆銆GetClientRect(&r);
銆銆r.InflateRect(-20,-20);
銆銆// Create a button
銆銆button = new CButton();
銆銆button->Create("Push me",
銆銆WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
銆銆r,
銆銆this,
銆銆IDB_BUTTON);
銆銆}
涓婅竟淇敼浜嗕袱涓湴鏂癸紝1澧炲姞浜嗕竴涓柊鐨勬垚鍛樺嚱鏁板拰涓涓柊鐨勮〃紺烘秷鎭槧灝勭殑瀹忋侶andleButton鍑芥暟鏄甯哥殑c++鍑芥暟錛屽畠閫氳繃afx_msg鏍囩紜畾涓烘秷鎭鐞嗗嚱鏁般傝鍑芥暟鏈変竴浜涚壒孌婄害鏉燂紝姣斿瀹冨繀欏繪槸void鍨嬪茍涓斾笉鑳芥帴鏀朵換浣曞弬鏁般?DECLARE_MESSAGE_MAP瀹忓緩绔嬩簡娑堟伅鏄犲皠銆傚嚱鏁板拰瀹忛兘蹇呴』鏄痯ublic鍨嬬殑銆?/font>
瀵規秷鎭槧灝勭殑鐞嗚В錛?/font>
娑堟伅鏄犲皠鏅鴻兘鐢ㄤ簬MFC銆備嬌鐢ㄦ秷鎭槧灝勭殑鍘熷洜鏄В鍐寵櫄鎷熷嚱鏁扮殑鍩烘湰闂銆?MFC鏂囦歡涓瑿Wnd綾伙紝瀹冨寘鍚?00澶氫釜鎴愬憳鍑芥暟錛屾墍鏈夋垚鍛樺嚱鏁板綋涓嶄嬌鐢ㄦ秷鎭槧灝勯兘鏄櫄鎷熺殑銆侻FC涓ぇ綰︽湁榪?0涓被鏄互CWnd涓哄熀綾葷殑銆傝繖鍖呮嫭鎵鏈夌殑鍙鎺у埗濡傛寜閽侀潤鎬佹爣絳懼拰鍒楄〃銆傛兂璞′竴涓嬶紝mfc浣跨敤铏氭嫙鍟婂拰浣犵啛錛屽茍涓斾綘寤虹珛浠ュ簲鐢ㄧ▼搴忓寘鍚?0涓帶鍒?CWnd涓?00涓櫄鎷熷嚱鏁頒腑姣忎釜閮介渶瑕佽嚜宸辯殑铏氭嫙鍑芥暟琛紝騫朵笖涓涓帶鍒剁殑姣忎釜渚嬬▼閮藉簲鏈変竴緇?00涓櫄鎷熷嚱鏁頒笌涔嬪叧鑱斻傚垯紼嬪簭鍙兘灝辨湁榪?000涓櫄鎷熷嚱鏁拌〃鍦ㄥ唴瀛樹腑錛岃繖瀵瑰唴瀛樻湁闄愮殑鍙婂叾鏉ヤ功鏄釜澶ч棶棰橈紝鍥犱負鍏朵腑鐨勫ぇ閮ㄥ垎鏄笉鐢ㄧ殑銆?/font>
娑堟伅鏄犲皠澶嶅埗浜嗚櫄鎷熷嚱鏁拌〃鐨勬搷浣滐紝浣嗘槸瀹冩槸鍩轟簬闇瑕佺殑鍩虹涔嬩笂鐨勩傛秷鎭槧灝勫氨鏄緋葷粺璇?#8220;褰撲綘鐪嬭涓涓壒孌婄殑娑堟伅鏃訛紝璇瘋皟鐢ㄥ埗瀹氱殑鍑芥暟”錛屽彧鏈夎繖浜涘嚱鏁板疄闄呬笂琚噸杞藉埌娑堟伅鏄犲皠涓紝灝辮妭鐪佷簩妤煎唴瀛樺拰cpu鐨勮礋鎷呫?/font>
CButtonST m_btn;2. 娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_btn.SetURL("www.scut.edu.cn");
m_btn.SetTooltipText("www.scut.edu.cn");
m_btn.SetBtnCursor(IDC_CURSOR1);
CButtonST m_btn;2. 娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30); m_btn.SetMenu(IDR_MENU, m_hWnd);娉ㄦ剰:鑿滃崟鐨勬晥鏋滅被浼間笌鍙抽敭鑿滃崟錛屾墍鏈夊湪璁劇疆鑿滃崟閫夐」鏃跺彧璁劇疆涓鍒楀氨澶熶簡銆傚彟澶栬彍鍗曠殑瀹藉害涓庤彍鍗曠殑鏂囧瓧闀垮害鏈夊叧錛屽彲浠ョ敤絀烘牸鍗犱綅鐨勫姙娉曚互杈懼埌鏈浣蟲晥鏋溿?br>
CButtonST m_btn;2.娣誨姞浣嶅浘璧勬簮錛孖D璁句負IDB_BITMAP1
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetBitmaps(IDB_BITMAP1,RGB(0,0,0)); m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);鎻愮ず: 涓婇潰鐨凷etBitmaps鍑芥暟浼氬皢鍥劇墖涓鑹插間負RGB(0,0,0)鐨勭偣璁句負閫忔槑銆?br>
CButtonST m_btn;2. 娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetAlign(CButtonST::ST_ALIGN_VERT); m_btn.DrawFlatFocus(TRUE);
CButtonST m_btn;2. 娣誨姞Icon璧勬簮錛孖D璁句負IDI_ICON1鍜孖DI_ICON2
m_btn.SubclassDlgItem(IDC_CHECK1,this); m_btn.SetIcon(IDI_ICON1,IDI_ICON2); m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);鎻愮ず:
CButtonST m_btn;2. 娣誨姞Icon璧勬簮錛孖D璁句負IDI_ICON1
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.DrawTransparent(TRUE);
涓嬭澆CButtonST紺轟緥婧愪唬鐮?/u>
涓嬭澆CButtonST綾葷殑婧愪唬鐮?/font>
鏈瘒涓昏鍖呮嫭浜嗕互涓嬬殑鏁堟灉錛?br>1. 鍦ㄦ寜閽笂鍔犲叆Icon錛屼嬌Icon鍜屾枃瀛楀悓鏃舵樉紺?/font>
2. 鏄劇ず騫抽潰鎸夐挳
3. 浣挎寜閽笂鐨勫浘鏍囧彲鍙?/font>
4. 璁劇疆鎸夐挳鍦ㄤ笉鍚岀姸鎬佷笅鐨勫簳鑹插拰鏂囧瓧棰滆壊
5. 璁劇疆鍥炬爣鍜屾枃瀛楃殑浣嶇疆
6. 鏍規嵁Icon鐨勫艦鐘惰緗寜閽殑褰㈢姸
7. 娣誨姞Tooltips
浠ヤ笅鏄疊asic Features鐨勬紨紺虹晫闈細
鏁堟灉涓錛氬湪鎸夐挳涓婂姞鍏con錛屼嬌Icon鍜屾枃瀛楀悓鏃舵樉紺?
鍋囪鎸夐挳ID涓篒DC_BUTTON1
1. 娣誨姞鎴愬憳鍙橀噺
CButtonST m_btn;
2. 娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
3. 鍦∣nInitDialog鍑芥暟涓垵濮嬪寲鎸夐挳
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetFlat(FALSE);
娉ㄦ剰:涓鴻揪鍒版渶濂芥晥鏋滐紝璇鋒牴鎹甀con鐨勫ぇ灝忚皟鏁存寜閽殑澶у皬銆?br>瀹炰緥錛氭紨紺虹▼搴忎腑鐨凷tandar 鎸夐挳銆?br>
鏁堟灉浜岋細鏄劇ず騫抽潰鎸夐挳
鍙渶瑕佸湪鏁堟灉涓鐨勫熀紜涓婃妸m_btn.SetFlat(FALSE);璇彞鍘繪帀銆?br>
鏁堟灉涓夛細浣挎寜閽笂鐨勫浘鏍囧彲鍙?/strong>
鍋囪鎸夐挳ID涓篒DC_BUTTON1
1. 娣誨姞鎴愬憳鍙橀噺
CButtonST m_btn;
2. 娣誨姞涓や釜Icon璧勬簮錛孖D璁句負IDI_ICON1鍜孖DI_ICON2
IDI_ICON1鏄櫘閫氱姸鎬佺殑鍥炬爣錛孖DI_ICON2鏄寜涓嬫椂鐨勫浘鏍?br>
3. 鍦∣nInitDialog鍑芥暟涓垵濮嬪寲鎸夐挳
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON2,IDI_ICON1);
瀹炰緥錛氭紨紺虹▼搴忎腑鐨凥alloween 鎸夐挳銆?
鏁堟灉鍥涳細璁劇疆鎸夐挳鍦ㄤ笉鍚岀姸鎬佷笅鐨勫簳鑹插拰鏂囧瓧棰滆壊
鍋囪鎸夐挳ID涓篒DC_BUTTON1
1. 娣誨姞鎴愬憳鍙橀噺
CButtonST m_btn;
2. 娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
3. 鍦∣nInitDialog鍑芥暟涓垵濮嬪寲鎸夐挳
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208)); m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208)); m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
鎻愮ず錛歋etColor鍑芥暟鍜孫ffsetColor鍑芥暟鐨勭涓涓弬鏁拌〃紺烘寜閽殑鍚勪釜鐘舵侊紝鍓嶆櫙鑹插氨鏄枃瀛楃殑棰滆壊錛屽畠浠殑鍙栧艱〃紺猴細
BTNST_COLOR_BK_IN //榧犳爣鏀懼湪鎸夐挳鍐呮椂鐨勮儗鏅壊 BTNST_COLOR_FG_IN, //榧犳爣鏀懼湪鎸夐挳鍐呮椂鐨勫墠鏅壊 BTNST_COLOR_BK_OUT, //鏅氱姸鎬佹椂鐨勮儗鏅壊 BTNST_COLOR_FG_OUT, //鏅氱姸鎬佹椂鐨勫墠鏅壊 BTNST_COLOR_BK_FOCUS, //鎸夐挳琚寜涓嬪悗鐨勮儗鏅壊 BTNST_COLOR_FG_FOCUS, //鎸夐挳琚寜涓嬪悗鐨勫墠鏅壊
瀹炰緥錛氭紨紺虹▼搴忎腑鐨?8×48 icon 鎸夐挳銆乑ip鎸夐挳絳夈?br>
鏁堟灉浜旓細璁劇疆鍥炬爣鍜屾枃瀛楃殑浣嶇疆
鍋囪鎸夐挳ID涓篒DC_BUTTON1
1.娣誨姞鎴愬憳鍙橀噺
CButtonST m_btn;
2.娣誨姞Icon璧勬簮錛孖D璁句負IDI_ICON1
3.鍦∣nInitDialog鍑芥暟涓垵濮嬪寲鎸夐挳
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
鎻愮ず錛歋etAlign鍑芥暟鐨勭涓涓弬鏁拌〃紺轟綅緗俊鎭紝緙虹渷鎯呭喌涓嬶紝鏂囧瓧鍦ㄥ浘鏍囧彸杈?/p>
ST_ALIGN_HORIZ // 鏂囧瓧鍦ㄥ彸 ST_ALIGN_VERT //鏂囧瓧鍦ㄤ笅 ST_ALIGN_HORIZ_RIGHT// 鏂囧瓧鍦ㄥ乏
瀹炰緥錛氭紨紺虹▼搴忎腑鐨凷earch 鎸夐挳銆?br>
鏁堟灉鍏細鏍規嵁Icon鐨勫艦鐘惰緗寜閽殑褰㈢姸
鍋囪鎸夐挳ID涓篒DC_BUTTON1
1.娣誨姞鎴愬憳鍙橀噺
CButtonST m_btn;
2.娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
3.鍦∣nInitDialog鍑芥暟涓垵濮嬪寲鎸夐挳
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.DrawBorder(FALSE); m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208)); m_btn.SetColor(CButtonST::BTNST_COLOR_BK_IN, RGB(208,208,208)); m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
娉ㄦ剰:涓鴻揪鍒版渶濂芥晥鏋滐紝璇鋒牴鎹甀con鐨勫ぇ灝忚皟鏁存寜閽殑澶у皬銆?br>騫舵牴鎹疄闄呮儏鍐佃緗儗鏅鑹層傝浜嬪厛灝嗘寜閽殑鏂囧瓧鍘繪帀銆?br>
鏁堟灉涓冿細娣誨姞Tooltips
鍋囪鎸夐挳ID涓篒DC_BUTTON1
1.娣誨姞鎴愬憳鍙橀噺
CButtonST m_btn;
2.娣誨姞Icon璧勬簮錛岃鍏禝D璁句負IDI_ICON1
3. 鍦∣nInitDialog鍑芥暟涓垵濮嬪寲鎸夐挳
m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetTooltipText(_T("This is a tooltip.\r\nMultiline!"));
鏌ヤ簡寰堝璧勬枡錛屼篃璇曚簡寰堝鍔炴硶錛岄兘瑙e喅涓嶄簡銆傜洰鍓嶅彧鑳介氳繃鎵嬪姩娣誨姞錛岃繖瀹炲湪涓嶆槸濂藉姙娉曘?nbsp;
涓嬮潰鏄綉涓婃敹闆嗙殑瑙e喅鍔炴硶錛岃В鍐蟲柟妗堬細
1銆侀噸鍚疺C/VS2005;
2銆佹墦寮Resource.h鏂囦歡鐪嬬湅錛屾湁浜涘畾涔夐噸澶嶄簡錛屽彲浠ユ墜鍔ㄦ敼鎺夛紝淇濆瓨錛岀紪杈戝櫒閲嶆柊鍔犺澆;
3銆佸叧闂В鍐蟲柟妗堬紝鍒犻櫎ncb鏂囦歡閲嶆柊娣誨姞鍗沖彲;錛堣繖涓瘯榪囷紝鏄彲浠ョ殑錛?/p>
4銆佸疄鍦ㄤ笉琛屽氨鎵嬪姩娣誨姞娑堟伅澶勭悊;
5銆佹煡鐪?h鍜?cpp鏂囦歡鐨勫睘鎬?鏈夊彲鑳芥槸鍙鐨?淇敼灞炴у悗灝卞彲浠ヤ簡;
6銆佹妸浣犺娣誨姞浜嬩歡鐨勫璇濇鐩稿簲鐨勭被鏂囦歡錛?.h鍜?.cpp錛夌粰鍏充簡灝卞彲浠ヤ簡;


{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_Card, m_card);
}
//娣誨姞ComboBox涓嬫媺閫夐」
//ComboBox灞炴ц緗腑鏈変釜sort閫夐」錛岃嫢涓篢rue鍒欐寜棣栧瓧姣嶉『搴忔坊鍔狅紝涓篎alse鍒欐瘡嬈℃坊鍔犲埌鍒楄〃鏈鍚?/span>
void CNewcomCosScriptView::OnCbnDropdownCard()

{
m_card.ResetContent();
m_card.AddString("SD");
m_card.AddString("PCSC");
}
//閫夋嫨ComboBox閫夐」
void CNewcomCosScriptView::OnCbnSelchangeCard()

{
UpdateData(FALSE);
int nCount = m_card.GetCount(); //鑾峰彇ComboBox涓厓绱犱釜鏁?br>
// int nTmp = m_card.SetCurSel(nCount - 1); //璁劇疆褰撳墠閫夐」涓烘渶鍚庝竴涓厓绱?nbsp; 
//鑾峰彇ComboBox鐨勫綋鍓嶅?/span>
int iPos = m_card.GetCurSel(); //褰撳墠閫変腑鐨勫厓绱犵儲寮?/span>
CString str;
m_card.GetLBText(m_card.GetCurSel(),str); //褰撳墠閫変腑鐨勫瓧絎︿覆
char *pa = (char*)((LPCTSTR)str);
//涓夌鍒ゆ柇鍧囧彲錛?br>
// if(!strcmp(pa,"SD"))
// if (str == "SD")
if (iPos == 1)
{

}
else if (iPos == 0)
{

}
}