﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-My C++-随笔分类-MFC</title><link>http://www.cppblog.com/finehai/category/11207.html</link><description>当时只道是寻常~</description><language>zh-cn</language><lastBuildDate>Fri, 18 Sep 2009 14:18:48 GMT</lastBuildDate><pubDate>Fri, 18 Sep 2009 14:18:48 GMT</pubDate><ttl>60</ttl><item><title>CString 成员函数用法大全</title><link>http://www.cppblog.com/finehai/archive/2009/09/17/96577.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Thu, 17 Sep 2009 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/09/17/96577.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/96577.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/09/17/96577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/96577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/96577.html</trackback:ping><description><![CDATA[<strong><font color=#0000cc>CString的构造函数<wbr><wbr><br></font></strong>CString( );<br>例：CString csStr;<br><br>CString( const CString&amp; stringSrc );<br>例：CString csStr("ABCDEF中文123456");<br>&nbsp;&nbsp;&nbsp;&nbsp;CString csStr2(csStr);<br><br>CString( TCHAR ch, int nRepeat = 1 );<br>例：CString csStr('a',5);<br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//csStr="aaaaa"</font><wbr><br><br>CString( LPCTSTR lpch, int nLength );<br>例：CString csStr("abcdef",3);<br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//csStr="abc"</font><wbr><br><br>CString( LPCWSTR lpsz );<br>例：wchar_t s[]=L"abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;CString csStr(s);<br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//csStr=L"abcdef"</font><wbr><br><br>CString( const unsigned char* psz );<br>例：const unsigned char s[]="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;const unsigned char* sp=s;<br>&nbsp;&nbsp;&nbsp;&nbsp;CString csStr(sp);<br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//csStr="abcdef"</font><wbr><br><br>CString( LPCSTR lpsz );<br>例：CString csStr("abcdef");<br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//csStr="abcdef"</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int GetLength( ) const;</strong><wbr></font><wbr><br>返回字符串的长度，不包含结尾的空字符。<br>例：csStr="ABCDEF中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("%d",csStr.GetLength());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//16</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void MakeReverse( );</strong><wbr></font><wbr><br>颠倒字符串的顺序<br>例：csStr="ABCDEF中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.MakeReverse();<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//654321文中FEDCBA</font><wbr><br><br><strong><wbr><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3>void MakeUpper( );</font><wbr></strong><wbr><br>将小写字母转换为大写字母<br>例：csStr="abcdef中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.MakeUpper();<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//ABCDEF中文123456</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void MakeLower( );</strong><wbr></font><wbr><br>将大写字母转换为小写字母<br>例：csStr="ABCDEF中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.MakeLower();<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//abcdef中文123456</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int Compare( LPCTSTR lpsz ) const;</strong><wbr></font><wbr><br>区分大小写比较两个字符串，相等时返回0，大于时返回1，小于时返回-1<br>例：csStr="abcdef中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr2="ABCDEF中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.CompareNoCase(csStr2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>&nbsp;&nbsp;//0</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int CompareNoCase( LPCTSTR lpsz ) const;</strong><wbr></font><wbr><br>不区分大小写比较两个字符串，相等时返回0，大于时返回1，小于时返回-1<br>例：csStr="abcdef中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr2="ABCDEF中文123456";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.CompareNoCase(csStr2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//-1</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int Delete( int nIndex, int nCount = 1 )</strong><wbr></font><wbr><br>删除字符，删除从下标nIndex开始的nCount个字符<br>例：csStr="ABCDEF";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Delete(2,3);<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>// ABF<br>//当nIndex过大，超出对像所在内存区域时，函数没有任何操作。<br>//当nIndex为负数时，从第一个字符开始删除。<br>//当nCount过大，导致删除字符超出对像所在内存区域时，会发生无法预料的结果。<br>//当nCount为负数时，函数没有任何操作。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int Insert( int nIndex, TCHAR ch )<br>int Insert( int nIndex, LPCTSTR pstr )</strong><wbr></font><wbr><br>在下标为nIndex的位置，插入字符或字符串。返回插入后对象的长度<br>例：csStr="abc";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Insert(2,'x');<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //abxc<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;csStr="abc";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Insert(2,"xyz");<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //abxyzc</font><wbr><br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//当nIndex为负数时，插入在对象开头<br>//当nIndex超出对象末尾时，插入在对象末尾</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int Remove( TCHAR ch );</strong><wbr></font><wbr><br>移除对象内的指定字符。返回移除的数目<br>例：csStr="aabbaacc";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Remove('a');<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //bbcc</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int Replace( TCHAR chOld, TCHAR chNew );<br>int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );</strong><wbr></font><wbr><br>替换字串<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Replace('a','x');<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//xbcdef</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Replace("abc","xyz");<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//xyzdef</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void TrimLeft( );<br>void TrimLeft( TCHAR chTarget );<br>void TrimLeft( LPCTSTR lpszTargets );</strong><wbr></font><wbr><br>从左删除字符，被删的字符与chTarget或lpszTargets匹配，一直删到第一个不匹配的字符为止<br>例：csStr="aaabaacdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.TrimLeft('a');<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//baacdef<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;csStr="aaabaacdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.TrimLeft("ab");<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>&nbsp;&nbsp;//cdef</font><wbr><br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//无参数时删除空格</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void TrimRight( );<br>void TrimRight( TCHAR chTarget );<br>void TrimRight( LPCTSTR lpszTargets );</strong><wbr></font><wbr><br>从右删除字符，被删的字符与chTarget或lpszTargets匹配，一直删到第一个不匹配的字符为止<br>例：csStr="abcdeaafaaa";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.TrimRight('a');<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//abcdeaaf</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;csStr="abcdeaafaaa";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.TrimRight("fa");<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//abcde<br>//无参数时删除空格</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void Empty( );</strong><wbr></font><wbr><br>清空<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Empty();<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("%d",csStr.GetLength());&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//0</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>BOOL IsEmpty( ) const;</strong><wbr></font><wbr><br>测试对象是否为空，为空时返回零，不为空时返回非零<br>例：csStr="abc";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.IsEmpty();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//0;<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;csStr.Empty();<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.IsEmpty();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//1;</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int Find( TCHAR ch ) const;<br>int Find( LPCTSTR lpszSub ) const;<br>int Find( TCHAR ch, int nStart ) const;<br>int Find( LPCTSTR pstr, int nStart ) const;</strong><wbr></font><wbr><br>查找字串，nStart为开始查找的位置。未找到匹配时返回-1，否则返回字串的开始位置<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Find('b');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//1<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Find("de");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//3</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Find('b',3);&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//-1</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Find('b',0);&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//1</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Find("de",4);&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//-1</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Find("de",0);&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//3</font><wbr><br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//当nStart超出对象末尾时，返回-1。<br>//当nStart为负数时，返回-1。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int FindOneOf( LPCTSTR lpszCharSet ) const;</strong><wbr></font><wbr><br>查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1，否则返回字串的开始位置<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.FindOneOf("cxy");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //2</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>CString SpanExcluding( LPCTSTR lpszCharSet ) const;</strong><wbr></font><wbr><br>返回对象中与lpszCharSet中任意匹配的第一个字符之前的子串<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.SpanExcluding("cf");&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//ab</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>CString SpanIncluding( LPCTSTR lpszCharSet ) const;</strong><wbr></font><wbr><br>从对象中查找与lpszCharSe中任意字符不匹配的字符，并返回第一个不匹配字符之前的字串<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.SpanIncluding("fdcba");&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//abcd</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>int ReverseFind( TCHAR ch ) const;</strong><wbr></font><wbr><br>从后向前查找第一个匹配，找到时返回下标。没找到时返回-1<br>例：csStr="abba";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.ReverseFind('a');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//3</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void Format( LPCTSTR lpszFormat, ... );<br>void Format( UINT nFormatID, ... );</strong><wbr></font><wbr><br>格式化对象，与C语言的sprintf函数用法相同<br>例：csStr.Format("%d",13);<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//13</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>TCHAR GetAt( int nIndex ) const;</strong><wbr></font><wbr><br>返回下标为nIndex的字符，与字符串的[]用法相同<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.GetAt(2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//c<br>//当nIndex为负数或超出对象末尾时，会发生无法预料的结果。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void SetAt( int nIndex, TCHAR ch );</strong><wbr></font><wbr><br>给下标为nIndex的字符重新赋值<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.SetAt(2,'x');<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//abxdef<br>//当nIndex为负数或超出对象末尾时，会发生无法预料的结果。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>CString Left( int nCount ) const;</strong><wbr></font><wbr><br>从左取字串<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Left(3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //abc<br>//当nCount等于0时，返回空。<br>//当nCount为负数时，返回空。<br>//当nCount大于对象长度时，返回值与对象相同。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>CString Right( int nCount ) const;</strong><wbr></font><wbr><br>从右取字串<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Right(3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//def<br>//当nCount等于0时，返回空。<br>//当nCount为负数时，返回空。<br>//当nCount大于对象长度时，返回值与对象相同。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>CString Mid( int nFirst ) const;<br>CString Mid( int nFirst, int nCount ) const;</strong><wbr></font><wbr><br>从中间开始取字串<br>例：csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Mid(2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//cdef<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;csStr="abcdef";<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.Mid(2,3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//cde<br>//当nFirst为0和为负数时，从第一个字符开始取。<br>//当nFirst等于对象末尾时，返回空字串。<br>//当nFirst超出对象末尾时，会发生无法预料的结果。<br>//当nCount超出对象末尾时，返回从nFirst开始一直到对象末尾的字串<br>//当nCount为0和为负数时，返回空字串。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>LPTSTR GetBuffer( int nMinBufLength );</strong><wbr></font><wbr><br>申请新的空间，并返回指针<br>例：csStr="abcde";<br>&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR pStr=csStr.GetBuffer(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pStr,"12345");<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;pStr=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //12345<br>//使用完GetBuffer后，必须使用ReleaseBuffer以更新对象内部数据，否则会发生无法预料的结果。</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>void ReleaseBuffer( int nNewLength = -1 );</strong><wbr></font><wbr><br>使用GetBuffer后，必须使用ReleaseBuffer以更新对象内部数据<br>例：csStr="abc";<br>&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR pStr=csStr.GetBuffer(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pStr,"12345");<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.GetLength();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//3(错误的用法)</font><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr.GetLength();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//5(正确)<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;pStr=NULL;<br><font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//CString对象的任何方法都应在ReleaseBuffer之后调用</font><wbr><br><br><font style="LINE-HEIGHT: 1.5em" face="" color=#0000cc size=3><strong><wbr>LPTSTR GetBufferSetLength( int nNewLength );</strong><wbr></font><wbr><br>申请新的空间，并返回指针<br>例：csStr="abc";<br>&nbsp;&nbsp;&nbsp;&nbsp;csStr.GetBufferSetLength(20);<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;csStr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//abc<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;count&lt;&lt;csStr.GetLength();&nbsp;&nbsp;&nbsp;&nbsp;<font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3> //20;<br></font><wbr>&nbsp;&nbsp;&nbsp;&nbsp;csStr.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;count&lt;&lt;csStr.GetLength();&nbsp;&nbsp;&nbsp;&nbsp; <font style="LINE-HEIGHT: 1.5em" face="" color=#990000 size=3>//3;<br>//使用GetBufferSetLength后可以不必使用ReleaseBuffer。<br></font><wbr><img id=paperPicArea1 style="DISPLAY: none; POSITION: relative" height=1 alt="" src="http://qzone.qq.com/ac/b.gif" width=1>
<img src ="http://www.cppblog.com/finehai/aggbug/96577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-09-17 22:13 <a href="http://www.cppblog.com/finehai/archive/2009/09/17/96577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CListCtrl控件使用方法总结</title><link>http://www.cppblog.com/finehai/archive/2009/09/17/96574.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Thu, 17 Sep 2009 14:11:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/09/17/96574.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/96574.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/09/17/96574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/96574.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/96574.html</trackback:ping><description><![CDATA[今天第一次用CListCtrl控件，遇到不少问题，查了许多资料，现将用到的一些东西总结如下：<br>
<p>以下未经说明，listctrl默认view 风格为report</p>
<p>相关类及处理函数<br></p>
<p>MFC：CListCtrl类</p>
<p>SDK：以 &#8220;ListView_&#8221;开头的一些宏。如 ListView_InsertColumn<br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,102)"><span style="COLOR: rgb(153,51,0)">1. CListCtrl 风格</span></span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_ICON: 为每个item显示大图标<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_SMALLICON: 为每个item显示小图标<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_LIST: 显示一列带有小图标的item<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_REPORT: 显示item详细资料</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 直观的理解：windows资源管理器，&#8220;查看&#8221;标签下的&#8220;大图标，小图标，列表，详细资料&#8221;</p>
<p><br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">2. 设置listctrl 风格及扩展风格</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG lStyle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lStyle &amp;= ~LVS_TYPEMASK; //清除显示方式位<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lStyle |= LVS_REPORT; //设置style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwStyle = m_list.GetExtendedStyle();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮（只适用与report风格的listctrl）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwStyle |= LVS_EX_GRIDLINES;//网格线（只适用与report风格的listctrl）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetExtendedStyle(dwStyle); //设置扩展风格<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：listview的style请查阅msdn<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp"><u><font color=#0000ff>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp</font></u></a><br></p>
<p>&nbsp;</p>
<u>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</u>
<h3><span style="COLOR: rgb(153,51,0)">3. 插入数据</span></h3>
<p><span style="COLOR: rgb(153,51,0)"></span><span style="COLOR: rgb(153,51,0)"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nRow = m_list.InsertItem(0, &#8220;11&#8221;);//插入行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetItemText(nRow, 1, &#8220;jacky&#8221;);//设置数据<br></p>
<p>&nbsp;</p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(51,102,255)"><span style="COLOR: rgb(153,51,0)">4. 一直选中item</span></span></h3>
<span style="FONT-WEIGHT: bold">&nbsp;&nbsp;&nbsp; </span>选中style中的Show selection always，或者在上面第2点中设置LVS_SHOWSELALWAYS<br><br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">5. 选中和取消选中一行</span></h3>
<p>&nbsp;&nbsp;&nbsp; int nIndex = 0;<br>&nbsp;&nbsp;&nbsp; //选中<br>&nbsp;&nbsp;&nbsp; m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);<br>&nbsp;&nbsp;&nbsp; //取消选中<br>&nbsp;&nbsp;&nbsp; m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);<br>&nbsp;</p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">6. 得到listctrl中所有行的checkbox的状态</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;m_list.GetItemCount(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.Format(_T("第%d行的checkbox为选中状态"), i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></p>
<p><br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">7. 得到listctrl中所有选中行的序号</span></h3>
<h3><span style="COLOR: rgb(153,51,0)"></span></h3>
<p><span style="COLOR: rgb(153,51,0)"><br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;m_list.GetItemCount(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.Format(_T("选中了第%d行"), i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法二：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POSITION pos = m_list.GetFirstSelectedItemPosition();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE0("No items were selected!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (pos)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.GetNextSelectedItem(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE1("Item %d was selected!\n", nItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // you could do your own processing on nItem here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></p>
<p><br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">8. 得到item的信息</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCHAR szBuf[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVITEM lvi;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.iItem = nItemIndex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.iSubItem = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.mask = LVIF_TEXT;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.pszText = szBuf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.cchTextMax = 1024;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.GetItem(&amp;lvi);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于得到设置item的状态，还可以参考msdn文章<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Q173242: Use Masks to Set/Get Item States in CListCtrl<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://support.microsoft.com/kb/173242/en-us"><u><font color=#0000ff>http://support.microsoft.com/kb/173242/en-us</font></u></a><br></p>
<p><u><br><font color=#0000ff></font></u></p>
<u><font color=#0000ff>
<hr style="WIDTH: 100%; HEIGHT: 2px">
</font></u>
<h3><span style="COLOR: rgb(51,102,255)"><span style="COLOR: rgb(153,51,0)">9. 得到listctrl的所有列的header字符串内容</span></span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVCOLUMN lvcol;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp; str[256];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; nColNum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString&nbsp; strColumnName[4];//假如有4列</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nColNum = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvcol.mask = LVCF_TEXT;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvcol.pszText = str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvcol.cchTextMax = 256;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(m_list.GetColumn(nColNum, &amp;lvcol))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strColumnName[nColNum] = lvcol.pszText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nColNum++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></p>
<p><br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">10. 使listctrl中一项可见，即滚动滚动条</span></h3>
&nbsp;&nbsp;&nbsp; m_list.EnsureVisible(i, FALSE);<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">11. 得到listctrl列数</span></h3>
&nbsp;&nbsp;&nbsp; int nHeadNum = m_list.GetHeaderCtrl()-&gt;GetItemCount();<br><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">12. 删除所有列</span></h3>
<p>&nbsp;&nbsp;&nbsp; &nbsp; 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ( m_list.DeleteColumn (0))<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 因为你删除了第一列后，后面的列会依次向上移动。</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp; 方法二：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nColumns = 4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=nColumns-1; i&gt;=0; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_list.DeleteColumn (i);<br></p>
<p><br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">13. 得到单击的listctrl的行列号</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的NM_CLICK消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwPos = GetMessagePos();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.ScreenToClient(&amp;point);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVHITTESTINFO lvinfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.pt = point;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.flags = LVHT_ABOVE;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.SubItemHitTest(&amp;lvinfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nItem != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strtemp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(strtemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 方法二:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pNMListView-&gt;iItem != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strtemp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strtemp.Format("单击的是第%d行第%d列",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pNMListView-&gt;iItem, pNMListView-&gt;iSubItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(strtemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></p>
<p>&nbsp;</p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">14. 判断是否点击在listctrl的checkbox上</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的NM_CLICK消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwPos = GetMessagePos();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.ScreenToClient(&amp;point);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVHITTESTINFO lvinfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.pt = point;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.flags = LVHT_ABOVE;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT nFlag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.HitTest(point, &amp;nFlag);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断是否点在checkbox上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nFlag == LVHT_ONITEMSTATEICON)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("点在listctrl的checkbox上");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></p>
<p><br></p>
<hr style="WIDTH: 100%; HEIGHT: 2px">
<h3><span style="COLOR: rgb(153,51,0)">15. 右键点击listctrl的item弹出菜单</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的NM_RCLICK消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pNMListView-&gt;iItem != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwPos = GetMessagePos();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMenu menu;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VERIFY( menu.LoadMenu( IDR_MENU1 ) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMenu* popup = menu.GetSubMenu(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT( popup != NULL );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popup-&gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp; }<br></p>
<p><br></p>
<p>&nbsp;</p>
<hr style="WIDTH: 100%; HEIGHT: 1px">
<h3><span style="COLOR: rgb(153,51,0)">16. item切换焦点时(包括用键盘和鼠标切换item时)，状态的一些变化顺序</span></h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的LVN_ITEMCHANGED消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Add your control notification handler code here<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString sTemp;<br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == LVIS_FOCUSED &amp;&amp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d losted focus",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == 0 &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == LVIS_FOCUSED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d got focus",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == LVIS_SELECTED &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d losted selected",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == 0 &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == LVIS_SELECTED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d got selected",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br></p>
<br>
<hr style="WIDTH: 100%; HEIGHT: 1px">
&nbsp;<br>
<p><span><strong><span style="COLOR: rgb(153,51,0)">17. 改变选中行的颜色</span><br></strong></span><br>首先是添加以下消息</p>
<p>ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST1, OnDrawColorForMyList )&nbsp; //为改变颜色添加的消息</p>
<p>再添加类成员函数,就OK了:<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">改变&nbsp;m_List&nbsp;控件单行的颜色</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CSSDTDlg::OnDrawColorForMyList(&nbsp;NMHDR&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pNmHdr,&nbsp;LRESULT&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;)<br><img id=Codehighlighter1_92_1029_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_1029_Open_Text.style.display='none'; Codehighlighter1_92_1029_Closed_Image.style.display='inline'; Codehighlighter1_92_1029_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_92_1029_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_1029_Closed_Text.style.display='none'; Codehighlighter1_92_1029_Open_Image.style.display='inline'; Codehighlighter1_92_1029_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_92_1029_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_92_1029_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;NMLVCUSTOMDRAW</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pLVCD&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">NMLVCUSTOMDRAW</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(&nbsp;pNmHdr&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CDRF_DODEFAULT;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;CDDS_PREPAINT&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;pLVCD</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">nmcd.dwDrawStage&nbsp;)<br><img id=Codehighlighter1_247_290_Open_Image onclick="this.style.display='none'; Codehighlighter1_247_290_Open_Text.style.display='none'; Codehighlighter1_247_290_Closed_Image.style.display='inline'; Codehighlighter1_247_290_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_247_290_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_247_290_Closed_Text.style.display='none'; Codehighlighter1_247_290_Open_Image.style.display='inline'; Codehighlighter1_247_290_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_247_290_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_247_290_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CDRF_NOTIFYITEMDRAW;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;CDDS_ITEMPREPAINT&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;pLVCD</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">nmcd.dwDrawStage&nbsp;)<br><img id=Codehighlighter1_354_400_Open_Image onclick="this.style.display='none'; Codehighlighter1_354_400_Open_Text.style.display='none'; Codehighlighter1_354_400_Closed_Image.style.display='inline'; Codehighlighter1_354_400_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_354_400_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_354_400_Closed_Text.style.display='none'; Codehighlighter1_354_400_Open_Image.style.display='inline'; Codehighlighter1_354_400_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_354_400_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_354_400_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CDRF_NOTIFYSUBITEMDRAW;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;(CDDS_ITEMPREPAINT&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;CDDS_SUBITEM)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;pLVCD</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">nmcd.dwDrawStage&nbsp;)<br><img id=Codehighlighter1_481_1027_Open_Image onclick="this.style.display='none'; Codehighlighter1_481_1027_Open_Text.style.display='none'; Codehighlighter1_481_1027_Closed_Image.style.display='inline'; Codehighlighter1_481_1027_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_481_1027_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_481_1027_Closed_Text.style.display='none'; Codehighlighter1_481_1027_Open_Image.style.display='inline'; Codehighlighter1_481_1027_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_481_1027_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_481_1027_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;COLORREF&nbsp;clrNewTextColor,&nbsp;clrNewBkColor;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;nItem&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(&nbsp;pLVCD</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">nmcd.dwItemSpec&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">选中行显示字体为红色,否则为黑色</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_item&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;nItem)&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置为红色</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_651_694_Open_Image onclick="this.style.display='none'; Codehighlighter1_651_694_Open_Text.style.display='none'; Codehighlighter1_651_694_Closed_Image.style.display='inline'; Codehighlighter1_651_694_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_651_694_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_651_694_Closed_Text.style.display='none'; Codehighlighter1_651_694_Open_Image.style.display='inline'; Codehighlighter1_651_694_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span id=Codehighlighter1_651_694_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_651_694_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;clrNewTextColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;RGB(&nbsp;</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置为黑色</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_714_755_Open_Image onclick="this.style.display='none'; Codehighlighter1_714_755_Open_Text.style.display='none'; Codehighlighter1_714_755_Closed_Image.style.display='inline'; Codehighlighter1_714_755_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_714_755_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_714_755_Closed_Text.style.display='none'; Codehighlighter1_714_755_Open_Image.style.display='inline'; Codehighlighter1_714_755_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span id=Codehighlighter1_714_755_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_714_755_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;clrNewTextColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;RGB(&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置背景色</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;nItem</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)<br><img id=Codehighlighter1_790_847_Open_Image onclick="this.style.display='none'; Codehighlighter1_790_847_Open_Text.style.display='none'; Codehighlighter1_790_847_Closed_Image.style.display='inline'; Codehighlighter1_790_847_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_790_847_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_790_847_Closed_Text.style.display='none'; Codehighlighter1_790_847_Open_Image.style.display='inline'; Codehighlighter1_790_847_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_790_847_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_790_847_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;clrNewBkColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;RGB(&nbsp;</span><span style="COLOR: #000000">240</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">240</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">240</span><span style="COLOR: #000000">&nbsp;);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">偶数行背景色为灰色</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_858_915_Open_Image onclick="this.style.display='none'; Codehighlighter1_858_915_Open_Text.style.display='none'; Codehighlighter1_858_915_Closed_Image.style.display='inline'; Codehighlighter1_858_915_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_858_915_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_858_915_Closed_Text.style.display='none'; Codehighlighter1_858_915_Open_Image.style.display='inline'; Codehighlighter1_858_915_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_858_915_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_858_915_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;clrNewBkColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;RGB(&nbsp;</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">255</span><span style="COLOR: #000000">&nbsp;);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">奇数行背景色为白色</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;pLVCD</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">clrText&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;clrNewTextColor;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;pLVCD</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">clrTextBk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;clrNewBkColor;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CDRF_DODEFAULT;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br>更多技巧参见以下链接：<br><a href="http://blog.csdn.net/danforn/archive/2008/06/03/2508070.aspx">http://blog.csdn.net/danforn/archive/2008/06/03/2508070.aspx</a><br><br>
<img src ="http://www.cppblog.com/finehai/aggbug/96574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-09-17 22:11 <a href="http://www.cppblog.com/finehai/archive/2009/09/17/96574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用颜色的RGB值</title><link>http://www.cppblog.com/finehai/archive/2009/09/17/96575.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Thu, 17 Sep 2009 14:11:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/09/17/96575.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/96575.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/09/17/96575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/96575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/96575.html</trackback:ping><description><![CDATA[<font face=#ce_temp_font#>
<p>在程序中指定颜色一般试用RGB函数,分别输入R、G、B值。RGB函数返回颜色值(Long)。如果在程序中直接指定颜色对应的值，可以稍微加快程序的运行速度。特别在使单双行显示不同颜色等频繁调用RGB函数时，效果要好一些。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 下表是一些常用颜色的值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; Colour&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Green&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Blue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 黑色&nbsp;&nbsp; Black&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 白色&nbsp;&nbsp; White&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 16777215&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 灰色&nbsp;&nbsp; Gray&nbsp;&nbsp;&nbsp; 192&nbsp;&nbsp;&nbsp; 192&nbsp;&nbsp;&nbsp; 192&nbsp;&nbsp;&nbsp; 12632256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 深灰色&nbsp;&nbsp;&nbsp; Dark&nbsp;&nbsp;&nbsp; Grey&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 8421504&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 红色&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 深红色&nbsp;&nbsp;&nbsp; Dark&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 绿色&nbsp;&nbsp;&nbsp; Green&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 65280&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 深绿色&nbsp;&nbsp;&nbsp; Dark&nbsp;&nbsp;&nbsp; Green&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 32768&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 蓝色&nbsp;&nbsp;&nbsp; Blue&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 16711680&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 深蓝色&nbsp;&nbsp;&nbsp; Dark&nbsp;&nbsp;&nbsp; Blue&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 8388608&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 紫红色&nbsp;&nbsp;&nbsp; Magenta&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 16711935&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 深紫红&nbsp;&nbsp;&nbsp; Dark&nbsp;&nbsp;&nbsp; Magenta&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 8388736&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 紫色&nbsp;&nbsp;&nbsp; Cyan&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 16776960&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 深紫&nbsp;&nbsp;&nbsp; Dark&nbsp;&nbsp;&nbsp; Cyan&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 8421376&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 黄色&nbsp;&nbsp;&nbsp; Yellow&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 65535&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 棕色&nbsp;&nbsp;&nbsp; Brown&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 128&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 32896&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 特殊颜色&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; Button&nbsp;&nbsp;&nbsp; Face&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 79741120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; Text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33554432&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; Background&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1090519039&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; App.&nbsp;&nbsp;&nbsp; Workspace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 276856960&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; RGB函数计算公式:&nbsp;&nbsp;&nbsp; 颜色值&nbsp;&nbsp;&nbsp; ＝&nbsp;&nbsp;&nbsp; (65536&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; Blue)&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; (256&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; Green)&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; (Red) <br><br>==============================================<br><br>rgb(r,g,b)=r+g*256+b*256*256<br><br>=================================<br><br>Dim color As Double<br>Dim r, g, b As Integer<br>color = RGB(0, 0, 0)<br>r = color Mod 256<br>g = (color \ 256) Mod 256<br>b = (color \ 256 \ 256) Mod 256<br>Print r<br>Print g<br>Print b</p>
<p>//更多信息：<a href="http://www.webcha.com/gongju/chaxun1/search_121.htm"><font color=#0000ff><u>http://www.webcha.com/gongju/chaxun1/search_121.htm</u></font></a></p>
<p><a href="http://www.wy265.com/cha/rgbyanse.htm"><u><font color=#0000ff>http://www.wy265.com/cha/rgbyanse.htm</font></u></a></p>
</font>
<img src ="http://www.cppblog.com/finehai/aggbug/96575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-09-17 22:11 <a href="http://www.cppblog.com/finehai/archive/2009/09/17/96575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC]选择目录对话框和选择文件对话框</title><link>http://www.cppblog.com/finehai/archive/2009/08/27/94578.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Thu, 27 Aug 2009 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/08/27/94578.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/94578.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/08/27/94578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/94578.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/94578.html</trackback:ping><description><![CDATA[在MFC编程中经常会需要用到选择目录和选择文件的界面，以下总结一下本人常用的这两种对话框的生成方法：<br><br><strong>选择目录对话框<br></strong><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">选择目录按钮</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CDcPackerDlg::OnBnClickedDecgen()&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_52_656_Open_Image onclick="this.style.display='none'; Codehighlighter1_52_656_Open_Text.style.display='none'; Codehighlighter1_52_656_Closed_Image.style.display='inline'; Codehighlighter1_52_656_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_52_656_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_656_Closed_Text.style.display='none'; Codehighlighter1_52_656_Open_Image.style.display='inline'; Codehighlighter1_52_656_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_52_656_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_52_656_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;szPath[MAX_PATH];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">存放选择的目录路径&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;str;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(szPath,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(szPath));&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;BROWSEINFO&nbsp;bi;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.hwndOwner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_hWnd;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.pidlRoot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.pszDisplayName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;szPath;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.lpszTitle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">请选择需要打包的目录：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.ulFlags&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.lpfn&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.lParam&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bi.iImage&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">弹出选择目录对话框</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPITEMIDLIST&nbsp;lp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;SHBrowseForFolder(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">bi);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(lp&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;SHGetPathFromIDList(lp,&nbsp;szPath))&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_517_601_Open_Image onclick="this.style.display='none'; Codehighlighter1_517_601_Open_Text.style.display='none'; Codehighlighter1_517_601_Closed_Image.style.display='inline'; Codehighlighter1_517_601_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_517_601_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_517_601_Closed_Text.style.display='none'; Codehighlighter1_517_601_Open_Image.style.display='inline'; Codehighlighter1_517_601_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_517_601_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_517_601_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.Format(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">选择的目录为&nbsp;%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;&nbsp;szPath);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(str);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">无效的目录，请重新选择</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><br><strong>选择文件对话框<br></strong><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">CString&nbsp;CDcPackerDlg::BootOpenDialog()&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回选择的文件名称</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_53_316_Open_Image onclick="this.style.display='none'; Codehighlighter1_53_316_Open_Text.style.display='none'; Codehighlighter1_53_316_Closed_Image.style.display='inline'; Codehighlighter1_53_316_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_53_316_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_316_Closed_Text.style.display='none'; Codehighlighter1_53_316_Open_Image.style.display='inline'; Codehighlighter1_53_316_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_53_316_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_53_316_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;strFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_T(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CFileDialog&nbsp;&nbsp;&nbsp;&nbsp;dlgFile(TRUE,&nbsp;NULL,&nbsp;NULL,&nbsp;OFN_HIDEREADONLY,&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Describe&nbsp;Files&nbsp;(*.cfg)|*.cfg|All&nbsp;Files&nbsp;(*.*)|*.*||</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;NULL);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(dlgFile.DoModal())<br><img id=Codehighlighter1_246_293_Open_Image onclick="this.style.display='none'; Codehighlighter1_246_293_Open_Text.style.display='none'; Codehighlighter1_246_293_Closed_Image.style.display='inline'; Codehighlighter1_246_293_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_246_293_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_246_293_Closed_Text.style.display='none'; Codehighlighter1_246_293_Open_Image.style.display='inline'; Codehighlighter1_246_293_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_246_293_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_246_293_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dlgFile.GetPathName();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;strFile;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">加载文件按钮</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CDcPackerDlg::OnBnClickedSelectdec()<br><img id=Codehighlighter1_370_548_Open_Image onclick="this.style.display='none'; Codehighlighter1_370_548_Open_Text.style.display='none'; Codehighlighter1_370_548_Closed_Image.style.display='inline'; Codehighlighter1_370_548_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_370_548_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_370_548_Closed_Text.style.display='none'; Codehighlighter1_370_548_Open_Image.style.display='inline'; Codehighlighter1_370_548_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_370_548_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_370_548_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_strDescPath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">类的成员变量<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">"打开文件"对话框，选择文件，返回其路径</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_strDescPath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;BootOpenDialog();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>
<img src ="http://www.cppblog.com/finehai/aggbug/94578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-08-27 17:28 <a href="http://www.cppblog.com/finehai/archive/2009/08/27/94578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库编程快速入门</title><link>http://www.cppblog.com/finehai/archive/2009/07/20/90595.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Mon, 20 Jul 2009 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/20/90595.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90595.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/20/90595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90595.html</trackback:ping><description><![CDATA[大多数应用程序都使用数据库，各种管理软件、ERP、CRM系统均需要数据库来保存和维护应用程序的数据，在VC中提供了多种数据库访问技术，不过目前最流行的是ODBC（开放式数据库接口）和ADO（活动对象模型)。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 一.数据库技术初步 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; 1.ODBC基本概念 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; ODBC(Open &nbsp; Database &nbsp; Connectivity，开放数据库互连)是微软公司开放服务结构(WOSA，Windows &nbsp; Open &nbsp; Services &nbsp; Architecture)中有关数据库的一个组成部分，它建立了一组规范，并提供了一组对数据库访问的标准API（应用程序编程接口）。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持，用户可以直接将SQL语句送给ODBC。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS，不直接与DBMS打交道，所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说，不论是FoxPro、Access还是Oracle数据库，均可用ODBC &nbsp; API进行访问。由此可见，ODBC的最大优点是能以统一的方式处理所有的数据库。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　一个完整的ODBC由下列几个部件组成： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　应用程序(Application)。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　ODBC管理器(Administrator)。该程序位于Windows &nbsp; 95控制面板(Control &nbsp; Panel)的32位ODBC内，其主要任务是管理安装的ODBC驱动程序和管理数据源。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　驱动程序管理器(Driver &nbsp; Manager)。驱动程序管理器包含在ODBC32.DLL中，对用户是透明的。其任务是管理ODBC驱动程序，是ODBC中最重要的部件。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　ODBC &nbsp; API。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　ODBC &nbsp; 驱动程序。是一些DLL，提供了ODBC和数据库之间的接口。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　数据源。数据源包含了数据库位置和数据库类型等信息，实际上是一种数据连接的抽象。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　应用程序要访问一个数据库，首先必须用ODBC管理器注册一个数据源，管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息，建立起ODBC与具体数据库的联系。这样，只要应用程序将数据源名提供给ODBC，ODBC就能建立起与相应数据库的连接。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　在ODBC中，ODBC &nbsp; API不能直接访问数据库，必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC &nbsp; API的调用传递给正确的驱动程序，而驱动程序在执行完相应的操作后，将结果通过驱动程序管理器返回给应用程序。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　在访问ODBC数据源时需要ODBC驱动程序的支持。用Visual &nbsp; C++ &nbsp; 5.0安装程序可以安装SQL &nbsp; Server、 &nbsp; Access、 &nbsp; Paradox、 &nbsp; dBase、 &nbsp; FoxPro、 &nbsp; Excel、 &nbsp; Oracle &nbsp; 和Microsoft &nbsp; Text等驱动程序．在缺省情况下，VC5.0只会安装SQL &nbsp; Server、 &nbsp; Access、 &nbsp; FoxPro和dBase的驱动程序．如果用户需要安装别的驱动程序，则需要重新运行VC &nbsp; 5.0的安装程序并选择所需的驱动程序。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; 2.ADO对象访问模型 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; 1)ADO是微软整个COM战略体系中的一个组成部分 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　 &nbsp; 活动数据对象（ADO）是一组由微软提供的COM组件。 &nbsp; ADO建立在微软所提倡的COM体系结构之上，它的所有接口都是自动化接口，因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO通过使用OLE &nbsp; DB这一新技术实现了以相同方式可以访问关系数据库、文本文件、非关系数据库、索引服务器和活跃目录服务等的数据，扩大了应用程序中可使用的数据源范围，从而成为微软整个COM战略体系中访问数据源组件的首选，是ODBC的替代产品。 <br>2)ADO对象模型组成 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　与微软的其它数据访问模型DAO和RDO相比，ADO对象模型非常精炼，仅由三个主要对象Connection、Command、Recordset和几个辅助对象组成。Connection对象提供OLE &nbsp; DB数据源和对话对象之间的关联，它通过用户名称和口令来处理用户身份的鉴别，并提供事务处理的支持；它还提供执行方法，从而简化数据源的连接和数据检索的进程。Command对象封装了数据源可以解释的命令，该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。Record &nbsp; set用于表示从数据源中返回的表格数据，它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法，还提供了批量更新记录的能力。其它辅助对象则分别提供封装ADO错误、封装命令参数和封装记录集合的列。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　3)ADO的特点分析 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　(a)由于封装了许多底层工作，使用ADO与使用ODBC几乎是一样方便。 &nbsp; <br>&nbsp; 　　(b) &nbsp; ADO不仅具有ODBC的主要功能，而且ADO适用的数据源的范围要大的多。 &nbsp; <br>&nbsp; 　　(c)在定义ADO记录集变量和数据库表字段绑定类时，要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在FMC中使用ODBC要复杂一些。但在数据库字段与ADO记录集字段变量绑定的宏中，ADO &nbsp; 提供的数据类型要远多于FMC中的RFX（如日期时间类型，在ODBC中只能转换为Cstring类型）。 &nbsp; <br>&nbsp; 　　(d)ADO允许同一Connection实例下有多个Record &nbsp; set实例。 &nbsp; <br><clk style="FONT-SIZE: 12px">&nbsp; 　　(e)ADO允许进行批更新（使用的Update &nbsp; Batch方法），这样将大大减轻<nobr oncontextmenu="return false" onmousemove=$cE.MoW() id=clickeyekey0 onmouseover=$cE.s(event,0) style="FONT-SIZE: 12px; COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick='$cE.defer(this);$cE.c(event,0,"",1)' onmouseout=$cE.OuK()>网络</nobr>负担，提高数据库处理效率。 &nbsp; </clk><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; 4) &nbsp; ADO在Visual &nbsp; C++中的使用 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　利用微软在Micrsoft &nbsp; Studio &nbsp; 6中提供的ADO2，可以在Visual &nbsp; C++中使用ADO接口操纵SQL &nbsp; SERVER数据库。在编译型高级语言中使用ADO,比起在一些脚本语言（如Visual &nbsp; Basic &nbsp; Scropt和JavaScript）中使用ADO要困难一些。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　以下给出一个Visual &nbsp; C++下使用ADO的Connection对象及其Record &nbsp; set对象的基本步骤： &nbsp; <br>&nbsp; 　　（a） &nbsp; 使用import指令引入ADO2组件 &nbsp; <br>&nbsp; 　　例：#import &nbsp; "C:\ADO\msado15.dll" &nbsp; no_namespace &nbsp; rename("EOF", &nbsp; "EndOfFile") &nbsp; &nbsp; <br>&nbsp; 　　（b） &nbsp; 定义CADORecordBinding &nbsp; 的派生类，用于程序与数据库表字段的交互，该类的定义可参见icrsint.h。 &nbsp; <br>&nbsp; 　　例： &nbsp; <br>&nbsp; class &nbsp; CIntlive &nbsp; : &nbsp; public &nbsp; CADORecordBinding &nbsp; &nbsp; <br>&nbsp; { &nbsp; &nbsp; <br>&nbsp; public: &nbsp; <br>&nbsp; DBTIMESTAMP &nbsp; m_datetime; &nbsp; //定义ADO记录集字段变量（与数据库表字段相对应） &nbsp; <br>&nbsp; long &nbsp; m_key; &nbsp; <br>&nbsp; long &nbsp; m_value; &nbsp; <br>&nbsp; long &nbsp; m_quality; &nbsp; <br>&nbsp; WORD &nbsp; m_stsdatetime; &nbsp; //定义ADO记录集状态变量 &nbsp; <br>&nbsp; WORD &nbsp; m_stskey; &nbsp; <br>&nbsp; WORD &nbsp; m_stsvalue; &nbsp; <br>&nbsp; WORD &nbsp; m_stsquality; &nbsp; <br>&nbsp; BEGIN_ADO_BINDING(CIntlive) &nbsp; //将数据库字段与ADO记录集字段变量绑定 &nbsp; <br>&nbsp; ADO_VARIABLE_LENGTH_ENTRY2(1,adDBTimeStamp,m_datetime,sizeof(m_datetime),m_stsdatetime,true) &nbsp; <br>&nbsp; ADO_NUMERIC_ENTRY(2,adInteger,m_key,10,0,m_stskey,true) &nbsp; <br>&nbsp; ADO_NUMERIC_ENTRY(3,adInteger,m_value,10,0,m_stsvalue,true) &nbsp; <br>&nbsp; ADO_NUMERIC_ENTRY(4,adInteger,m_quality,10,0,m_stsquality,true) &nbsp; <br>&nbsp; END_ADO_BINDING() &nbsp; <br>&nbsp; }; &nbsp; <br>&nbsp; 　　（c） &nbsp; 调用CoInitialize初始化COM &nbsp; ::CoInitialize(NULL); &nbsp; &nbsp; <br>&nbsp; 　　（d） &nbsp; 声明ADO的Connection对象指针和Recordset对象指针并初始化。（类型名在 &nbsp; msado15.dll中已定义） &nbsp; <br>&nbsp; 　　例： &nbsp; <br>&nbsp; _ConnectionPtr &nbsp; pConnection1 &nbsp; = &nbsp; NULL; &nbsp; <br>&nbsp; _RecordsetPtr &nbsp; rstADO1 &nbsp; = &nbsp; NULL; &nbsp; &nbsp; <br>&nbsp; 　　（e） &nbsp; 定义CADORecordBinding派生类的实例及其Bind接口指针。 &nbsp; <br>&nbsp; 　　例： &nbsp; <br>&nbsp; CIntlive &nbsp; m_intdata; &nbsp; &nbsp; <br>&nbsp; IADORecordBinding &nbsp; *rstADOBind1 &nbsp; = &nbsp; NULL; &nbsp; &nbsp; <br>&nbsp; 　　（f） &nbsp; 产生Connection对象实例和Record &nbsp; set对象实例。 &nbsp; <br>&nbsp; 　　例： &nbsp; <br>&nbsp; pConnection1.CreateInstance(_uuidof(Connection)); &nbsp; &nbsp; <br>&nbsp; rstADO1.CreateInstance(__uuidof(Recordset)) &nbsp; ; &nbsp; &nbsp; <br>&nbsp; 　　（g） &nbsp; 连接到数据库并打开Record &nbsp; set对象，其中open函数的参数的使用方法可参见微软MSDN中ADO &nbsp; 相应对象参数的Basic描述。 &nbsp; <br>&nbsp; 　　例: &nbsp; <br>&nbsp; PConnection1-&gt;Open("driver={SQL &nbsp; server};server=servera;uid=sa;pwd=;database=pubs","","",NULL); &nbsp; <br>&nbsp; rstADO1-&gt;Open("data", &nbsp; _variant_t((IDispatch &nbsp; *)pConnection1,true), &nbsp; &nbsp; <br>&nbsp; adOpenKeyset,adLockBatchOptimistic, &nbsp; adCmdTable); &nbsp; &nbsp; <br>&nbsp; 　　（h） &nbsp; 将CADORecordBinding派生类的实例联编到Record &nbsp; set对象的Bind接口。 &nbsp; <br>&nbsp; 　　例: &nbsp; <br>&nbsp; RstADOBind1-&gt;BindToRecordset(&amp;m_intdata); &nbsp; &nbsp; <br>&nbsp; 　　（i） &nbsp; 对Record &nbsp; set对象实例进行操作。操作方法可参见微软MSDN中ADO &nbsp; Record &nbsp; set对象相应方法的Basic描述。 &nbsp; <br>&nbsp; 　　 &nbsp; 例: &nbsp; <br>&nbsp; rstADO1-&gt;Move &nbsp; Next(); &nbsp; //移动游标到下一条记录 &nbsp; <br>&nbsp; rstADO1-&gt;Update(_variant_t("quality"),_variant_t("3"))); &nbsp; //修改记录的quality字段的值为3 &nbsp; <br>&nbsp; rstADO1-&gt;Update &nbsp; Batch(adAffectAll)); &nbsp; //将在Record &nbsp; set对象上的所有更新一次送入数据库 &nbsp; <br>&nbsp; 　　（j） &nbsp; 关闭Record &nbsp; set对象并释放Bind接口。 &nbsp; <br>&nbsp; 　　例: &nbsp; <br>&nbsp; RstADO1-&gt;Close(); &nbsp; &nbsp; <br>&nbsp; RstADOBind2-&gt;Release(); &nbsp; &nbsp; <br>&nbsp; 　　（k） &nbsp; 关闭连接 &nbsp; pConnection1-&gt;Close(); &nbsp; &nbsp; <br>&nbsp; 　　（l） &nbsp; 调用CoUnitialize释放COM资源 &nbsp; ::CoUninitialize(); &nbsp; &nbsp; <br>&nbsp; 　5) &nbsp; 结论 &nbsp; <br>&nbsp; 　　作为ODBC的替代产品，ADO确实有其过人之处。由于ADO数据源几乎覆盖了目前常见的数据源类型，对于ODBC所不支持的数据源，ADO无疑是唯一的选择。而ADO的批更新功能，更是网络环境下大数据量更新应用的重要因素。由于ADO缺乏大量的第三方厂商的支持，使得ADO目前远不如ODBC普及，但其面向对象的特性将使ADO具有比较广阔的发展前景。<br><br>3.ADO与ODBC的区别 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; 有很多种使用数据库的方法，对大多数数据库来说，选择C++这种产品也许并不适宜。我们知道，像dBASE &nbsp; IV，FoxPro，Oracle和Access这样的产品是完全以数据库管理为中心的。事实上，这些产品非常善于创建数据库管理器，以至于它们确实并不善于做太多其它的工作。即使要用更通用化而非更专用化的数据库产品来执行一些类型的工作，在使程序设计更容易这一方面，像VisualBasic和Delphi这样的RAD环境也要比Visual &nbsp; C++强很多。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　你是不是对我的说法感到很奇怪？下面我就要谈一谈，在谈到使用数据库管理系统(DBMS)这个话题时，用Visual &nbsp; C++实际上可以做些什么。虽然上述其它语言使得编写成熟的包括用户界面和高速搜索能力的DBMS就像孩子做游戏一样容易，但是，它们缺少Visual &nbsp; C++可以提供的某些重要东西。你不能为使用Access的数据库轻松地编写出实用程序。正像实用程序的定义所说的，实用程序应该很小并且具备可移植性——Access应用程序却不是这样。即使用Access这样的产品创建的程序可以很小并且可以移植，你仍有其它方面的需求：底层的功能。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　注：编写数据库实用程序及驱动程序时，可以选择Visual &nbsp; C++语言。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　想像一下，使用像Visual &nbsp; Basic这样的语言来与实时数据采集设备打交道的情况。在进行底层访问时，RAD的保护环境常常使程序员不能进行有效的处理。当然，数据采集设备几乎不依赖于简明的连接。你打算如何把Visual &nbsp; Basic和外部的数据源连接起来呢？数据源甚至可能不了解Windows，DOS或类似的成熟的操作系统。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　只要使用得当，很容易看到Visual &nbsp; C++是一种不可或缺的数据库管理工具。针对大规模的应用程序，即使你仍想依赖于Visual &nbsp; Basic这样的RAD语言，也请考虑一下Visual &nbsp; C++，它创建的程序规模小、提供底层访问并能提供实时访问。事实上，你可能还没有想到，Visual &nbsp; C++数据库应用程序的市场是很有潜力的。随着人们在旅途中越来越多地使用膝上型和掌上型电脑，这两类电脑上的数据库应用程序也变得越来越普通。你也许能够适应今天的膝上型电脑上的Access应用程序，但谈到硬盘大小或内存需求时，公司里较老的膝上型电脑可能就达不到要求。运行Windows &nbsp; CE的掌上型电脑在运行这个Access应用程序时，肯定会发生故障。在这一数据库市场的新领域，Visual &nbsp; C++提供了无价无限的工具。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　Web链接 &nbsp; 谈到使用Visual &nbsp; C++和数据库，其实你并不孤单。从一开始就有数据库专用新闻组提供有关数据库创建技巧的帮助，比如microsoft.public.access。不过，这些新闻组提供的是通用信息，对实际编写应用程序并非全都那么有用。专门针对Visual &nbsp; C++问题的新闻组是microsoft.public.vc.database和microsoft.public.vc.mfcdatabase。如果你决定用ODBC访问数据库，可能还要查看一下microsoft.public.odbc.sdk新闻组，它讨论的不仅仅是SDK。对最新技术感兴趣的程序员可以查阅microsoft.public.ado新闻组，或者microsoft.public.oledb（对象链接和嵌入数据库）新闻组，前者讨论 &nbsp; ADO，后者讨论ADO的基础技术。在microsoft.public.ado.rds有一个ADO子组，它讨论远程数据访问。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　既然所有的疑惑都消除了，大多数人的信心也就增强了，下面我们就介绍两种使C++访问数据库中的数据的主要方法：ODBC（开放数据库互连）和ADO（ActiveX数据对象）。在本章中，将介绍这两种类型的访问方法，但我想你会发现，ADO方法是针对新的程序设计情形而采用的。它克服了早期技术的诸多限制，依赖于Microsoft新的底层访问方法OLE-DB（对象链接和嵌入数据库）。在本书的后面我们会看到，用ADO和Visual &nbsp; C++提供的各种向导来汇集数据库工程，其速度有多快。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　注 &nbsp; ODBC通常用来访问不具备OLE-DB特性的非Microsoft数据库中的数据；16位的ODBC驱动程序工作起来可能非常缓慢。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　ODBC素以最慢的数据访问方法而著称，但是很可惜，当ADO或DAO都不支持某个数据库管理器而ODBC支持这个数据库管理器时，在这种特定的情形下，你仍然需要使用ODBC。在大多数情况下，这意味着要从数据库厂商那里获得所需的驱动程序，虽然Visual &nbsp; C++确实附带了一些产品的驱动程序（如果你正在使用数据库管理器的某些神秘功能，那么就需要建立自己的接口棗这并不是一件十分困难的事）。本质上讲，你总是要使用ODBC来访问Microsoft产品之外的其它DBMS产品所创建的数据库，这些数据库并不具备OLE-DB功能。ODBC还要求做一些额外的工作棗为ADO调整Visual &nbsp; C++中的大部分向导。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　高级技巧 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　除了使用ADO和ODBC外，你还可以使用像DAO（数据访问对象）这样的早期技术，该技术包含在像Access这样的Microsoft产品中。DAO依赖于用Microsoft &nbsp; Access自动获得的Microsoft &nbsp; Jet数据库引擎。DAO还是较早版的Visual &nbsp; Basic所使用的引擎（最新版的Visual &nbsp; Basic和Visual &nbsp; C++依赖于相同的ADO/OLE-DB组合），所以如果需要支持较早的Visual &nbsp; Basic应用程序，那么DAO仍是一个不错的选择。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　尽管Microsoft文件声明，可以用DAO访问非Microsoft产品建立的数据库，但你仍会发现，在这种情况下，使用ADO和ODBC要好得多。这样的话，不但兼容性问题会少一些，速度也将有所提高，因为数据请求经过的接口层减少了。有一条经验要记住，DAO是设计用来处理MDB文件的。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　ADO的一个问题是，它不支持远程通信。这是Microsoft提出RDO（远程数据对象）的原因之一。这种特别技术在Visual &nbsp; Basic应用程序中的使用，要比在Visual &nbsp; C++中的使用多得多，所以我猜想，你们中有很多人都在使用它。但是，记住RDO仍是一种生命力很强的技术，这一点很重要。ADO确实具有替代RDO的远程数据服务(RDS)特征。换言之，ADO在一个软件包中提供了DAO和RDO两种功能性。<br><br>4.MFC中相关类和ADO类库简介 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1)单独使用CRecordSet &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 一般情况下AppWizard会在数据库应用程序中自动产生CRecordset的派生类，并将派生类和某个数据源中的表联系起来也可以和视图上的子窗口联系起来。但是有时这样做会影响到程序的灵活性，这时候我们可以单独使用CRecordSet类。利用CRecordSet类我们可以执行SQL语句，并可以读出结果集中数据。 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 首先我们需要包含头文件afxdb.h，可以将#include &nbsp; 添加到stdafx.h文件中。此外在使用CRecordset时必须有一个又一个CDatabase对象，该对象的作用是管理数据源连接。然后可以产生一个CRecordset对象，利用BOOL &nbsp; CRecordset::Open( &nbsp; UINT &nbsp; nOpenType &nbsp; = &nbsp; AFX_DB_USE_DEFAULT_TYPE, &nbsp; LPCTSTR &nbsp; lpszSQL &nbsp; = &nbsp; NULL, &nbsp; DWORD &nbsp; dwOptions &nbsp; = &nbsp; none &nbsp; )可以执行SQL语句。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 但执行成功后，可以调用以下的函数滚动光标，读取数据。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; MoveFirst &nbsp; 移动光标到第一条记录处 &nbsp; &nbsp; <br>&nbsp; MoveNext &nbsp; 移动光标到后一条记录处 &nbsp; &nbsp; <br>&nbsp; MovePrev &nbsp; 移动光标到前一条记录处 &nbsp; &nbsp; <br>&nbsp; MoveLast &nbsp; 移动光标到最后一条记录处 &nbsp; &nbsp; <br>&nbsp; IsBOF &nbsp; 检测光标是否在第一条记录上 &nbsp; &nbsp; <br>&nbsp; IsEOF &nbsp; 检测光标是否在最后一条记录上 &nbsp; &nbsp; <br>&nbsp; GetFieldValue &nbsp; 得到结果中数据 &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 下面是具体代码: &nbsp; <br>&nbsp; /* &nbsp; <br>&nbsp; 假设CDatabase &nbsp; m_dbConn为成员变量 &nbsp; <br>&nbsp; 假设有一个表有如下SQL语句产生：CREATE &nbsp; TABLE &nbsp; table1(loc_id &nbsp; not &nbsp; null) &nbsp; <br>&nbsp; */ &nbsp; <br>&nbsp; void &nbsp; CYourClass::ConnectToDB() &nbsp; <br>&nbsp; {//连接数据库 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BOOL &nbsp; fOK &nbsp; = &nbsp; m_dbConn.Open("test"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TRACE("connect &nbsp; fOK=%d\n",m_dbConn); &nbsp; <br>&nbsp; } &nbsp; &nbsp; <br>&nbsp; void &nbsp; CYourClass::Select() &nbsp; <br>&nbsp; {//执行SELECT语句 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRecordset &nbsp; rec(&amp;m_dbConn); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BOOL &nbsp; fOK &nbsp; = &nbsp; rec.Open(CRecordset::forwardOnly,"select &nbsp; loc_id &nbsp; from &nbsp; table1 &nbsp; order &nbsp; by &nbsp; loc_id"); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TRACE("select &nbsp; fOK &nbsp; = &nbsp; %d\n",fOK); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TRACE("返回的列数为：%d\n",rec.GetRowsetSize()); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CString &nbsp; szResult; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(!rec.IsEOF()) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rec.GetFieldValue((int)0,szResult); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rec.MoveNext(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TRACE("fetch &nbsp; : &nbsp; %s\n",szResult); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; 此外CRecordset::GetFieldValue有很多种原型，你可以通过指定列位置或是字段名来获取数据： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; void &nbsp; GetFieldValue( &nbsp; LPCTSTR &nbsp; lpszName, &nbsp; CDBVariant&amp; &nbsp; varValue, &nbsp; short &nbsp; nFieldType &nbsp; = &nbsp; DEFAULT_FIELD_TYPE &nbsp; ); &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; void &nbsp; GetFieldValue( &nbsp; short &nbsp; nIndex, &nbsp; CDBVariant&amp; &nbsp; varValue, &nbsp; short &nbsp; nFieldType &nbsp; = &nbsp; DEFAULT_FIELD_TYPE &nbsp; ); &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; void &nbsp; GetFieldValue( &nbsp; LPCTSTR &nbsp; lpszName, &nbsp; CString&amp; &nbsp; strValue &nbsp; ); &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; void &nbsp; GetFieldValue( &nbsp; short &nbsp; nIndex, &nbsp; CString&amp; &nbsp; strValue &nbsp; ); &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 如果使用CDBVariant类型变量来获取结果，你可以得到任何类型的结果。在CDBVariant::m_dwType成员变量中记录了该变量所包含的数据类型，根据该变量的值你可以确定数据类型并引用CDBVariant对象中的相应成员变量。<br><br>2)vc数据库编程中CDatabase类的用法简介 &nbsp; <br>&nbsp; &nbsp; &nbsp; 要建立与数据源的连接，首先应构造一个CDatabase对象，然后再调用CDatabase的Open成员函数．Open函数负责建立连接，其声明为 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; virtual &nbsp; BOOL &nbsp; Open( &nbsp; LPCTSTR &nbsp; lpszDSN, &nbsp; BOOL &nbsp; bExclusive &nbsp; = &nbsp; FALSE, &nbsp; BOOL &nbsp; bReadOnly &nbsp; = &nbsp; FALSE, &nbsp; LPCTSTR &nbsp; lpszConnect &nbsp; = &nbsp; &#8220;ODBC;&#8221;, &nbsp; BOOL &nbsp; bUseCursorLib &nbsp; = &nbsp; TRUE &nbsp; ); &nbsp; throw( &nbsp; CDBException, &nbsp; CMemoryException &nbsp; ); &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　参数lpszDSN指定了数据源名（构造数据源的方法将在后面介绍），在lpszConnect参数中也可包括数据源名，此时lpszDSN必需为NULL，若在函数中未提供数据源名且使lpszDSN为NULL，则会显示一个数据源对话框，用户可以在该对话框中选择一个数据源．参数bExclusive说明是否独占数据源，由于目前版本的类库还不支持独占方式，故该参数的值应该是FALSE，这说明数据源是被共享的．参数bReadOnly若为TRUE则对数据源的连接是只读的．参数lpszConnect指定了一个连接字符串，连接字符串中可以包括数据源名、用户帐号(ID)和口令等信息，字符串中的＂ODBC＂表示要连接到一个ODBC数据源上．参数bUseCursorLib若为TRUE，则会装载光标库，否则不装载，快照需要光标库，动态集不需要光标库． &nbsp; 若连接成功，函数返回TRUE，若返回FALSE，则说明用户在数据源对话框中按了Cancel按钮。若函数内部出现错误，则框架会产生一个异常。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　下面是一些调用Open函数的例子。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; CDatabase &nbsp; m_db; &nbsp; //在文档类中嵌入一个CDatabase对象 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; //连接到一个名为＂Student &nbsp; Registration＂的数据源 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; m_db.Open("Student &nbsp; Registration"); &nbsp; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; //在连接数据源的同时指定了用户帐号和口令 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; m_db.Open(NULL,FALSE,FALSE,"ODBC;DSN=Student &nbsp; Registration;UID=ZYF;PWD=1234"); &nbsp; <br>&nbsp; m_db.Open(NULL); &nbsp; //将弹出一个数据源对话框 &nbsp; <br>&nbsp; 　 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　要从一个数据源中脱离，可调用函数Close。在脱离后，可以再次调用Open函数来建立一个新的连接．调用IsOpen可判断当前是否有一个连接，调用GetConnect可返回当前的连接字符串。函数的声明为 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; virtual &nbsp; void &nbsp; Close( &nbsp; ); &nbsp; <br>&nbsp; BOOL &nbsp; IsOpen( &nbsp; ) &nbsp; const; &nbsp; //返回TRUE则表明当前有一个连接 &nbsp; <br>&nbsp; const &nbsp; CString&amp; &nbsp; GetConnect( &nbsp; ) &nbsp; const; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　CDatabase的析构函数会调用Close，所以只要删除了CDatabase对象就可以与数据源脱离。<br><br>3)vc数据库编程中CRecordView类简介 &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRecordView（记录视图）是CFormView的派生类，它提供了一个表单视图来显示当前记录．用户可以通过表单视图显示当前记录．通过记录视图，可以修改、添加和删除数据．用户一般需要创建一个CRecordView的派生类并在其对应的对话框模板中加入控件． &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 记录视图使用DDX数据交换机制在表单中的控件和记录集之间交换数据。在前面介绍的DDX都是在控件和控件父窗口的数据成员之间交换数据，而记录视图则是在控件和一个外部对象（CRecordset的派生类对象）之间交换数据．清单10.3显示了一个CRecordView的派生类的DoDataExchange函数，读者可以看出，该函数是与m_pSet指针指向的记录集对象的域数据成员交换数据的，而且，交换数据的代码是ClassWizard自动加入的．在后面的例子中，将向读者介绍用ClassWizard连接记录视图与记录集对象的方法． &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; 用来与记录集对象的域数据成员交换数据的DoDataExchange函数 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; void &nbsp; CSectionForm::DoDataExchange(CDataExchange* &nbsp; pDX) &nbsp; <br>&nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRecordView::DoDataExchange(pDX); &nbsp; <br>&nbsp; //{{AFX_DATA_MAP(CSectionForm) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DDX_FieldText(pDX, &nbsp; IDC_COURSE, &nbsp; m_pSet-&gt;m_CourseID, &nbsp; m_pSet); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DDX_FieldText(pDX, &nbsp; IDC_SECTION, &nbsp; m_pSet-&gt;m_SectionNo, &nbsp; m_pSet); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DDX_FieldText(pDX, &nbsp; IDC_INSTRUCTOR, &nbsp; m_pSet-&gt;m_InstructorID, &nbsp; m_pSet); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DDX_FieldText(pDX, &nbsp; IDC_ROOM, &nbsp; m_pSet-&gt;m_RoomNo, &nbsp; m_pSet); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DDX_FieldText(pDX, &nbsp; IDC_SCHEDULE, &nbsp; m_pSet-&gt;m_Schedule, &nbsp; m_pSet); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DDX_FieldText(pDX, &nbsp; IDC_CAPACITY, &nbsp; m_pSet-&gt;m_Capacity, &nbsp; m_pSet); &nbsp; <br>&nbsp; //}}AFX_DATA_MAP &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; CRecordView本身提供了对下面四个命令的支持： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; ID_RECORD_FIRST &nbsp; //滚动到记录集的第一个记录 &nbsp; <br>&nbsp; ID_RECORD_LAST &nbsp; //滚动到记录集的最后一个记录 &nbsp; <br>&nbsp; ID_RECORD_NEXT &nbsp; //前进一个记录 &nbsp; <br>&nbsp; ID_RECORD_PREV &nbsp; //后退一个记录 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; CRecordView提供了OnMove成员函数处理这四个命令消息，OnMove函数对用户是透明的，下面列出了OnMove的源代码． &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; BOOL &nbsp; CRecordView::OnMove(UINT &nbsp; nIDMoveCommand) &nbsp; <br>&nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CRecordset* &nbsp; pSet &nbsp; = &nbsp; OnGetRecordset(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (pSet-&gt;CanUpdate()) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;Edit(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (!UpdateData()) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; TRUE; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;Update(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch &nbsp; (nIDMoveCommand) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &nbsp; ID_RECORD_PREV: &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;MovePrev(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (!pSet-&gt;IsBOF()) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &nbsp; ID_RECORD_FIRST: &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;MoveFirst(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &nbsp; ID_RECORD_NEXT: &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;MoveNext(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (!pSet-&gt;IsEOF()) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &nbsp; (!pSet-&gt;CanScroll()) &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp; clear &nbsp; out &nbsp; screen &nbsp; since &nbsp; we're &nbsp; sitting &nbsp; on &nbsp; EOF &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;SetFieldNull(NULL); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case &nbsp; ID_RECORD_LAST: &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pSet-&gt;MoveLast(); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default: &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp; Unexpected &nbsp; case &nbsp; value &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ASSERT(FALSE); &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; // &nbsp; Show &nbsp; results &nbsp; of &nbsp; move &nbsp; operation &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UpdateData(FALSE); &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &nbsp; TRUE; &nbsp; <br>&nbsp; } &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; 在函数的开头先调用CRecordset::Edit进入编辑模式，接着调用UpdateData将控件中的数据更新到记录集对象的域数据成员中，然后调用CRecordset::Update将域数据成员的值写入数据源．这说明OnMove在滚动记录的同时会完成对原来记录的修改． &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　在函数的中间有一个分支语句用来处理四个不同的命令，在这个分支语句中调用了CRecordset的各种用于滚动记录的成员函数，这些函数在滚动到一个新的记录时会把该记录的内容设置到域数据成员中．在函数的末尾调用UpdateData(FALSE)把新的当前记录的内容设置到表单的控件中。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 　　由此可见，OnMove一来一回完成了两次表单控件和数据源的数据交换过程．通过分析该函数，读者可以学会在浏览记录时如何控制DDX和DFX数据交换．
<img src ="http://www.cppblog.com/finehai/aggbug/90595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-20 11:16 <a href="http://www.cppblog.com/finehai/archive/2009/07/20/90595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用vc6.0进行ADO编程的简单例子</title><link>http://www.cppblog.com/finehai/archive/2009/07/20/90594.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Mon, 20 Jul 2009 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/20/90594.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90594.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/20/90594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90594.html</trackback:ping><description><![CDATA[<p>ActiveX数据对象（ADO）是OLE DB上面的高层数据库API。我们在C＋＋程序中也可以调用ADO。本文将在VC 6.0环境下做一个小小的例子解释如何使用ADO。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　<br>1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序，然后在应用程序类的InitInstance函数中初始化OLE/COM库（因为ADO库是一个COM DLL库）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BOOL&nbsp;CADOTestApp::InitInstance()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　<br><img id=Codehighlighter1_57_114_Open_Image onclick="this.style.display='none'; Codehighlighter1_57_114_Open_Text.style.display='none'; Codehighlighter1_57_114_Closed_Image.style.display='inline'; Codehighlighter1_57_114_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_57_114_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_114_Closed_Text.style.display='none'; Codehighlighter1_57_114_Open_Image.style.display='inline'; Codehighlighter1_57_114_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_57_114_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_57_114_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化OLE/COM库环境&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;AfxOleInit();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>2. 引入ADO库文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>使用ADO前必须在工程的stdafx.h文件里用直接引入符号＃import引入ADO库文件，以使编译器能正确编译。代码如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">＃include&nbsp;〈comdef.h〉&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>＃import&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c:\program&nbsp;files\common&nbsp;files\system\ado\msado15.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>no_namespace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>rename&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">EOF</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">adoEOF</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span></div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>头文件comdef.h使我们的应用程序能够使用Visual C＋＋中的一些特殊COM支持类，这些类使得处理OLE自治更为容易一些，OLE自治是ADO使用的数据类型。后三行使用＃import指令在我们的应用程序中输入ADO类库定义。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll）中，在其内部称为类型库。类型库描述了自治接口，以及C＋＋使用的COM vtable接口。当使用＃import指令时，在运行时Visual C＋＋需要从ADO DLL中读取这个类型库，并以此创建一组C＋＋头文件。这些头文件具有.tli 和.tlh扩展名，读者可以在项目的目录下找到这两个文件。在C＋＋程序代码中调用的ADO类要在这些文件中定义。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>程序的第三行指示ADO对象不使用名称空间。在有些应用程序中，由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突，所以有必要使用名称空间。如果要使用名称空间，则可把第三行程序修改为： rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF，以避免与定义了自己的EOF的其他库冲突。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>3．利用智能指针进行数据库操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>在CaboutDlg头文件中定义两个ADO智能指针类实例,并在对话框中加入一个ListCtrl。<br><br>_ConnectionPtr m_pConnection;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>_RecordsetPtr m_pRecordset;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>ClistCtrl m_List;<br><br>ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句，如一个存储过程。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>_CommandPtr返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时，可以利用全局_ConnectionPtr接口，也可以在_CommandPtr接口里直接使用连接串。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>_RecordsetPtr是一个记录集对象。与以上两种对象相比，它对记录集提供了更多的控制功能，如记录锁定、游标控制等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br>在OnInitDialog()中加入以下代码:<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BOOL&nbsp;CAboutDlg::OnInitDialog()<br><img id=Codehighlighter1_31_913_Open_Image onclick="this.style.display='none'; Codehighlighter1_31_913_Open_Text.style.display='none'; Codehighlighter1_31_913_Closed_Image.style.display='inline'; Codehighlighter1_31_913_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_31_913_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_913_Closed_Text.style.display='none'; Codehighlighter1_31_913_Open_Image.style.display='inline'; Codehighlighter1_31_913_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_31_913_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_31_913_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnInitDialog();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp;TheValue;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_List.ResetContent();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pConnection.CreateInstance(_uuidof(Connection));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset.CreateInstance(_uuidof(Recordset));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_214_728_Open_Image onclick="this.style.display='none'; Codehighlighter1_214_728_Open_Text.style.display='none'; Codehighlighter1_214_728_Closed_Image.style.display='inline'; Codehighlighter1_214_728_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_214_728_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_214_728_Closed_Text.style.display='none'; Codehighlighter1_214_728_Open_Image.style.display='inline'; Codehighlighter1_214_728_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_214_728_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_214_728_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pConnection</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Open(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DSN=ADOTest</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">连接叫作ADOTest的ODBC数据源</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Open(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SELECT&nbsp;*&nbsp;FROM&nbsp;BlockDefine</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)m_pConnection,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adOpenDynamic,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adLockOptimistic,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adCmdText);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">执行SQL语句得到一个记录集</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">adoEOF)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">遍历所有记录</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_474_674_Open_Image onclick="this.style.display='none'; Codehighlighter1_474_674_Open_Text.style.display='none'; Codehighlighter1_474_674_Closed_Image.style.display='inline'; Codehighlighter1_474_674_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_474_674_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_474_674_Closed_Text.style.display='none'; Codehighlighter1_474_674_Open_Image.style.display='inline'; Codehighlighter1_474_674_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_474_674_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_474_674_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TheValue&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetCollect(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BlockIndex</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">得到字段BlockIndex的值</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(TheValue.vt</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">VT_NULL)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_List.AddString((</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)_bstr_t(TheValue));&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将该值加入到列表控件中</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">MoveNext();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Close();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pConnection</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Close();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(_com_error&nbsp;e)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">异常处理</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_759_798_Open_Image onclick="this.style.display='none'; Codehighlighter1_759_798_Open_Text.style.display='none'; Codehighlighter1_759_798_Closed_Image.style.display='inline'; Codehighlighter1_759_798_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_759_798_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_759_798_Closed_Text.style.display='none'; Codehighlighter1_759_798_Open_Image.style.display='inline'; Codehighlighter1_759_798_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_759_798_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_759_798_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(e</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ErrorMessage());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pRecordset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pConnection&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;TRUE;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;return&nbsp;TRUE&nbsp;unless&nbsp;you&nbsp;set&nbsp;the&nbsp;focus&nbsp;to&nbsp;a&nbsp;control</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/finehai/aggbug/90594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-20 11:13 <a href="http://www.cppblog.com/finehai/archive/2009/07/20/90594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++下使用ADO编写数据库程序</title><link>http://www.cppblog.com/finehai/archive/2009/07/20/90591.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Mon, 20 Jul 2009 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/20/90591.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90591.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/20/90591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90591.html</trackback:ping><description><![CDATA[<div class=prettyprint id=C><span class=pln>VC</span><span class=pun>++下使用</span><span class=pln>ADO</span><span class=pun>编写数据库程序</span><span class=pln><br>&nbsp;<br></span><span class=pun>准备：</span><span class=pln> <br></span><span class=pun>(</span><span class=lit>1</span><span class=pun>)、引入</span><span class=pln>ADO</span><span class=pun>类</span><span class=pln>&nbsp;&nbsp;&nbsp;<br><br>&nbsp;在stdafx.h中加入如下语句：<br></span><span class=com>#import &nbsp;"c:\program &nbsp;files\common &nbsp;files\system\ado\msado15.dll" &nbsp;\ </span><span class=pln><br>no_namespace &nbsp;</span><span class=pun>\</span><span class=pln> <br>rename &nbsp;</span><span class=pun>(</span><span class=str>"EOF"</span><span class=pun>,</span><span class=pln> &nbsp;</span><span class=str>"adoEOF"</span><span class=pun>)</span><span class=pln>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; <br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)、初始化</span><span class=pln>COM <br>&nbsp;<br></span><span class=pun>在</span><span class=pln>MFC</span><span class=pun>中可以用</span><span class=typ>AfxOleInit</span><span class=pun>();非</span><span class=pln>MFC</span><span class=pun>环境中用:</span><span class=pln> &nbsp; <br></span><span class=typ>CoInitialize</span><span class=pun>(</span><span class=pln>NULL</span><span class=pun>);</span><span class=pln> <br></span><span class=typ>CoUnInitialize</span><span class=pun>();</span><span class=pln> <br>&nbsp;<br></span><span class=pun>(</span><span class=lit>3</span><span class=pun>)</span><span class=com>#import &nbsp;包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr&nbsp;</span><span class=pln><br></span><span class=lit><br>1</span><span class=pun>.连接和关闭数据库<br><br></span><span class=pln>&nbsp;</span><span class=pun>(</span><span class=lit>1</span><span class=pun>)连接</span><span class=pln> &nbsp; <br></span><span class=pun>一般在</span><span class=typ>App</span><span class=pun>类成员函数</span><span class=typ>InitInstance</span><span class=pun>()里初始化</span><span class=pln><br></span><span class=pun>例子:连接</span><span class=typ>Access</span><span class=pun>数据库</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxOleInit</span><span class=pun>();</span><span class=com>//初始化 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HRESULT &nbsp;hr</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>try</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnection</span><span class=pun>.</span><span class=typ>CreateInstance</span><span class=pun>(</span><span class=str>"ADODB.Connection"</span><span class=pun>);</span><span class=com>///创建Connection对象 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>if</span><span class=pun>(</span><span class=pln>SUCCEEDED</span><span class=pun>(</span><span class=pln>hr</span><span class=pun>))</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pConnection</span><span class=pun>-</span>&gt;<span class=typ>ConnectionTimeout</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=lit>0</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnection</span><span class=pun>-</span>&gt;<span class=typ>Open</span><span class=pun>(</span><span class=pln> <br></span><span class=str>"Provider=Microsoft.Jet.OLEDB.4.0;Data &nbsp;Source=db.mdb"</span><span class=pun>,</span><span class=pln> &nbsp;</span><span class=str>""</span><span class=pun>,</span><span class=pln> &nbsp;</span><span class=str>""</span><span class=pun>,</span><span class=pln> &nbsp;adModeUnknown</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>//m_pConnection-&gt;PutDefaultDatabase &nbsp;((_bstr_t)"DB");//设置默认数</span><span class=pln><br></span><span class=pun>据库</span><span class=pln> <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pCommand</span><span class=pun>.</span><span class=typ>CreateInstance</span><span class=pun>(</span><span class=pln>__uuidof</span><span class=pun>(</span><span class=typ>Command</span><span class=pun>));</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>CommandTimeout</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=lit>5</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>ActiveConnection</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnection</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>catch</span><span class=pun>(</span><span class=pln>_com_error &nbsp;e</span><span class=pun>)</span><span class=com>///捕捉异常 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>CString</span><span class=pln> &nbsp;errormessage</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;errormessage</span><span class=pun>.</span><span class=typ>Format</span><span class=pun>(</span><span class=str>"连接数据库失败!\r\n错误信息:%s"</span><span class=pun>,</span><span class=pln>e</span><span class=pun>.</span><span class=typ>ErrorMessage</span><span class=pun>());</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxMessageBox</span><span class=pun>(</span><span class=pln>errormessage</span><span class=pun>);</span><span class=com>///显示错误信息 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>return</span><span class=pln> FALSE</span><span class=pun>;</span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> <br>&nbsp;<br>&nbsp;<br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)、关闭</span><span class=pln> &nbsp; <br>&nbsp;<br></span><span class=pun>一般在</span><span class=typ>App</span><span class=pun>类成员函数</span><span class=typ>InitInstance</span><span class=pun>()里关闭数据库连接</span><span class=pln><br></span><span class=com>//如果数据库连接有效 </span><span class=pln><br></span><span class=kwd>if</span><span class=pun>(</span><span class=pln> &nbsp;m_pConnection</span><span class=pun>-</span>&gt;<span class=typ>State</span><span class=pln> &nbsp;</span><span class=pun>)</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pConnection</span><span class=pun>-</span>&gt;<span class=typ>Close</span><span class=pun>();</span><span class=pln> <br>m_pConnection &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;NULL</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; <br>&nbsp;<br></span><span class=pun>(</span><span class=lit>3</span><span class=pun>)、设置连接时间</span><span class=pln> &nbsp;</span><span class=com>//设置连接时间----------------------------------- &nbsp; </span><span class=pln><br>pConnection</span><span class=pun>-</span>&gt;<span class=pln>put_ConnectionTimeout</span><span class=pun>(</span><span class=kwd>long</span><span class=pun>(</span><span class=lit>5</span><span class=pun>));</span><span class=pln> <br><br></span><span class=lit>2</span><span class=pun>.打开一个结果集</span><span class=pln> <br></span><span class=pun>(</span><span class=lit>1</span><span class=pun>)打开,首先创建一个</span><span class=pln>_RecordsetPtr</span><span class=pun>实例,然后调用</span><span class=typ>Open</span><span class=pun>()得到一条</span><span class=pln>SQL</span><span class=pun>语句的执行结果</span><span class=pln> <br>_RecordsetPtr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>;</span><span class=pln> <br>m_pRecordset</span><span class=pun>.</span><span class=typ>CreateInstance</span><span class=pun>(</span><span class=pln>__uuidof</span><span class=pun>(</span><span class=typ>Recordset</span><span class=pun>));</span><span class=pln> <br>&nbsp;<br></span><span class=com>// &nbsp;在ADO操作中建议语句中要常用try...catch()来捕获错误信息， </span><span class=pln><br></span><span class=com>// &nbsp;因为它有时会经常出现一些意想不到的错误。jingzhou &nbsp;xu </span><span class=pln><br></span><span class=kwd>try</span><span class=pln> <br></span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>Open</span><span class=pun>(</span><span class=str>"SELECT &nbsp;* &nbsp;FROM &nbsp;DemoTable"</span><span class=pun>,</span><span class=com>// &nbsp;查询DemoTable表中所有字段 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pConnection</span><span class=pun>.</span><span class=typ>GetInterfacePtr</span><span class=pun>(),</span><span class=pln> &nbsp; &nbsp;</span><span class=com>// &nbsp;获取库接库的IDispatch指针 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;adOpenDynamic</span><span class=pun>,</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;adLockOptimistic</span><span class=pun>,</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;adCmdText</span><span class=pun>);</span><span class=pln> <br></span><span class=pun>}</span><span class=pln> <br></span><span class=kwd>catch</span><span class=pun>(</span><span class=pln>_com_error &nbsp;</span><span class=pun>*</span><span class=pln>e</span><span class=pun>)</span><span class=pln> <br></span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxMessageBox</span><span class=pun>(</span><span class=pln>e</span><span class=pun>-</span>&gt;<span class=typ>ErrorMessage</span><span class=pun>());</span><span class=pln> <br></span><span class=pun>}</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)关闭结果集</span><span class=pln> &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>Close</span><span class=pun>();</span><span class=pln> <br>&nbsp; m_pRecordset </span><span class=pun>=</span><span class=pln> NULL</span><span class=pun>;</span><span class=pln><br>&nbsp;<br></span><span class=lit>3</span><span class=pun>.操作一个结果集</span><span class=pln> <br></span><span class=pun>(</span><span class=lit>1</span><span class=pun>)、遍历(读取)</span><span class=pln> <br>a</span><span class=pun>)、用</span><span class=pln>pRecordset</span><span class=pun>-</span>&gt;<span class=pln>adoEOF</span><span class=pun>来判断数据库指针是否已经移到结果集的末尾了；</span><span class=pln>m_pRecordset</span><span class=pun>-</span>&gt;<span class=pln>BOF</span><span class=pun>判断是否</span><span class=pln> &nbsp;</span><span class=pun>在第一</span><span class=pln><br></span><span class=pun>条记录前面：</span><span class=pln> &nbsp;</span><span class=kwd>while</span><span class=pun>(!</span><span class=pln>m_pRecordset</span><span class=pun>-</span>&gt;<span class=pln>adoEOF</span><span class=pun>)</span><span class=pln> <br></span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>var</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>GetCollect</span><span class=pun>(</span><span class=str>"Name"</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>if</span><span class=pun>(</span><span class=kwd>var</span><span class=pun>.</span><span class=pln>vt &nbsp;</span><span class=pun>!=</span><span class=pln> &nbsp;VT_NULL</span><span class=pun>)</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strName &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>_bstr_t</span><span class=pun>(</span><span class=kwd>var</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>var</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>GetCollect</span><span class=pun>(</span><span class=str>"Age"</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>if</span><span class=pun>(</span><span class=kwd>var</span><span class=pun>.</span><span class=pln>vt &nbsp;</span><span class=pun>!=</span><span class=pln> &nbsp;VT_NULL</span><span class=pun>)</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strAge &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>_bstr_t</span><span class=pun>(</span><span class=kwd>var</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_AccessList</span><span class=pun>.</span><span class=typ>AddString</span><span class=pun>(</span><span class=pln> &nbsp;strName &nbsp;</span><span class=pun>+</span><span class=pln> &nbsp;</span><span class=str>" &nbsp;--&gt; &nbsp;"</span><span class=pun>+</span><span class=pln>strAge &nbsp;</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>MoveNext</span><span class=pun>();</span><span class=pln> <br></span><span class=pun>}</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>b</span><span class=pun>)、取得一个字段的值的办法有两种办法</span><span class=pln> <br>&nbsp;<br></span><span class=pun>一是</span><span class=pln> <br>&nbsp;<br></span><span class=com>//表示取得第0个字段的值 &nbsp;m_pRecordset-&gt;GetCollect("Name"); </span><span class=pln><br>&nbsp;<br></span><span class=pun>或者</span><span class=pln> &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>GetCollect</span><span class=pun>(</span><span class=pln>_variant_t</span><span class=pun>(</span><span class=kwd>long</span><span class=pun>(</span><span class=lit>0</span><span class=pun>));</span><span class=pln> <br>&nbsp;<br></span><span class=pun>二是</span><span class=pln> <br>pRecordset</span><span class=pun>-</span>&gt;<span class=pln>get_Collect</span><span class=pun>(</span><span class=str>"COLUMN_NAME"</span><span class=pun>);</span><span class=pln> <br>&nbsp;<br></span><span class=pun>或者</span><span class=pln> &nbsp;pRecordset</span><span class=pun>-</span>&gt;<span class=pln>get_Collect</span><span class=pun>(</span><span class=kwd>long</span><span class=pun>(</span><span class=pln>index</span><span class=pun>));</span><span class=pln> <br>&nbsp;<br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)、添加</span><span class=pln> <br>&nbsp;<br>a</span><span class=pun>)、调用</span><span class=pln>m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>AddNew</span><span class=pun>();</span><span class=pln> <br>b</span><span class=pun>)、调用</span><span class=pln>m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>PutCollect</span><span class=pun>(</span><span class=str>"Name"</span><span class=pun>,</span><span class=pln>_variant_t</span><span class=pun>(</span><span class=pln>m_szName</span><span class=pun>));给每个字段赋值(</span><span class=pln>m_szName</span><span class=pun>为控件所对应的字符串变量)</span><span class=pln> <br>c</span><span class=pun>)、调用</span><span class=pln>m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>Update</span><span class=pun>();确认</span><span class=pln> <br>&nbsp;<br></span><span class=com>// 添加完后可读取显示</span><span class=pln><br>&nbsp;</span><span class=pun>对于</span><span class=pln>MFC</span><span class=pun>有些控件显示需要更新(比如</span><span class=typ>ListBox</span><span class=pun>)</span><span class=pln><br><br></span><span class=pun>(</span><span class=lit>3</span><span class=pun>)、修改</span><span class=pln> <br></span><span class=pun>(</span><span class=lit>4</span><span class=pun>)、删除</span><span class=pln> <br>a</span><span class=pun>)、把记录指针移动到要删除的记录上,然后调用</span><span class=typ>Delete</span><span class=pun>(</span><span class=pln>adAffectCurrent</span><span class=pun>)</span><span class=pln> &nbsp;</span><span class=kwd>try</span><span class=pln> <br></span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>// &nbsp;假设删除第二条记录 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>MoveFirst</span><span class=pun>();</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>Move</span><span class=pun>(</span><span class=lit>1</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>// &nbsp;从0开始 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>Delete</span><span class=pun>(</span><span class=pln>adAffectCurrent</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>// &nbsp;参数adAffectCurrent为删除当前记录 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=typ>Update</span><span class=pun>();</span><span class=pln> <br></span><span class=pun>}</span><span class=pln> <br></span><span class=kwd>catch</span><span class=pun>(</span><span class=pln>_com_error &nbsp;</span><span class=pun>*</span><span class=pln>e</span><span class=pun>)</span><span class=pln> <br></span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxMessageBox</span><span class=pun>(</span><span class=pln>e</span><span class=pun>-</span>&gt;<span class=typ>ErrorMessage</span><span class=pun>());</span><span class=pln> <br></span><span class=pun>}</span><span class=pln> <br>&nbsp;<br></span><span class=lit>4</span><span class=pun>.直接执行</span><span class=pln>SQL</span><span class=pun>语句,除了要用到结果集其余的大部分功能都可以直接用</span><span class=pln>SQL</span><span class=pun>语言实现</span><span class=pln> <br>&nbsp;<br></span><span class=pun>(</span><span class=lit>1</span><span class=pun>)、用</span><span class=pln>_CommandPtr</span><span class=pun>和</span><span class=pln>_RecordsetPtr</span><span class=pun>配合</span><span class=pln> <br>_CommandPtr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pCommand</span><span class=pun>;</span><span class=pln> <br>m_pCommand</span><span class=pun>.</span><span class=typ>CreateInstance</span><span class=pun>(</span><span class=pln>__uuidof</span><span class=pun>(</span><span class=typ>Command</span><span class=pun>));</span><span class=pln> <br></span><span class=com>// &nbsp;将库连接赋于它 </span><span class=pln><br>m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>ActiveConnection</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnection</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; <br></span><span class=com>// &nbsp;SQL语句 </span><span class=pln><br>m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>CommandText</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=str>"SELECT &nbsp;* &nbsp;FROM &nbsp;DemoTable"</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; <br></span><span class=com>// &nbsp;执行SQL语句，返回记录集 </span><span class=pln><br>m_pRecordset &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>Execute</span><span class=pun>(</span><span class=pln>NULL</span><span class=pun>,</span><span class=pln> &nbsp;NULL</span><span class=pun>,</span><span class=pln>adCmdText</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)、直接用</span><span class=pln>_ConnectionPtr</span><span class=pun>执行</span><span class=pln>SQL</span><span class=pun>语句</span><span class=pln> <br>_RecordsetPtr &nbsp;</span><span class=typ>Connection15</span><span class=pun>::</span><span class=typ>Execute</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln> &nbsp;_bstr_t &nbsp;</span><span class=typ>CommandText</span><span class=pun>,</span><span class=pln> &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;VARIANT &nbsp;</span><span class=pun>*</span><span class=pln> <br></span><span class=typ>RecordsAffected</span><span class=pun>,</span><span class=pln> &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>long</span><span class=pln> &nbsp;</span><span class=typ>Options</span><span class=pln> &nbsp;</span><span class=pun>)</span><span class=pln> &nbsp; <br>&nbsp;<br></span><span class=pun>其中</span><span class=typ>CommandText</span><span class=pun>是命令字串，通常是</span><span class=pln>SQL</span><span class=pun>命令。</span><span class=pln> &nbsp; <br></span><span class=pun>参数</span><span class=typ>RecordsAffected</span><span class=pun>是操作完成后所影响的行数,</span><span class=pln> &nbsp; <br></span><span class=pun>参数</span><span class=typ>Options</span><span class=pun>表示</span><span class=typ>CommandText</span><span class=pun>中内容的类型，</span><span class=typ>Options</span><span class=pun>可以取如下值之一：</span><span class=pln> &nbsp; <br>adCmdText</span><span class=pun>:表明</span><span class=typ>CommandText</span><span class=pun>是文本命令</span><span class=pln> &nbsp; <br>adCmdTable</span><span class=pun>:表明</span><span class=typ>CommandText</span><span class=pun>是一个表名</span><span class=pln> &nbsp; <br>adCmdProc</span><span class=pun>:表明</span><span class=typ>CommandText</span><span class=pun>是一个存储过程</span><span class=pln> &nbsp; <br>adCmdUnknown</span><span class=pun>:未知</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br></span><span class=pun>例子:</span><span class=pln> <br>_variant_t &nbsp;</span><span class=typ>RecordsAffected</span><span class=pun>;</span><span class=pln> <br>m_pConnection</span><span class=pun>-</span>&gt;<span class=typ>Execute</span><span class=pun>(</span><span class=str>"UPDATE &nbsp;users &nbsp;SET &nbsp;old &nbsp;= &nbsp;old+1"</span><span class=pun>,</span>&amp;<span class=typ>RecordsAffected</span><span class=pun>,</span><span class=pln>adCmdText</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br>&nbsp;<br></span><span class=lit>5</span><span class=pun>.调用存储过程</span><span class=pln> <br></span><span class=pun>(</span><span class=lit>1</span><span class=pun>)、利用</span><span class=pln>_CommandPtr <br>_CommandPtr &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pCommand</span><span class=pun>;</span><span class=pln> <br>m_pCommand</span><span class=pun>.</span><span class=typ>CreateInstance</span><span class=pun>(</span><span class=pln>__uuidof</span><span class=pun>(</span><span class=typ>Command</span><span class=pun>));</span><span class=pln> <br>m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>ActiveConnection</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnection</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp;</span><span class=com>// &nbsp;将库连接赋于它 </span><span class=pln><br>m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>CommandText</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=str>"Demo"</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; <br>m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>Execute</span><span class=pun>(</span><span class=pln>NULL</span><span class=pun>,</span><span class=pln>NULL</span><span class=pun>,</span><span class=pln> &nbsp;adCmdStoredProc</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)、直接用</span><span class=pln>_ConnectionPtr</span><span class=pun>直接调用(见</span><span class=lit>4</span><span class=pun>.(</span><span class=lit>2</span><span class=pun>))</span><span class=pln> <br>&nbsp;<br></span><span class=lit>6</span><span class=pun>.遍历数据库中的所有表名</span><span class=pln> &nbsp;_ConnectionPtr &nbsp;m_pConnect</span><span class=pun>;</span><span class=pln> &nbsp; <br>_RecordsetPtr &nbsp;pSet</span><span class=pun>;</span><span class=pln> &nbsp; <br>HRESULT &nbsp;hr</span><span class=pun>;</span><span class=pln> &nbsp; <br></span><span class=kwd>try</span><span class=pln> &nbsp; <br></span><span class=pun>{</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnect</span><span class=pun>.</span><span class=typ>CreateInstance</span><span class=pun>(</span><span class=str>"ADODB.Connection"</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>if</span><span class=pun>(</span><span class=pln>SUCCEEDED</span><span class=pun>(</span><span class=pln>hr</span><span class=pun>))</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>CString</span><span class=pln> &nbsp;dd</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dd</span><span class=pun>.</span><span class=typ>Format</span><span class=pun>(</span><span class=str>"Provider=Microsoft.Jet.OLEDB.4.0;Data &nbsp;Source=%s"</span><span class=pun>,</span><span class=pln>file</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnect</span><span class=pun>-</span>&gt;<span class=typ>Open</span><span class=pun>((</span><span class=pln>_bstr_t</span><span class=pun>)</span><span class=pln>dd</span><span class=pun>,</span><span class=str>""</span><span class=pun>,</span><span class=str>""</span><span class=pun>,</span><span class=pln>adModeUnknown</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pSet &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pConnect</span><span class=pun>-</span>&gt;<span class=typ>OpenSchema</span><span class=pun>(</span><span class=pln>adSchemaTables</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>while</span><span class=pun>(!(</span><span class=pln>pSet</span><span class=pun>-</span>&gt;<span class=pln>adoEOF</span><span class=pun>))</span><span class=pln> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>//获取表格 &nbsp; &nbsp; &nbsp; &nbsp; </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_bstr_t &nbsp;table_name &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;pSet</span><span class=pun>-</span>&gt;<span class=typ>Fields</span><span class=pun>-</span>&gt;<span class=typ>GetItem</span><span class=pun>(</span><span class=str>"TABLE_NAME"</span><span class=pun>)-</span><span class=pln><br></span>&gt;<span class=typ>Value</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>//获取表格类型 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_bstr_t &nbsp;table_type &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;pSet</span><span class=pun>-</span>&gt;<span class=typ>Fields</span><span class=pun>-</span>&gt;<span class=typ>GetItem</span><span class=pun>(</span><span class=str>"TABLE_TYPE"</span><span class=pun>)-</span><span class=pln><br></span>&gt;<span class=typ>Value</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>//过滤一下，只输出表格名称，其他的省略 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>if</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln> &nbsp;strcmp</span><span class=pun>(((</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>table_type</span><span class=pun>),</span><span class=str>"TABLE"</span><span class=pun>)==</span><span class=lit>0</span><span class=pun>){</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>CString</span><span class=pln> &nbsp;tt</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tt</span><span class=pun>.</span><span class=typ>Format</span><span class=pun>(</span><span class=str>"%s"</span><span class=pun>,(</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>table_name</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxMessageBox</span><span class=pun>(</span><span class=pln>tt</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pSet</span><span class=pun>-</span>&gt;<span class=typ>MoveNext</span><span class=pun>();</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pSet</span><span class=pun>-</span>&gt;<span class=typ>Close</span><span class=pun>();</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pConnect</span><span class=pun>-</span>&gt;<span class=typ>Close</span><span class=pun>();</span><span class=pln> &nbsp; &nbsp; <br></span><span class=pun>}</span><span class=kwd>catch</span><span class=pun>(</span><span class=pln>_com_error &nbsp;e</span><span class=pun>)</span><span class=com>///捕捉异常 &nbsp; </span><span class=pln><br></span><span class=pun>{</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>CString</span><span class=pln> &nbsp;errormessage</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;errormessage</span><span class=pun>.</span><span class=typ>Format</span><span class=pun>(</span><span class=str>"连接数据库失败!rn错误信息:%s"</span><span class=pun>,</span><span class=pln>e</span><span class=pun>.</span><span class=typ>ErrorMessage</span><span class=pun>());</span><span class=pln> <br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxMessageBox</span><span class=pun>(</span><span class=pln>errormessage</span><span class=pun>);</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>return</span><span class=pln> &nbsp;</span><span class=pun>-</span><span class=lit>1</span><span class=pun>;</span><span class=pln> <br></span><span class=pun>}</span><span class=pln>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br></span><span class=lit>7</span><span class=pun>.遍历一个表中的所有字段</span><span class=pln> <br></span><span class=typ>Field</span><span class=pln> &nbsp;</span><span class=pun>*</span><span class=pln> &nbsp; &nbsp; &nbsp;field &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;NULL</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>HRESULT &nbsp; &nbsp; &nbsp;hr</span><span class=pun>;</span><span class=pln> <br></span><span class=typ>Fields</span><span class=pln> &nbsp;</span><span class=pun>*</span><span class=pln> &nbsp; &nbsp;fields &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;NULL</span><span class=pun>;</span><span class=pln> <br>hr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pRecordset</span><span class=pun>-</span>&gt;<span class=pln>get_Fields &nbsp;</span><span class=pun>(</span>&amp;<span class=pln>fields</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>//得到记录集的字段集和 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br></span><span class=kwd>if</span><span class=pun>(</span><span class=pln>SUCCEEDED</span><span class=pun>(</span><span class=pln>hr</span><span class=pun>))</span><span class=pln> &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp;fields</span><span class=pun>-</span>&gt;<span class=pln>get_Count</span><span class=pun>(</span>&amp;<span class=typ>ColCount</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;<br></span><span class=com>//得到记录集的字段集合中的字段的总个数 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class=pln><br></span><span class=kwd>for</span><span class=pun>(</span><span class=pln>i</span><span class=pun>=</span><span class=lit>0</span><span class=pun>;</span><span class=pln>iItem</span><span class=pun>[</span><span class=pln>i</span><span class=pun>]-</span>&gt;<span class=pln>get_Name</span><span class=pun>(</span>&amp;<span class=pln>bstrColName</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=com>//得到记录集//中的字段名 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strColName</span><span class=pun>=</span><span class=pln>bstrColName</span><span class=pun>;</span><span class=pln> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nameField &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;strColName</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_FieldsList</span><span class=pun>.</span><span class=typ>AddString</span><span class=pun>(</span><span class=pln>nameField</span><span class=pun>);</span><span class=pln> <br></span><span class=pun>}</span><span class=pln> <br></span><span class=kwd>if</span><span class=pun>(</span><span class=pln>SUCCEEDED</span><span class=pun>(</span><span class=pln>hr</span><span class=pun>))</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fields</span><span class=pun>-</span>&gt;<span class=typ>Release</span><span class=pun>();</span><span class=com>//释放指针 </span><span class=pln><br>&nbsp;<br></span><span class=pun>附:</span><span class=pln> <br></span><span class=lit>1</span><span class=pun>、</span><span class=pln>_variant_t <br></span><span class=pun>(</span><span class=lit>1</span><span class=pun>)、一般传给这</span><span class=lit>3</span><span class=pun>个指针的值都不是</span><span class=pln>MFC</span><span class=pun>直接支持的数据类型,而要用</span><span class=pln>_variant_t</span><span class=pun>转换一下</span><span class=pln> <br>_variant_t</span><span class=pun>(</span><span class=pln>XX</span><span class=pun>)可以把大多数类型的变量转换成适合的类型传入：</span><span class=pln> <br></span><span class=pun>(</span><span class=lit>2</span><span class=pun>)、</span><span class=pln>_variant_t &nbsp;</span><span class=kwd>var</span><span class=pun>;</span><span class=pln>_variant_t &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;</span><span class=kwd>long</span><span class=pun>:</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=kwd>long</span><span class=pun>)</span><span class=kwd>var</span><span class=pun>;</span><span class=pln> <br>_variant_t &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;</span><span class=typ>CString</span><span class=pun>:</span><span class=pln> &nbsp;</span><span class=typ>CString</span><span class=pln> &nbsp;strValue &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>_bstr_t</span><span class=pun>(</span><span class=kwd>var</span><span class=pun>);</span><span class=pln> <br></span><span class=typ>CString</span><span class=pln> &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;_variant_t</span><span class=pun>:</span><span class=pln> &nbsp;_variant_t</span><span class=pun>(</span><span class=pln>strSql</span><span class=pun>);</span><span class=pln> <br></span><span class=lit>2</span><span class=pun>、</span><span class=pln>BSTR</span><span class=pun>宽字符串与</span><span class=typ>CString</span><span class=pun>相互转换</span><span class=pln> <br>&nbsp;<br>BSTR &nbsp;bstr</span><span class=pun>;</span><span class=pln> <br></span><span class=typ>CString</span><span class=pln> &nbsp;strSql</span><span class=pun>;</span><span class=pln> <br></span><span class=typ>CString</span><span class=pln> &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;BSTR</span><span class=pun>:</span><span class=pln> &nbsp;bstr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;strSql</span><span class=pun>.</span><span class=typ>AllocSysString</span><span class=pun>();</span><span class=pln> <br>BSTR &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;</span><span class=typ>CString</span><span class=pun>:</span><span class=pln> &nbsp;strSql &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>bstr</span><span class=pun>;</span><span class=pln> <br></span><span class=lit>3</span><span class=pun>、</span><span class=pln>_bstr_t</span><span class=pun>与</span><span class=typ>CString</span><span class=pun>相互转换</span><span class=pln> <br>&nbsp;<br>_bstr_t &nbsp;bstr</span><span class=pun>;</span><span class=pln> <br></span><span class=typ>CString</span><span class=pln> &nbsp;strSql</span><span class=pun>;</span><span class=pln> <br></span><span class=typ>CString</span><span class=pln> &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;_bstr_t</span><span class=pun>:</span><span class=pln> &nbsp;bstr &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln>_bstr_t</span><span class=pun>)</span><span class=pln>strSql</span><span class=pun>;</span><span class=pln> <br>_bstr_t &nbsp;</span><span class=pun>-</span>&gt;<span class=pln> &nbsp;</span><span class=typ>CString</span><span class=pun>:</span><span class=pln> &nbsp;strSql &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=pun>(</span><span class=pln>LPCSTR</span><span class=pun>)</span><span class=pln>bstr</span><span class=pun>;</span><span class=pln> <br></span><span class=lit>4</span><span class=pun>、关于时间</span><span class=pln> <br></span><span class=typ>Access</span><span class=pun>:表示时间的字符串</span><span class=com>#2004-4-5# </span><span class=pln><br></span><span class=typ>Sql</span><span class=pun>:表示时间的字符串</span><span class=str>''</span><span class=lit>2004</span><span class=pun>-</span><span class=lit>4</span><span class=pun>-</span><span class=lit>5</span><span class=str>''</span><span class=pln> <br></span><span class=typ>DateField</span><span class=pun>(时间字段)</span><span class=pln> &nbsp;select &nbsp;</span><span class=pun>*</span><span class=pln> &nbsp;</span><span class=kwd>from</span><span class=pln> &nbsp;my_table &nbsp;where &nbsp;</span><span class=typ>DateField</span><span class=pln> &nbsp;</span>&gt;<span class=pln> &nbsp;</span><span class=com>#2004-4-10# </span><span class=pln><br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>try</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>CommandText</span><span class=pln> &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;</span><span class=str>"INSERT &nbsp;INTO &nbsp;tTest(age) &nbsp;VALUES('23f2') &nbsp;"</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_pRecordset &nbsp;</span><span class=pun>=</span><span class=pln> &nbsp;m_pCommand</span><span class=pun>-</span>&gt;<span class=typ>Execute</span><span class=pun>(</span><span class=pln>NULL</span><span class=pun>,</span><span class=pln>NULL</span><span class=pun>,</span><span class=pln> &nbsp;adCmdText</span><span class=pun>);</span><span class=pln> &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=kwd>catch</span><span class=pun>(</span><span class=pln>_com_error &nbsp;e</span><span class=pun>)</span><span class=com>///捕捉异常 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>{</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>CString</span><span class=pln> &nbsp;errormessage</span><span class=pun>;</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;errormessage</span><span class=pun>.</span><span class=typ>Format</span><span class=pun>(</span><span class=str>"连接数据库失败!\r\n错误信息:%s"</span><span class=pun>,</span><span class=pln>e</span><span class=pun>.</span><span class=typ>ErrorMessage</span><span class=pun>());</span><span class=pln> <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=typ>AfxMessageBox</span><span class=pun>(</span><span class=pln>errormessage</span><span class=pun>);</span><span class=com>///显示错误信息 </span><span class=pln><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span class=pun>}</span></div>
<img src ="http://www.cppblog.com/finehai/aggbug/90591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-20 10:59 <a href="http://www.cppblog.com/finehai/archive/2009/07/20/90591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC学习总结 (67个技巧)</title><link>http://www.cppblog.com/finehai/archive/2009/07/20/90586.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Mon, 20 Jul 2009 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/20/90586.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90586.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/20/90586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90586.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1．"属性页的添加：创建对话框的类，该类要从CpropertyPage继承；然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch；最后，在.cpp文件里的OnInitDialog()之类的函数里实现如下代码：m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE,...&nbsp;&nbsp;<a href='http://www.cppblog.com/finehai/archive/2009/07/20/90586.html'>阅读全文</a><img src ="http://www.cppblog.com/finehai/aggbug/90586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-20 10:31 <a href="http://www.cppblog.com/finehai/archive/2009/07/20/90586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Char[] 和 String 的转换 </title><link>http://www.cppblog.com/finehai/archive/2009/07/20/90584.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Mon, 20 Jul 2009 02:26:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/20/90584.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90584.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/20/90584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90584.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90584.html</trackback:ping><description><![CDATA[遇到字符串处理时，我们需要在 char[] 和 string 间相互转换，举个例子大家就明白了<br><br>实现字符串的反转： 如输入 ABCDE，返回 EDCBA<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;reverse(&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;inputString)<br><img id=Codehighlighter1_47_584_Open_Image onclick="this.style.display='none'; Codehighlighter1_47_584_Open_Text.style.display='none'; Codehighlighter1_47_584_Closed_Image.style.display='inline'; Codehighlighter1_47_584_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_47_584_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_47_584_Closed_Text.style.display='none'; Codehighlighter1_47_584_Open_Image.style.display='inline'; Codehighlighter1_47_584_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_47_584_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_47_584_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(inputString&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_128_574_Open_Image onclick="this.style.display='none'; Codehighlighter1_128_574_Open_Text.style.display='none'; Codehighlighter1_128_574_Closed_Image.style.display='inline'; Codehighlighter1_128_574_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_128_574_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_128_574_Closed_Text.style.display='none'; Codehighlighter1_128_574_Open_Image.style.display='inline'; Codehighlighter1_128_574_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_128_574_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_128_574_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[]&nbsp;tar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;inputString.ToCharArray();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string&nbsp;&nbsp;to&nbsp;char&nbsp;array</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;tar.Length&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_281_441_Open_Image onclick="this.style.display='none'; Codehighlighter1_281_441_Open_Text.style.display='none'; Codehighlighter1_281_441_Closed_Image.style.display='inline'; Codehighlighter1_281_441_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_281_441_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_441_Closed_Text.style.display='none'; Codehighlighter1_281_441_Open_Image.style.display='inline'; Codehighlighter1_281_441_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_281_441_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_281_441_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;temp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tar[i];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tar[tar.Length&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar[tar.Length&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;re&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">(tar);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">char&nbsp;array&nbsp;to&nbsp;string</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;re;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/finehai/aggbug/90584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-20 10:26 <a href="http://www.cppblog.com/finehai/archive/2009/07/20/90584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Win32程序基本概念</title><link>http://www.cppblog.com/finehai/archive/2009/07/18/90447.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Sat, 18 Jul 2009 11:27:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/18/90447.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90447.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/18/90447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90447.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90447.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">以下主要介绍：win32 程序开发流程，导入函数库，windows的运行机制，输入分类，信息，窗口函数等概念。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">MFC microsoft foundation classes<br>API application programming interface<br>DLL dynamic link library<br>GUI graphics user interface<br>MDI multiple document interface<br>SDI sigle document interface<br>OLE object linking&amp;embeded<br>SDM software development kit<br>UI user interface<br>WinApp windows application</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial"><br>windows程序是信息为基础，事件驱动 message based，event driven</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">windows程序分为程序编码和UI资源两部分，用rc编译器集成一个完整的exe文件</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">win32 程序开发流程：<br>资源描述<a onclick="javascript:tagshow(event, '%CE%C4%BC%FE');" href="javascript:;" target=_self><u><strong><font color=#000000>文件</font></strong></u></a>.rc中描述各种UI资源，RC编译器RC.EXE读取RC文件描述的所有UI资源</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">文件集中制作一个.RES文件，再和程序编码结合在一起，成为一个完整的windows可</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">执行文件。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial"><br>WINDOWS程序为什么必须使用导入函数库？<br>windows程序调用的函数分为：c runtimes 以及 windows api两大部分。<br>windows api，由操作系统本身提供（windows 三大模块</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">GUI32.DLL,USER32.DLL,KERNEL32.DLL）.<br>导入函数库，就是存放在<a onclick="javascript:tagshow(event, '%C1%B4%BD%D3');" href="javascript:;" target=_self><u><strong><font color=#000000>链接</font></strong></u></a>的时候需要使用什么样的dll文件，以及这些文件存放</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">的地方。而三大模块所对应的导入函数库别为</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">GUI32.LIB,USER32.LIB,KERNEL32.LIB.</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">一般函数是存放到了上边的三大模块中，还有新的api函数，放在dll文件中，比如</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">COMMDLG.DLL,TOOLHELP.DLL,中，如果使用这些API，链接时还得加上这些dll对应的</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">导入函数，比如COMDLG32.LIB和TH32.LIB.</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">WINDOWS程序需要什么头文件？<br>windows程序必须包含windows.h.它包含的是三大模块所提供的api函数，如果用到</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">其他system dlls，比如COMMDLG.DLL,MAPI.DLL,TAPI.DLL,就要使用相对应的头文件</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">COMMDLG.H MAPI.H TAPI.H等等。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">windows的运行机制？<br>信息为基础，以事件驱动。<br>windows程序运行依靠外部发生的事件来驱动的。程序等待任何可能的输入，然后判</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">断，最后做出适当处理。<br>输入是由操作系统捕捉到，以信息形式进入程序之中。<br>信息，就是windows内设的一种数据结构。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">输入分类？<br>硬件设置所产生的信息：放到系统队列（system queue）<br>windows系统或是其他windows程序传送过来的信息：放到程序队列（application</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">queue）。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">信息？<br>信息，就是windows内设的一种数据结构。<br>typedef struct tagMSG<br>{<br>&nbsp;HWND hwnd;<br>&nbsp;UINT message;(WM_)<br>&nbsp;WPARAM wParam;(WM_MOUSEMOVE,WM_SIZE,WM_LBUTTONDOWN)<br>&nbsp;LPARM lParm;<br>&nbsp;DWORD time;<br>&nbsp;POINT pt;<br>}MSG;<br>接受并处理信息的就是窗口。每个窗口都有一个函数负责处理信息，这个函数就叫</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">窗口函数（window procedure，window function）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">窗口注册和窗口的诞生？<br>窗口函数就是窗口接收信息后的反应。<br>产生窗口前用API函数RegisterClass设定窗口属性（就是注册窗口）</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">窗口的注册用的是RegisterClass (被封装在InitApplication函数中)<br>窗口的诞生是用CreateWindow(被封装在InitInstance函数中)<br>InitApplication 和 InitInstance区别：</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">函数注册：窗口类只需要注册一次，以后可供同一程序的后继每一个实例</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">（instance）使用（所有进程公在一个地址空间中），因此将RegisterClass这个动</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">作放在&#8220;只有第一个实例才会进入&#8221;的InitApplication函数中。<br>一个进程是否是某个程序的第一个实例，可以用WinMain的参数hPrevInstance来判</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">断<br>产生窗口：CreateWindow是任何实例都可以进入，放到InitInstance函数中。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial"><br>信息循环？<br>while(GetMessage(&amp;msg,...))<br>{<br>&nbsp;TranslateMessage(&amp;msg);//为了将键盘信息转化<br>&nbsp;DispatchMessage(&amp;msg);//将信息传给窗口函数去处理<br>}</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">&nbsp;</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">窗口函数？</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">DispatchMessage(&amp;msg)是一种回调函数，就是你自己写的程序中的被windows系统</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">调用的函数。<br>窗口函数形式：<br>LRESULT CALLBACK WndProc(HWND hWnd,<br>&nbsp;&nbsp;&nbsp;UINT message,<br>&nbsp;&nbsp;&nbsp;WPARAM wParam,<br>&nbsp;&nbsp;&nbsp;LPARAM lParam)<br>资源定义文件(.RC)：<br>.RC文件是一个用文字描述资源的地方。常用资源有九项：ICON（图标）,CURSOR（</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">指针）,BITMAP（位图）,FONT（字体）,DIALOG（对话框）,MENU（菜</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">单）,ACCELERATOR（加速器）,STRING（字符串）,VERSIONINFO.</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">核心对象？<br>系统的一种资源，一旦产生，任何应用程序都可以开启并使用这个对象。系统给核</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">心对象 一个计数值来管理它。<br>核心对象包括：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产生方法<br>event&nbsp;&nbsp;&nbsp;CreateEvent<br>mutex&nbsp;&nbsp;&nbsp;CreateMutex<br>semaphore&nbsp;&nbsp;CreateSemphore<br>以上用于线程同步化<br>file&nbsp;&nbsp;&nbsp;CreateFile<br>file-mapping&nbsp;&nbsp;CreateFileMapping 用于内存映射文件<br>process&nbsp;&nbsp;&nbsp;CreateProcess<br>thread&nbsp;&nbsp;&nbsp;CreateThread</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">进程的诞生和死?<br>shell中以鼠标双击一个可执行文件图标，就可以执行这个(比如)App.exe的流程：<br>1shell调用CreateProcess启动App.exe。&#8216;<br>2系统产生一个&#8220;进程核心对象&#8221;，计数值为1。<br>3系统为此进程建立一个4GB地址空间<br>4载入器将必要的数据载入到上述地址空间中，包括App.exe的程序，数据，以及所</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">需要的连接函数库（DLL）.载入器是根据.idata section中的（PE文件格式）的记</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">录文件。<br>5系统为此进程建立一个线程，称为主线程。线程才是分配cpu时间的分配对象。<br>6系统调用 C runtime函数库的Startup code。<br>7Startup code调用App程序的WinMain函数。<br>8App程序运行开始<br>9使用者关闭App主窗口，是WinMain中的信息循环结束掉，于是WinMain结束。<br>10 返回到Startup code。<br>11返回到系统，系统调用ExitProcess结束进程。</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial"><br>产生子进程？<br>用CreateProcess</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">结束进程？<br>VOID ExitProcess(UINT fuExitCode);</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">产生额外的线程?<br>CreateThread()</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">当进程建立起来后，系统会完成什么（就是已经有了主线程）？<br>1配置&#8220;线程对象&#8221;，其handle将成为CreateThread的返回值<br>2设定计数值为1<br>3配置线程的context（工作）<br>4保留线程的堆栈<br>5将context中的堆栈指针寄存器（ss）和指令指针寄存器（ip）设定妥当</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">线程优先级？<br>0－31 从低到高，</p>
<p style="FONT-SIZE: 14pt; FONT-FAMILY: Arial">级别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;代码&nbsp;&nbsp;&nbsp;&nbsp;优先权值<br>idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDLE_PRIORITY_CLASS&nbsp;&nbsp;4<br>normal&nbsp;&nbsp;NORMAL_PRIORITY_CLASS&nbsp;&nbsp; &nbsp;9<br>high&nbsp;&nbsp;HIGH_PRIORITY_CLASS&nbsp;&nbsp;13<br>realtime&nbsp;REALTIME_PRIORITY_CLASS &nbsp;24<br></p>
<img src ="http://www.cppblog.com/finehai/aggbug/90447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-18 19:27 <a href="http://www.cppblog.com/finehai/archive/2009/07/18/90447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC六大关键技术之仿真</title><link>http://www.cppblog.com/finehai/archive/2009/07/18/90445.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Sat, 18 Jul 2009 11:24:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/18/90445.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90445.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/18/90445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90445.html</trackback:ping><description><![CDATA[<p>什么是application framework？内部运作机制是什么？</p>
<p><font style="BACKGROUND-COLOR: #ff0000">MFC六大关键技术是什么？<br></font><font style="BACKGROUND-COLOR: #ffff80">1MFC程序的初始化过程<br>2RTTI 动态类型标识&nbsp;<br>3Dynamic Creation&nbsp; 动态生成<br>4Persistence&nbsp; 永久保留<br>5Message Mapping&nbsp; 信息映射<br>6Message Routing&nbsp;&nbsp; 信息传递</font></p>
<p><br><font style="BACKGROUND-COLOR: #ff0000">怎样自制RTTI？<br></font>我们作为类库的设计者要在类构造起来的时候，记录必要的信息，以建立型录。型录中的类的信息，最好以链表方式连接起来。一般&#8220;类别型录&#8221;是一个结构，其中至少需要类名字，链表的Next指针，以及链表的First指针。First属于整体变量，一份就好，所以用static修饰。<br>为了将每一个类都能拥有成员变量集合，并且最好有一定的命名规则，然后经某种手段将整个类库构造好之后，&#8220;类别型录&#8221;（就是各个CRuntimeClass对象）则能呈现为：</p>
<p><br><font style="BACKGROUND-COLOR: #ff0000">什么是DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 宏？作用就是完成RTTI的&#8220;类别型录&#8221;。</font><br>为了将一个类对象塞到类之中，并定义一个可以捕捉到该对象地址的函数，定义一个宏为：<br>#define DECLARE_DYNAMIC(class_name)<br>public:<br>static CRuntimeClass class##class_name;<br>virtual CRuntimeClass* GetRuntimeClass()const;</p>
<p>比如我使用了DECLARE_DYNAMIC(CView)<br>编译器预处理器为我做出的代码是：<br>public:<br>&nbsp;static CRuntimeClass classCView;<br>&nbsp;virtual CRuntimeClass * GetRuntimeClass()const;<br>也就是定义类时，将类放入DECLARE_DYNAMIC宏就是把要放的对象放到了里边。具体连接工作是由IMPLEMENT_DYNAMIC宏来实现：<br>#define IMPLEMENT_DYNAMIC(class_name,base_class_name)<br>&nbsp;_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)<br>这里不做扩展，总之，IMPLEMENT_DYNAMIC内容不仅制定初值，它使用了一个struct AFX_CLASSINIT {AFX_CLASSINTI(CRuntimeClass * pNewClass);};<br>(c++的struct和class都有构造函数)：<br>AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass*pNewClass)<br>{ pNewClass-&gt;m_NextClass = CRuntimeClass::pFirstClass;<br>&nbsp; CRuntimeClass::pFirstClass = pNewClass;<br>}<br>就是上边的这个构造函数完成了连接工作。<br>一般使用的形式是：<br>class CView:public CWnd<br>{<br>&nbsp;DECLARE_DYNAMIC(CView)<br>&nbsp;...<br>};<br>// in implementation file<br>IMPLEMENT_DYNAMIC(CView CWnd)<br>这两个宏就完成了构造数据链表的工作。</p>
<p><font style="BACKGROUND-COLOR: #ff0000">怎样生成mfc层次结构的类别型录？</font></p>
<p>.h文件中<br>class CObject{...};<br>class CCmdTarget:public CObject<br>{<br>&nbsp;DECLARE_DYNCMIC (CCmdTarget)<br>&nbsp;...<br>};<br>class CWinThread:public CCmdTarget<br>{<br>&nbsp;DECLARE_DYNAMIC (CWinThread)<br>&nbsp;...<br>};<br>class CWinApp:public CWinThread<br>{<br>&nbsp;DECLARE_DYNAMIC (CWinApp)<br>&nbsp;...<br>};<br>class CDocument:public CCmdTarget<br>{<br>&nbsp;DECLARE_DYNAMIC (CDocument)<br>&nbsp;...&nbsp;<br>};<br>class CWnd:public CCmdTarget<br>{<br>&nbsp;DECLARE_DYNAMIC (CWnd)<br>&nbsp;...<br>};<br>class CFrameWnd:public CWnd<br>{<br>&nbsp;DECLARE_DYNAMIC (CFrameWnd)<br>&nbsp;...<br>};<br>class CView:public CWnd<br>{<br>&nbsp;DECLARE_DYNAMIC (CView)<br>&nbsp;...<br>};<br>class CMyWinApp:public CWinApp<br>{...};<br>class CMyFrameWnd:public CFrameWnd<br>{...};<br>class CMyDoc:public CDocument<br>{...};<br>class CMyView:public CView<br>{...};</p>
<p><br>.cpp文件中<br>IMPLEMENT_DYNAMIC(CCmdTarget,CObject)<br>IMPLEMENT_DYNAMIC(CWinThread,CCmdTarget)<br>IMPLEMENT_DYNAMIC(CWinApp,CWinThread)<br>IMPLEMENT_DYNAMIC(CWnd,CCmdTarget)<br>IMPLEMENT_DYNAMIC(CView,CWnd)<br>IMPLEMENT_DYNAMIC(CFrameWnd,CWnd)<br>IMPLEMENT_DYNAMIC(CDocument,CCmdTarget)</p>
<p><br><font style="BACKGROUND-COLOR: #ff0000">IsKindOf是什么？</font><br>它是类型识别，就说在建立了&#8220;类别型录&#8221;网后，在某个类中存在这个函数，就是看这个指针是不是存在某个类的下支中。<br>比如：<br>CMyDoc * pMyDoc = new CMyDoc;<br>CMyView * pMyView = new CMyView;</p>
<p>cout&lt;&lt;pMyDoc-&gt;IsKindOf(RUNTIME_CLASS(CMyDoc));//TURE<br>cout&lt;&lt;pMyDoc-&gt;IsKindOf(RUNTIME_CLASS(CDocument));//TURE<br>cout&lt;&lt;pMyDoc-&gt;IsKindOf(RUNTIME_CLASS(CCmdTarget));//TURE<br>cout&lt;&lt;pMyDoc-&gt;IsKindOf(RUNTIME_CLASS(CObject));//TURE<br>cout&lt;&lt;pMyDoc-&gt;IsKindOf(RUNTIME_CLASS(CWinApp));//FALSE</p>
<p><br><font style="BACKGROUND-COLOR: #ff0000">怎样 自制Dynamic Create(动态生成)？</font></p>
<p>将类的大小记录在类别型录中，把构造函数也记录在类别型录中，当程序在运行时期获得一个类名字，它就可以在&#8220;类别型录网&#8221;中找到对应的元素，然后根据类的大小，调用构造函数，产生出该对象。</p>
<p>这里使用的是DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏<br>使用和完成类别型录的方式差不多：<br>class CFrameWnd:public CWnd<br>{<br>&nbsp;DECLARE_DYNCREATE(CFrameWnd)<br>&nbsp;...<br>};(就是在头<a onclick="javascript:tagshow(event, '%CE%C4%BC%FE');" href="javascript:;" target=_self><u><strong><font color=#000000>文件</font></strong></u></a>中)</p>
<p>// in implement （就是在cpp文件中实现）<br>IMPLEMENT_DYNCREATE(CFrameWnd,CWnd)</p>
<p><br><font style="BACKGROUND-COLOR: #ff0000">怎样自制Persistence（永久保存）机制？</font><br>写到文件中去。<br>把数据写到文件中。方法是：在Document/View结构中，数据都放在一份document里头，我们只要把其中的成员变量陆续写进文件中即可。如果成员变量是个对象，就需要先记载类的名字，然后才是对象中的数据。</p>
<p><br><font style="BACKGROUND-COLOR: #ff0000">什么是Serialize机制？</font><br>就是把文件名的选择、文件的访问、缓冲区的建立、数据的读写、运算符（&gt;&gt;）和运算符(&lt;&lt;)的重载、对象的动态生成都包装起来。它的数据读写和对象的动代生成是关键，动态生成已经具有，这里就重点讨论数据的读写操作。</p>
<p>serialize机制就是考虑到每次记录对象内容的时候，先写入一个代码，表示此对象类是否曾在文件中记录过了。如果是新类，就记录类的名字，如果是就类，就用代码表示。还有就是可以控制版本号的问题。有一个专门的serialization函数，用于负责这些任务。<br>每一个可写到文件或可从文件中读出的类，都应该有它自己的serailize函数。负责它自己数据读写操作，并且应该改写&#8220;&lt;&lt;&#8221;&#8220;&gt;&gt;&#8221;,把数据导流导archive中。</p>
<p><br>怎样完成serialize？<br>使用DECLARE_SERIAL/IMPLEMENT_SERIAL宏。这个宏的功能是将&#8220;&lt;&lt;&#8221;和&#8220;&gt;&gt;&#8221;两个运算符重载，还可以将serialize函数放到类定义中。类能够进行文件读写，其前提是拥有动态生成的能力。<br>#define DECLARE_SERIAL(class_name)<br>&nbsp;DECLARE_DYNCREATE(class_name)<br>&nbsp;friend CArchive&amp; AFXAPI operator &gt;&gt;(CArchive&amp; ar,class_name *&amp;pOb)<br>#define IMPLEMENT_SERIAL(class_name,base_name,wSchema)<br>&nbsp;CObject * PASCAL class_name::CreateObject()<br>&nbsp;{return new class_name;}<br>&nbsp;_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,<br>&nbsp;&nbsp;class_name::CreateObject)<br>&nbsp;CArchive&amp; AFXAPI operator&gt;&gt;(CArchive&amp; ar,class_name *&amp;pOb)<br>&nbsp;{pOb = (class_name*)ar.ReadObject(RUNTIME_CLASS(class_name));<br>&nbsp;return ar;}</p>
<p><br>一个对象处理之前，判断是否第一次出现、记录版本号、记录文件名怎样实现？<br>用CRuntimeClass中的两个函数Load和Store。<br>struct CRuntimeClass<br>{<br>//attributes<br>&nbsp;LPCSTR m_lpszClassName;<br>&nbsp;int m_nObjectSize;<br>&nbsp;UINT m_wSchema;//schema number of the loaded class<br>&nbsp;CObject *(PASCAL * m_pfnCreateObject)();<br>&nbsp;CRuntimeClass * m_pBaseClass;<br>&nbsp;&nbsp;<br>&nbsp;CObject *CreateObject();<br>&nbsp;void Store (CArchive&amp;ar)const;<br>&nbsp;static CRuntimeClass * PASCAL Load(CArchive &amp;ar,UINT *pwSchemaNum);<br>//CRuntimeClass objects linked together in simple list<br>&nbsp;static CRuntimeClass * pFirstClass;//start of class list<br>&nbsp;CRuntimeClass * m_pNextClass;//linked list of registered classes<br>};</p>
<p><br>为了让整个serialization机制运行起来，必须做定义为：<br>.h文件中必须有<br>class CScribDoc:public CDocument<br>{<br>&nbsp;DECLARE_DYNCREATE(CScribDoc)<br>&nbsp;...<br>};<br>class CStroke:public CObject<br>{<br>&nbsp;DECLARE_SERIAL(CStroke)<br>public:<br>&nbsp;void Serialize(CArchive&amp;);<br>...<br>};</p>
<p>class CRectangle :public CObject<br>{<br>&nbsp;DECLARE_SERIAL(CRectangle)<br>public<br>&nbsp;void Serialize(CArchive&amp;)</p>
<p>};</p>
<p>class CCircle:public CObjcet<br>{<br>&nbsp;DECLARE_SERIAL(CCircle)<br>public:<br>&nbsp;void Seiralize(CArchive&amp;);<br>...<br>};</p>
<p>.cpp文件中必须有<br>IMPLEMENT_DYNCREATE(CScribDoc,CDocument)<br>IMPLEMENT_SERIAL(CStroke,CObjcet,2)<br>IMPLEMENT_SERIAL(CRectangle,CObjcet,1)<br>IMPLEMENT_SERIAL(CCircle,CObjcet,1)</p>
<p><br>怎样自制Message Mapping(消息映射)？</p>
<p>当我们的类库成立，如果其中与信息有关的类（就是&#8220;信息标的类&#8221;mfc中就是CCmdTarget）都是一条链式地继承，我们应该为每一个&#8220;信息表的类&#8221;准备一个信息映射表，比且将基类与派生类的信息映射表连接起来。然后，当窗口函数做信息的比较时，我们就可以想办法引导它沿着这条路走过去。</p>
<p>定义消息映射的数据结构：<br>struct AFX_MSGMAP<br>{<br>&nbsp;AFX_MSGMAP * pBaseMessagMap;<br>&nbsp;AFX_MSGMAP_ENTRY *lpEntries;<br>};<br>其中的AFX_MSGMAP_ENTRY又是另一个数据结构：<br>struct AFX_MSGMAP_ENTRY<br>{<br>&nbsp;UINT nMessage;<br>&nbsp;UINT nCode;<br>&nbsp;UINT nID;<br>&nbsp;UINT nLastID;<br>&nbsp;UINT nSig;<br>&nbsp;AFX_PMSG pfn;<br>}<br>其中的AFX_PMSG定义为函数指针：<br>typedef void (CCmdTarget::*AFX_PMSG)(void);</p>
<p>之后定义的宏就是<br>#define DECLARE_MESSAGE_MAP();<br>static AFX_MSGMAP_ENTRY_ messageEntries[];<br>static AFX_MSGMAP messageMap;<br>virtual AFX_MSGMAP *GetMessageMap()const;</p>
<p>MFC对消息传递的规定是什么？（message routing）<br>如果是一般的windows信息（WM_xxx）,一定是从派生类流向基类。</p>
<img src ="http://www.cppblog.com/finehai/aggbug/90445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-18 19:24 <a href="http://www.cppblog.com/finehai/archive/2009/07/18/90445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC]消息映射</title><link>http://www.cppblog.com/finehai/archive/2009/07/18/90444.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Sat, 18 Jul 2009 11:23:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/18/90444.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90444.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/18/90444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90444.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90444.html</trackback:ping><description><![CDATA[<p>为什么要有消息映射，它的使用是怎样的？</p>
<p>MFC程序是不包括主要函数和时间循环。所有的事件处理都是作为CWinApp的一部分在后台处理的。而消息映射就是识别感兴趣的事件然后调用函数来响应这些事件。</p>
<p>一，首先是正常的程序</p>
<p>// button1.cpp<br>　　#include<afxwin.h></afxwin.h><br>　　#define IDB_BUTTON 100<br>　　// Declare the application class<br>　　class CButtonApp : public CWinApp<br>　　{<br>　　public:<br>　　virtual BOOL InitInstance();<br>　　};<br>　　// Create an instance of the application class<br>　　CButtonApp ButtonApp;<br>　　// Declare the main window class<br>　　class CButtonWindow : public CFrameWnd<br>　　{<br>　　CButton *button;<br>　　public:<br>　　CButtonWindow();<br>　　};<br>　　// The InitInstance function is called once<br>　　// when the application first executes<br>　　BOOL CButtonApp::InitInstance()<br>　　{<br>　　m_pMainWnd = new CButtonWindow();<br>　　m_pMainWnd-&gt;ShowWindow(m_nCmdShow);<br>　　m_pMainWnd-&gt;UpdateWindow();<br>　　return TRUE;<br>　　}<br>　　// The constructor for the window class<br>　　CButtonWindow::CButtonWindow()<br>　　{<br>　　CRect r;<br>　　// Create the window itself<br>　　Create(NULL,<br>　　"CButton Tests",<br>　　WS_OVERLAPPEDWINDOW,<br>　　CRect(0,0,200,200));<br>　　// Get the size of the client rectangle<br>　　GetClientRect(&amp;r);<br>　　r.InflateRect(-20,-20);<br>　　// Create a button<br>　　button = new CButton();<br>　　button-&gt;Create("Push me",<br>　　WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,<br>　　r,<br>　　this,<br>　　IDB_BUTTON);<br>　　}</p>
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font style="BACKGROUND-COLOR: #ff9999">当你运行代码时，会注意到按钮响应了用户事件。既它加亮了。除此之外它没有做任何事情，因为我们还没有教它怎样去做。我们需要编写消息映射来使按钮做一些感兴趣的事情。</font></td>
        </tr>
    </tbody>
</table>
</p>
<p>二，建立消息映射</p>
<p>// button2.cpp<br>　　#include<afxwin.h></afxwin.h><br>　　#define IDB_BUTTON 100<br>　　// Declare the application class<br>　　class CButtonApp : public CWinApp<br>　　{<br>　　public:<br>　　virtual BOOL InitInstance();<br>　　};<br>　　// Create an instance of the application class<br>　　CButtonApp ButtonApp;<br>　　// Declare the main window class<br>　　class CButtonWindow : public CFrameWnd<br>　　{<br>　　CButton *button;<br>　　public:<br>　　CButtonWindow();<br><font style="BACKGROUND-COLOR: #ff0000">　　afx_msg void HandleButton(); //<br>　　DECLARE_MESSAGE_MAP()</font><br>　　};<br>　　// The message handler function<br><font style="BACKGROUND-COLOR: #ff0000">　　void CButtonWindow::HandleButton()<br>　　{<br>　　MessageBeep(-1);<br>　　}</font><br>　　// The message map<br><font style="BACKGROUND-COLOR: #ff0000">　　BEGIN_MESSAGE_MAP(CButtonWindow, CFrameWnd)<br>　　ON_BN_CLICKED(IDB_BUTTON, HandleButton)<br>　　END_MESSAGE_MAP()</font></p>
<p><font style="BACKGROUND-COLOR: #ff0000">/*用宏来建立消息映射。在代码中，你可以看见BEGIN_MESSAGE_MAP宏接收两各参数。第一个指定了使用消息映射的类的名称。第二个是基类。然后是ON_BN_CLICKED宏，接受两个参数控制的ID和该ID发送命令消息时所调用的函数。最后，消息映射用END_MESSAGE_MAP来结束。</font></p>
<p><font style="BACKGROUND-COLOR: #ff0000">当用户单击按钮时，它向其包含该按钮的父窗口发送了一个包含其ID的命令消息。那是按钮的缺省行为，这就是该代码工作的原因。按钮向其父窗口发送消息，是因为它是子窗口。父窗口截取该消息并用消息映射来确定所要调用的函数。MFC来安排，只要指定的消息一出现，相应的函数就会被调用。<br>　　ON_BN_CLICKED消息是CButton发送的唯一感兴趣的消息。它等同于CWnd中的ON_COMMAND消息，只是一个更简单方便的同义词而已。*/</font><br>　　// The InitInstance function is called once<br>　　// when the application first executes<br>　　BOOL CButtonApp::InitInstance()<br>　　{<br>　　m_pMainWnd = new CButtonWindow();<br>　　m_pMainWnd-&gt;ShowWindow(m_nCmdShow);<br>　　m_pMainWnd-&gt;UpdateWindow();<br>　　return TRUE;<br>　　}<br>　　// The constructor for the window class<br>　　CButtonWindow::CButtonWindow()<br>　　{<br>　　CRect r;<br>　　// Create the window itself<br>　　Create(NULL,<br>　　"CButton Tests",<br>　　WS_OVERLAPPEDWINDOW,<br>　　CRect(0,0,200,200));<br>　　// Get the size of the client rectangle<br>　　GetClientRect(&amp;r);<br>　　r.InflateRect(-20,-20);<br>　　// Create a button<br>　　button = new CButton();<br>　　button-&gt;Create("Push me",<br>　　WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,<br>　　r,<br>　　this,<br>　　IDB_BUTTON);<br>　　}<br></p>
<p>上边修改了两个地方，1增加了一个新的成员函数和一个新的表示消息映射的宏。HandleButton函数是正常的c++函数，它<font style="BACKGROUND-COLOR: #ff0000">通过afx_msg标签确定为消息处理函数。该函数有一些特殊约束，比如它必须是void型并且不能接收任何参数。 DECLARE_MESSAGE_MAP宏建立了消息映射。函数和宏都必须是public型的。</font></p>
<p><font style="BACKGROUND-COLOR: #ff0000"></font>&nbsp;</p>
<p><font style="BACKGROUND-COLOR: #ffff80">对消息映射的理解：</font></p>
<p><font style="BACKGROUND-COLOR: #ffff80">消息映射智能用于MFC。使用消息映射的原因是解决虚拟函数的基本问题。 MFC文件中CWnd类，它包含200多个成员函数，所有成员函数当不使用消息映射都是虚拟的。MFC中大约有近30个类是以CWnd为基类的。这包括所有的可见控制如按钮、静态标签和列表。想象一下，mfc使用虚拟啊和你熟，并且你建立以应用程序包含20个控制.CWnd中200个虚拟函数中每个都需要自己的虚拟函数表，并且一个控制的每个例程都应有一组200个虚拟函数与之关联。则程序可能就有近4000个虚拟函数表在内存中，这对内存有限的及其来书是个大问题，因为其中的大部分是不用的。</font></p>
<p><font style="BACKGROUND-COLOR: #ffff80">消息映射复制了虚拟函数表的操作，但是它是基于需要的基础之上的。消息映射就是对系统说&#8220;当你看见一个特殊的消息时，请调用制定的函数&#8221;，只有这些函数实际上被重载到消息映射中，就节省二楼内存和cpu的负担。</font></p>
<img src ="http://www.cppblog.com/finehai/aggbug/90444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-18 19:23 <a href="http://www.cppblog.com/finehai/archive/2009/07/18/90444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC]CButtonST使用技巧（二）</title><link>http://www.cppblog.com/finehai/archive/2009/07/17/90325.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Fri, 17 Jul 2009 04:42:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/17/90325.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90325.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/17/90325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90325.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90325.html</trackback:ping><description><![CDATA[<p align=center><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#117;&#120;&#105;&#117;&#120;&#105;&#110;&#103;&#64;&#49;&#54;&#51;&#46;&#110;&#101;&#116;"></a>&nbsp;</p>
上一篇文章《<a href="http://www.vckbase.com/document/viewdoc.asp?id=518" target=_blank>CButtonST使用技巧（一）</a>》介绍了CButtonST使用的7种技巧，本篇主要包括了以下的效果：<br><br>1. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F1">改变鼠标进入按钮时的形状(超链接效果)</a><br>2. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F2">菜单按钮</a><br>3. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F3">位图按钮</a><br>4. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F4">按钮焦点</a><br>5. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F5">CheckBox按钮</a><br>6. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F6">透明按钮(按钮背景和窗口背景一样)</a><br>7. <a href="http://www.vckbase.com/document/viewdoc/?id=519#F7">特殊的PictureBox</a><br><a name=F1></a><br><strong><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果一：改变鼠标进入按钮时的形状(超链接效果)</strong><br>假设按钮ID为IDC_BUTTON1<br>1. 添加成员变量
<pre>CButtonST    m_btn;</pre>
2. 添加Icon资源，设其ID设为IDI_ICON1<br>3. 在OnInitDialog函数中初始化按钮
<pre>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);
</pre>
<strong><a id=F2 name=F2></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果二：菜单按钮</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量<br>
<pre>CButtonST    m_btn;</pre>
2. 添加Icon资源，设其ID设为IDI_ICON1<br>3. 添加Menu，ID设为IDR_MENU<br>4. 在OnInitDialog函数中初始化按钮
<pre>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);</pre>
注意:菜单的效果类似与右键菜单，所有在设置菜单选项时只设置一列就够了。另外菜单的宽度与菜单的文字长度有关，可以用空格占位的办法以达到最佳效果。<br><br><strong>在菜单中引入位图的方法</strong><br><br>1.添加ToolBar，依次使用Menu菜单项ID作为ToolBar按钮的ID。<br>2.ToolBar上的按钮图标将显示在相应的菜单项中。<br>将上面代码中的m_btn.SetMenu(IDR_MENU, m_hWnd);<br>改为m_btn.SetMenu(IDR_MENU, m_hWnd, TRUE, IDR_TOOLBAR);<br>IDR_TOOLBAR为相应ToolBar的ID。<br><a id=F3 name=F3></a><br><strong><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果三：位图按钮</strong><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量<br>
<pre>CButtonST    m_btn;</pre>
2.添加位图资源，ID设为IDB_BITMAP1<br>3.在OnInitDialog函数中初始化按钮
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetBitmaps(IDB_BITMAP1,RGB(0,0,0));
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);</pre>
<strong>提示:</strong> 上面的SetBitmaps函数会将图片中颜色值为RGB(0,0,0)的点设为透明。<br><a id=F4 name=F4></a><br><strong><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果四：按钮焦点</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量<br>
<pre>CButtonST    m_btn;</pre>
2. 添加Icon资源，设其ID设为IDI_ICON1<br>3. 在OnInitDialog函数中初始化按钮
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
m_btn.DrawFlatFocus(TRUE);</pre>
<a id=F5 name=F5></a><br><strong><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果五：CheckBox按钮</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量<br>
<pre>CButtonST    m_btn;</pre>
2. 添加Icon资源，ID设为IDI_ICON1和IDI_ICON2<br>3.在OnInitDialog函数中初始化按钮
<pre>m_btn.SubclassDlgItem(IDC_CHECK1,this);
m_btn.SetIcon(IDI_ICON1,IDI_ICON2);
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
</pre>
<strong>提示:</strong><br>IDI_ICON1为选中时候显示的图标<br>IDI_ICON2为为选中时候的图标<br><a id=F6 name=F6></a><br><strong><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果六：透明按钮</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量<br>
<pre>CButtonST    m_btn;</pre>
2. 添加Icon资源，ID设为IDI_ICON1<br>3.在OnInitDialog函数中初始化按钮
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.DrawTransparent(TRUE);</pre>
<strong><a id=F7 name=F7></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果七：特殊的PictureBox</strong><br><br>利用CButtonST的特殊显示风格，完全可以把它当作一个PictureBox控件使用。这时一般会把按钮的属性设置为disable。<br>实例：演示程序的About页中使用了CButtonST来代替PictureBox。 
<img src ="http://www.cppblog.com/finehai/aggbug/90325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-17 12:42 <a href="http://www.cppblog.com/finehai/archive/2009/07/17/90325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC]CButtonST使用技巧（一）</title><link>http://www.cppblog.com/finehai/archive/2009/07/17/90324.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Fri, 17 Jul 2009 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/17/90324.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90324.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/17/90324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90324.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90324.html</trackback:ping><description><![CDATA[<p align=center><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#117;&#120;&#105;&#117;&#120;&#105;&#110;&#103;&#64;&#49;&#54;&#51;&#46;&#110;&#101;&#116;"><font color=#0000ff><u></u></font></a>&nbsp;</p>
<p><a href="http://www.vckbase.com/code/downcode.asp?id=1556"><font color=#0000ff><u>下载CButtonST示例源代码</u></font></a><br><a href="http://www.vckbase.com/code/downcode.asp?id=1750"><u><font color=#0000ff>下载CButtonST类的源代码</font></u></a><br><br>本篇主要包括了以下的效果：<br>1. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F1"><u><font color=#0000ff>在按钮上加入Icon，使Icon和文字同时显示</font></u></a><br>2. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F2"><u><font color=#0000ff>显示平面按钮</font></u></a><br>3. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F3"><u><font color=#0000ff>使按钮上的图标可变</font></u></a><br>4. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F4"><u><font color=#0000ff>设置按钮在不同状态下的底色和文字颜色</font></u></a><br>5. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F5"><u><font color=#0000ff>设置图标和文字的位置</font></u></a><br>6. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F6"><u><font color=#0000ff>根据Icon的形状设置按钮的形状</font></u></a><br>7. <a href="http://www.vckbase.com/document/viewdoc/?id=518#F7"><u><font color=#0000ff>添加Tooltips</font></u></a><br><br>以下是Basic Features的演示界面：<br><img height=325 src="http://www.vckbase.com/document/journal/vckbase17/images/CButtonST2.gif" width=486><br><a name=F1></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果一：在按钮上加入Icon，使Icon和文字同时显示 </strong><br><br>假设按钮ID为IDC_BUTTON1<br>1. 添加成员变量 </p>
<pre>CButtonST	m_btn;</pre>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br>3. 在OnInitDialog函数中初始化按钮 </p>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetFlat(FALSE);</pre>
<p>注意:为达到最好效果，请根据Icon的大小调整按钮的大小。<br>实例：演示程序中的Standar 按钮。<br><a name=F2></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果二：显示平面按钮</strong><br>只需要在效果一的基础上把m_btn.SetFlat(FALSE);语句去掉。<br><a id=F3 name=F3></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果三：使按钮上的图标可变</strong><br>假设按钮ID为IDC_BUTTON1<br>1. 添加成员变量</p>
<pre>CButtonST	m_btn;</pre>
<p>2. 添加两个Icon资源，ID设为IDI_ICON1和IDI_ICON2<br>IDI_ICON1是普通状态的图标，IDI_ICON2是按下时的图标<br><br>3. 在OnInitDialog函数中初始化按钮</p>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON2,IDI_ICON1);</pre>
<p>实例：演示程序中的Halloween 按钮。 <br><a id=F4 name=F4></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果四：设置按钮在不同状态下的底色和文字颜色</strong> <br><br>假设按钮ID为IDC_BUTTON1<br>1. 添加成员变量 </p>
<pre>CButtonST	m_btn;</pre>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br>3. 在OnInitDialog函数中初始化按钮</p>
<pre>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);</pre>
<p>提示：SetColor函数和OffsetColor函数的第一个参数表示按钮的各个状态，前景色就是文字的颜色，它们的取值表示：</p>
<pre>BTNST_COLOR_BK_IN	//鼠标放在按钮内时的背景色
BTNST_COLOR_FG_IN,	//鼠标放在按钮内时的前景色
BTNST_COLOR_BK_OUT,	//普通状态时的背景色
BTNST_COLOR_FG_OUT,	//普通状态时的前景色
BTNST_COLOR_BK_FOCUS,	//按钮被按下后的背景色
BTNST_COLOR_FG_FOCUS,	//按钮被按下后的前景色</pre>
<p>实例：演示程序中的48&#215;48 icon 按钮、Zip按钮等。<br><a id=F5 name=F5></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果五：设置图标和文字的位置</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量 </p>
<pre>CButtonST	m_btn;</pre>
<p>2.添加Icon资源，ID设为IDI_ICON1<br>3.在OnInitDialog函数中初始化按钮</p>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
</pre>
<p>提示：SetAlign函数的第一个参数表示位置信息，缺省情况下，文字在图标右边</p>
<pre>ST_ALIGN_HORIZ	// 文字在右
ST_ALIGN_VERT	//文字在下
ST_ALIGN_HORIZ_RIGHT// 文字在左
</pre>
<p>实例：演示程序中的Search 按钮。<br><a id=F6 name=F6></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果六：根据Icon的形状设置按钮的形状</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量 </p>
<pre>CButtonST	m_btn;</pre>
<p>2.添加Icon资源，设其ID设为IDI_ICON1<br>3.在OnInitDialog函数中初始化按钮</p>
<pre>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));</pre>
<p>注意:为达到最好效果，请根据Icon的大小调整按钮的大小。<br>并根据实际情况设置背景颜色。请事先将按钮的文字去掉。<br><a id=F7 name=F7></a><br><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果七：添加Tooltips</strong><br><br>假设按钮ID为IDC_BUTTON1<br>1.添加成员变量</p>
<pre>CButtonST	m_btn;</pre>
<p>2.添加Icon资源，设其ID设为IDI_ICON1<br>3. 在OnInitDialog函数中初始化按钮</p>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetTooltipText(_T("This is a tooltip.\r\nMultiline!"));</pre>
<p><br><br>&nbsp;</p>
<img src ="http://www.cppblog.com/finehai/aggbug/90324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-17 12:41 <a href="http://www.cppblog.com/finehai/archive/2009/07/17/90324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[VS]添加消息时：the code element is read only</title><link>http://www.cppblog.com/finehai/archive/2009/07/17/90323.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Fri, 17 Jul 2009 04:40:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/17/90323.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90323.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/17/90323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90323.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90323.html</trackback:ping><description><![CDATA[<p>在VS2005上使用C++开发遇到的一个问题：通过MFC添加消息/事件，产生错误提示"<span style="COLOR: #3366ff">无法执行添加/移除操作,因为代码元素是只读的</span>"。</p>
<p>查了很多资料，也试了很多办法，都解决不了。目前只能通过手动添加，这实在不是好办法。&nbsp;</p>
<p>下面是网上收集的解决办法，解决方案：<br>1、重启VC/VS2005;</p>
<p>2、打开Resource.h文件看看，有些定义重复了，可以手动改掉，保存，编辑器重新加载;</p>
<p>3、关闭解决方案，删除ncb文件重新添加即可;（这个试过，是可以的）</p>
<p>4、实在不行就手动添加消息处理;</p>
<p>5、查看.h和.cpp文件的属性,有可能是只读的,修改属性后就可以了;</p>
<p>6、把你要添加事件的对话框相应的类文件（*.h和*.cpp）给关了就可以了;&nbsp;&nbsp;</p>
<img src ="http://www.cppblog.com/finehai/aggbug/90323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-17 12:40 <a href="http://www.cppblog.com/finehai/archive/2009/07/17/90323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC]Web Browse</title><link>http://www.cppblog.com/finehai/archive/2009/07/17/90321.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Fri, 17 Jul 2009 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/17/90321.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90321.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/17/90321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90321.html</trackback:ping><description><![CDATA[微软的Web Browse控件使用方法，选择菜单 Project -&gt; Add to Project -&gt; Components and controls&#8230;，在弹出的对话框中选择Registered ActiveX Controls文件夹，然后选中列表中的Microfost Web 浏览控件。或者编辑对话框资源时，右键单击选择Insert ActiveX控件选项，也可以在列表中选择该控件。<br>　　主要功能：<br>　　第一：浏览网页<br>　　利用控件的Navigate接口，原型如下：<br>　　void CWebBrowser2::Navigate(LPCTSTR URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers)<br highlighted="1">　　只要第一个参数填上html文件的全<zmkey class=zoomino-searchword style="FONT-WEIGHT: bold; FLOAT: none; CURSOR: pointer; MARGIN-RIGHT: 3px; BORDER-BOTTOM: #ff6c00 2px dotted; cssFloat: none" offset="19" path="body > div:eq(0) > div:eq(3) > table:eq(2) > tbody:eq(0) > tr:eq(0) > td:eq(0) > div:eq(0) > #content:eq(0) > br:eq(5)" anchorType="previous" jQuery1247801028578="6">路径名<img class=zoominoBgImage style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0px; BACKGROUND-POSITION: -18px -23px; BORDER-TOP: medium none; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: medium none; WIDTH: 12px; PADDING-TOP: 0px; BORDER-BOTTOM: medium none; HEIGHT: 14px; cssFloat: none" src="http://static.zoomino.cn/static-ox/images/blank.gif"></zmkey>（不能使用相对路径名）,其余的参数可以为NULL。<br>　　说起来这是一个很普通的功能，但是有时候灵活使用却也会收到很多意想不到的效果，比如：<br>　　&gt;&gt;美化界面：设计一张很酷的网页用这个控件显示出来可以增加界面的美感<br>　　&gt;&gt;播放音乐：在网页中播放音乐（mid或wav），同时把控件隐藏起来，则可以实现程序背景音乐的播放。示例html文件：<br>　　&lt;html&gt;<br>　　&lt;bgsound src="bksound.mid" loop="-1"&gt;<br>　　&lt;body&gt;&lt;/body&gt;<br>　　&lt;/html&gt; <br>　　&gt;&gt;播放视频：可以支持asf和mpeg格式<br>　　&gt;&gt;显示图片：利用web浏览器可以简单地显示gif、jpeg、bmp等图片。示例html文件<br>　　&lt;html&gt;<br>　　&lt;body&gt;&lt;img src="image.jpg"&gt;&lt;/body&gt;<br>　　&lt;/html&gt;<br highlighted="1">　　&gt;&gt;浏览doc文档、<zmkey class=zoomino-searchword style="FONT-WEIGHT: bold; FLOAT: none; CURSOR: pointer; MARGIN-RIGHT: 3px; BORDER-BOTTOM: #ff6c00 2px dotted; cssFloat: none" offset="12" path="body > div:eq(0) > div:eq(3) > table:eq(2) > tbody:eq(0) > tr:eq(0) > td:eq(0) > div:eq(0) > #content:eq(0) > br:eq(18)" anchorType="previous" jQuery1247801028578="7">pdf文件<img class=zoominoBgImage style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0px; BACKGROUND-POSITION: -18px -23px; BORDER-TOP: medium none; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: medium none; WIDTH: 12px; PADDING-TOP: 0px; BORDER-BOTTOM: medium none; HEIGHT: 14px; cssFloat: none" height=1 src="http://static.zoomino.cn/static-ox/images/blank.gif" width=1></zmkey>：利用控件的Navigate接口，可以浏览word文档和pdf文件，只要第一参数填上文件的全路径名，后面的参数都可以为NULL<br>　　第二：打印<br>　　通过控件的ExecWB接口可以将控件中显示的内容打印出来，并且能够很简单地实现打印预览，和纸张大小设置。<br>　　//m_WebBrowse为控件对应的变量<br>　　m_WebBrowse.ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER,NULL,NULL); //打印<br>　　//使用OLECMDEXECOPT_PROMPTUSER参数则打印之前会弹出对话框，让用户选择打印机、页面布局等设置，使<br>　　//用OLECMDEXECOPT_DONTPROMPTUSER则不会弹出<br>　　m_ WebBrowse.ExecWB(OLECMDID_PRINTPREVIEW,OLECMDEXECOPT_DONTPROMPTUSER,NULL,NULL); //打印预览<br>　　m_ WebBrowse.ExecWB(OLECMDID_PAGESETUP,OLECMDEXECOPT_PROMPTUSER,NULL,NULL); //纸张尺寸设置<br>　　第三：截获提交的数据，进一步还可以使用DHTML显示提交的数据<br>　　实现这些功能主要通过修改控件对消息BeforeNavigate2的处理，原型如下：<br>　　OnBeforeNavigate2Explorer1( //该函数在HTML的连接前调用<br>　　 LPDISPATCH pDisp,<br>　　 VARIANT FAR* URL, //准备浏览的URL，修改它可以实现转向<br>　　 VARIANT FAR* Flags,<br>　　 VARIANT FAR* TargetFrameName,<br>　　 VARIANT FAR* PostData,<br>　　 VARIANT FAR* Headers,<br>　　 BOOL FAR* Cancel)//TRUE：停止 FALSE：继续
<img src ="http://www.cppblog.com/finehai/aggbug/90321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-17 12:38 <a href="http://www.cppblog.com/finehai/archive/2009/07/17/90321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MFC]CComboBox基本用法</title><link>http://www.cppblog.com/finehai/archive/2009/07/16/90257.html</link><dc:creator>Bluesea</dc:creator><author>Bluesea</author><pubDate>Thu, 16 Jul 2009 09:33:00 GMT</pubDate><guid>http://www.cppblog.com/finehai/archive/2009/07/16/90257.html</guid><wfw:comment>http://www.cppblog.com/finehai/comments/90257.html</wfw:comment><comments>http://www.cppblog.com/finehai/archive/2009/07/16/90257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/finehai/comments/commentRss/90257.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/finehai/services/trackbacks/90257.html</trackback:ping><description><![CDATA[<p>以下代码主要总结了对组合框添加下拉选项、选择某一选项的基本应用。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">&nbsp;&nbsp; <img style="WIDTH: 0px; HEIGHT: 1px" height=1 src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" width=0 align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CNewcomCosScriptView::DoDataExchange(CDataExchange</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pDX)<br><img id=Codehighlighter1_62_134_Open_Image onclick="this.style.display='none'; Codehighlighter1_62_134_Open_Text.style.display='none'; Codehighlighter1_62_134_Closed_Image.style.display='inline'; Codehighlighter1_62_134_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_62_134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_134_Closed_Text.style.display='none'; Codehighlighter1_62_134_Open_Image.style.display='inline'; Codehighlighter1_62_134_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_62_134_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_62_134_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CFormView::DoDataExchange(pDX);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DDX_Control(pDX,&nbsp;IDC_Card,&nbsp;m_card);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加ComboBox下拉选项<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ComboBox属性设置中有个sort选项，若为True则按首字母顺序添加，为False则每次添加到列表最后</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CNewcomCosScriptView::OnCbnDropdownCard()<br><img id=Codehighlighter1_258_337_Open_Image onclick="this.style.display='none'; Codehighlighter1_258_337_Open_Text.style.display='none'; Codehighlighter1_258_337_Closed_Image.style.display='inline'; Codehighlighter1_258_337_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_258_337_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_258_337_Closed_Text.style.display='none'; Codehighlighter1_258_337_Open_Image.style.display='inline'; Codehighlighter1_258_337_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_258_337_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_258_337_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_card.ResetContent();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_card.AddString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SD</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_card.AddString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">PCSC</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">选择ComboBox选项</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CNewcomCosScriptView::OnCbnSelchangeCard()<br><img id=Codehighlighter1_403_825_Open_Image onclick="this.style.display='none'; Codehighlighter1_403_825_Open_Text.style.display='none'; Codehighlighter1_403_825_Closed_Image.style.display='inline'; Codehighlighter1_403_825_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_403_825_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_403_825_Closed_Text.style.display='none'; Codehighlighter1_403_825_Open_Image.style.display='inline'; Codehighlighter1_403_825_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_403_825_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_403_825_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;UpdateData(FALSE);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_card.GetCount();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取ComboBox中元素个数<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;int&nbsp;nTmp&nbsp;=&nbsp;m_card.SetCurSel(nCount&nbsp;-&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置当前选项为最后一个元素&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取ComboBox的当前值</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iPos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_card.GetCurSel();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">当前选中的元素索引</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;str;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_card.GetLBText(m_card.GetCurSel(),str);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><span style="COLOR: #008000">当前选中的字符串</span></span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pa&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)((LPCTSTR)str);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">三种判断均可：<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;if(!strcmp(pa,"SD"))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(str&nbsp;==&nbsp;"SD")</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_783_792_Open_Image onclick="this.style.display='none'; Codehighlighter1_783_792_Open_Text.style.display='none'; Codehighlighter1_783_792_Closed_Image.style.display='inline'; Codehighlighter1_783_792_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_783_792_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_783_792_Closed_Text.style.display='none'; Codehighlighter1_783_792_Open_Image.style.display='inline'; Codehighlighter1_783_792_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(iPos&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_783_792_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_783_792_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_814_823_Open_Image onclick="this.style.display='none'; Codehighlighter1_814_823_Open_Text.style.display='none'; Codehighlighter1_814_823_Closed_Image.style.display='inline'; Codehighlighter1_814_823_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_814_823_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_814_823_Closed_Text.style.display='none'; Codehighlighter1_814_823_Open_Image.style.display='inline'; Codehighlighter1_814_823_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(iPos&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_814_823_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_814_823_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/finehai/aggbug/90257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/finehai/" target="_blank">Bluesea</a> 2009-07-16 17:33 <a href="http://www.cppblog.com/finehai/archive/2009/07/16/90257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>