﻿<?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++博客-Mumoo-随笔分类-C++</title><link>http://www.cppblog.com/Mumoo/category/19432.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 18 Nov 2013 11:04:38 GMT</lastBuildDate><pubDate>Mon, 18 Nov 2013 11:04:38 GMT</pubDate><ttl>60</ttl><item><title>禁止ListCtrl表头拖动</title><link>http://www.cppblog.com/Mumoo/archive/2013/11/18/204301.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 18 Nov 2013 01:33:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/11/18/204301.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/204301.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/11/18/204301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/204301.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/204301.html</trackback:ping><description><![CDATA[<p><span style="color: red">转载~~~~~~~~~~~~源地址忘记了~~~~~~</span><br />禁止ListCtrl表头拖动（Prevent CListCtrl column resizing）<br />/*The header control in the ListView control sends notification to the parent window (e.i. the ListView) before it begins resizing a column. We can override the OnNotify() function in the CListCtrl derived class to handle this notification. The code below prevents resizing of all columns. Note that the resize cursor still shows up. */<br />BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) <br />{ <br />switch (((NMHDR*)lParam)-&gt;code) <br />{ <br />case HDN_BEGINTRACKW: <br />case HDN_BEGINTRACKA: <br />*pResult = TRUE; // disable tracking <br />return TRUE; // Processed message <br />} </p>
<p>return CListCtrl::OnNotify(wParam, lParam, pResult); <br />}&nbsp;&nbsp; <br />/*<br />If you want to prevent resizing of only one column, you should check for the value in iItem field of the HD_NOTIFY structure. The code below stops only the first column from being resized. */</p>
<p>BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) <br />{ <br />HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam; </p>
<p>if((pHDN-&gt;hdr.code == HDN_BEGINTRACKW || pHDN-&gt;hdr.code == HDN_BEGINTRACKA) <br />&amp;&amp; pHDN-&gt;iItem == 0) // Prevent only first (col# 0) from resizing <br />{ <br />*pResult = TRUE; // disable tracking <br />return TRUE; // Processed message <br />} </p>
<p>return CListCtrl::OnNotify(wParam, lParam, pResult); <br />}&nbsp; </p><img src ="http://www.cppblog.com/Mumoo/aggbug/204301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-11-18 09:33 <a href="http://www.cppblog.com/Mumoo/archive/2013/11/18/204301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CStdioFile用法 随笔</title><link>http://www.cppblog.com/Mumoo/archive/2013/10/23/203883.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Wed, 23 Oct 2013 01:56:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/10/23/203883.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/203883.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/10/23/203883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/203883.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/203883.html</trackback:ping><description><![CDATA[<p><span style="color: red"><strong>向已存在的文件中插入首行</strong></span><br />BOOL AddTitleColumn(CString &amp;sTxtFile)<br />{<br />&nbsp;CStdioFile stdFile;<br />&nbsp;if ( stdFile.Open(sTxtFile,&nbsp; CFile::modeCreate | CFile::modeNoTruncate <br />&nbsp;&nbsp;| CFile::modeReadWrite|CFile::shareExclusive) )<br />&nbsp;{<br />&nbsp;&nbsp;CIni ini(CCommonFun::GetExecutablePath() +"Config.ini");<br />&nbsp;&nbsp;CString sTitleRow = ini.GetString("ListCtrl", "ViewColumName");</p>
<p>&nbsp;&nbsp;CStringArray arrLines;<br />&nbsp;&nbsp;arrLines.Add(sTitleRow);</p>
<p>&nbsp;&nbsp;stdFile.SeekToBegin();<br />&nbsp;&nbsp;CString str;<br />&nbsp;&nbsp;while(stdFile.ReadString(str))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;arrLines.Add(str);<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;stdFile.SeekToBegin();<br />&nbsp;&nbsp;int nCount = arrLines.GetSize();<br />&nbsp;&nbsp;for ( int i = 0; i &lt; nCount; i++ )<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;CString sContent;<br />&nbsp;&nbsp;&nbsp;if (i &gt; 0)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;sContent.Format("%d,%s", i, arrLines[i]);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;sContent = arrLines[i];<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;stdFile.WriteString (sContent);<br />&nbsp;&nbsp;&nbsp;stdFile.WriteString ("\n");<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;stdFile.Close();<br />&nbsp;&nbsp;return TRUE;<br />&nbsp;}<br />&nbsp;return FALSE;<br />}<br /><br /><span style="color: red"><strong>生成一个带标题的文件</strong></span><br /></p>
<p>BOOL CBarView::ExportDataFile(CString sDataFile/*, CStringArray &amp;arsWriteString*/)<br />{<br />&nbsp;CStdioFile stdFile;<br />&nbsp;if ( stdFile.Open(sDataFile,&nbsp; CFile::modeCreate | CFile::modeNoTruncate <br />&nbsp;&nbsp;| CFile::modeReadWrite|CFile::shareExclusive) )<br />&nbsp;{<br />&nbsp;&nbsp;CString sTitleRow =&nbsp;"序号,文件名,份数,页数";<br />&nbsp;&nbsp;stdFile.WriteString (sTitleRow);<br />&nbsp;&nbsp;stdFile.WriteString ("\n");</p>
<p>&nbsp;&nbsp;for (int i = 0; i &lt; (int)m_data.data.size(); i++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;CString sLineData;<br />&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; (int)m_data.data.at(i).size(); j++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;CString sData = m_data.data.at(i).at(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;if (j != 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sData.Format(", %s", sData);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sData.Format("%s", sData);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;sLineData += sData;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;CString sLine;<br />&nbsp;&nbsp;&nbsp;sLine.Format("%d, %s", (i+1), sLineData);<br />&nbsp;&nbsp;&nbsp;stdFile.WriteString (sLine);<br />&nbsp;&nbsp;&nbsp;stdFile.WriteString ("\n");<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;stdFile.Close();<br />&nbsp;&nbsp;return TRUE;<br />&nbsp;}</p>
<p>&nbsp;LOG("创建文件 %s 失败", sDataFile);<br />&nbsp;return FALSE;<br />}</p><img src ="http://www.cppblog.com/Mumoo/aggbug/203883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-10-23 09:56 <a href="http://www.cppblog.com/Mumoo/archive/2013/10/23/203883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListCtrl Relate</title><link>http://www.cppblog.com/Mumoo/archive/2013/10/10/203631.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Thu, 10 Oct 2013 02:51:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/10/10/203631.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/203631.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/10/10/203631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/203631.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/203631.html</trackback:ping><description><![CDATA[获取总列数：int columns = m_listCtrl-&gt;GetHeaderCtrl()-&gt;GetItemCount();<br />删除所有列数：while(m_listCtrl-&gt;DeleteColumn(0));<img src ="http://www.cppblog.com/Mumoo/aggbug/203631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-10-10 10:51 <a href="http://www.cppblog.com/Mumoo/archive/2013/10/10/203631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListCtrl控件方法</title><link>http://www.cppblog.com/Mumoo/archive/2013/04/15/199461.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 15 Apr 2013 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/04/15/199461.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/199461.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/04/15/199461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/199461.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/199461.html</trackback:ping><description><![CDATA[<div id="content" class="content mod-cs-content text-content clearfix" sizset="0" sizcache03751642967829892="1">
<p>在网上查找的ListCtrl方法<br /></p>
<p>以下未经说明，<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>默认<span style="line-height: 1.3em">view</span><wbr><wbr><wbr><wbr>风格为<span style="line-height: 1.3em">report</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">-------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">1. CListCtrl </span><wbr><wbr><wbr><wbr>风格 <br /><span style="line-height: 1.3em">LVS_ICON: </span><wbr><wbr><wbr><wbr>为每个<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>显示大图标<br /><span style="line-height: 1.3em">LVS_SMALLICON: </span><wbr><wbr><wbr><wbr>为每个<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>显示小图标<br /><span style="line-height: 1.3em">LVS_LIST: </span><wbr><wbr><wbr><wbr>显示一列带有小图标的<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">LVS_REPORT: </span><wbr><wbr><wbr><wbr>显示<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>详细资料<br />直观的理解：<span style="line-height: 1.3em">windows</span><wbr><wbr><wbr><wbr>资源管理器，<span style="line-height: 1.3em">"</span><wbr><wbr><wbr><wbr>查看<span style="line-height: 1.3em">"</span><wbr><wbr><wbr><wbr>标签下的<span style="line-height: 1.3em">"</span><wbr><wbr><wbr><wbr>大图标，小图标，列表，详细资料<br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">2. </span><wbr><wbr><wbr><wbr>设置<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>风格及扩展风格 <br /><span style="line-height: 1.3em">LONG lStyle;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//</span><wbr><wbr><wbr><wbr>获取当前窗口<span style="line-height: 1.3em">style</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lStyle &amp;= ~LVS_TYPEMASK; //</span><wbr><wbr><wbr><wbr>清除显示方式位<br /><span style="line-height: 1.3em">lStyle |= LVS_REPORT; //</span><wbr><wbr><wbr><wbr>设置<span style="line-height: 1.3em">style</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//</span><wbr><wbr><wbr><wbr>设置<span style="line-height: 1.3em">style</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">DWORD dwStyle = m_list.GetExtendedStyle();</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">dwStyle |= LVS_EX_FULLROWSELECT;//</span><wbr><wbr><wbr><wbr>选中某行使整行高亮（只适用与<span style="line-height: 1.3em">report</span><wbr><wbr><wbr><wbr>风格的<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>）<br /><span style="line-height: 1.3em">dwStyle |= LVS_EX_GRIDLINES;//</span><wbr><wbr><wbr><wbr>网格线（只适用与<span style="line-height: 1.3em">report</span><wbr><wbr><wbr><wbr>风格的<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>）<br /><span style="line-height: 1.3em">dwStyle |= LVS_EX_CHECKBOXES;//item</span><wbr><wbr><wbr><wbr>前生成<span style="line-height: 1.3em">checkbox</span><wbr><wbr><wbr><wbr>控件<br /><span style="line-height: 1.3em">m_list.SetExtendedStyle(dwStyle); //</span><wbr><wbr><wbr><wbr>设置扩展风格<br />注：<span style="line-height: 1.3em">listview</span><wbr><wbr><wbr><wbr>的<span style="line-height: 1.3em">style</span><wbr><wbr><wbr><wbr>请查阅<span style="line-height: 1.3em">msdn </span><wbr><wbr><wbr><wbr><br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp" target="_blank"><span style="line-height: 1.3em; color: rgb(0,0,0)">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp</span><wbr><wbr><wbr><wbr></a><wbr><wbr><wbr><wbr><span style="color: rgb(0,0,0)"><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">3. </span><wbr><wbr><wbr><wbr>插入数据 <br /><span style="line-height: 1.3em">m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//</span><wbr><wbr><wbr><wbr>插入列<br /><span style="line-height: 1.3em">m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );</span><wbr><wbr><wbr><wbr></span></p>
<p><span style="color: rgb(0,0,0)">//新插入的在上面<br /><span style="line-height: 1.3em">int nRow = m_list.InsertItem(0, "11");// </span><wbr><wbr><wbr><wbr>插入行<br /><span style="line-height: 1.3em">m_list.SetItemText(nRow, 1, "jacky");//</span><wbr><wbr><wbr><wbr>设置其它列数据</span></p>
<p><span style="color: rgb(0,0,0)">//新插入的数据在下面</span></p>
<p><span style="color: rgb(0,0,0)">int nIndex = m_list.GetItemCount();<br />LV_ITEM lvItem;<br />lvItem.mask = LVIF_TEXT ; <br />lvItem.iItem = nIndex; //行数<br />lvItem.iSubItem = 0;<br />lvItem.pszText = (char*)(LPCTSTR)strCount; //第一列<br />//在最后一行插入记录值.<br />m_list.InsertItem(&amp;lvItem); <br />//插入其它列<br />m_list.SetItemText(nIndex,1,strLat);</span><span style="color: rgb(0,0,0)"><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">4. </span><wbr><wbr><wbr><wbr>一直选中<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr><br />选中<span style="line-height: 1.3em">style</span><wbr><wbr><wbr><wbr>中的<span style="line-height: 1.3em">Show selection always</span><wbr><wbr><wbr><wbr>，或者在上面第<span style="line-height: 1.3em">2</span><wbr><wbr><wbr><wbr>点中设置<span style="line-height: 1.3em">LVS_SHOWSELALWAYS</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">5. </span><wbr><wbr><wbr><wbr>选中和取消选中一行 <br /><span style="line-height: 1.3em">int nIndex = 0;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">//</span><wbr><wbr><wbr><wbr>选中 <br /><span style="line-height: 1.3em">m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">//</span><wbr><wbr><wbr><wbr>取消选中 <br /><span style="line-height: 1.3em">m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">6. </span><wbr><wbr><wbr><wbr>得到<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>中所有行的<span style="line-height: 1.3em">checkbox</span><wbr><wbr><wbr><wbr>的状态<br /><span style="line-height: 1.3em">m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CString str;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">for(int i=0; i&lt;m_list.GetItemCount(); i++)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">str.Format(_T("</span><wbr><wbr><wbr><wbr>第<span style="line-height: 1.3em">%d</span><wbr><wbr><wbr><wbr>行的<span style="line-height: 1.3em">checkbox</span><wbr><wbr><wbr><wbr>为选中状态<span style="line-height: 1.3em">"), i);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">AfxMessageBox(str);</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">7. </span><wbr><wbr><wbr><wbr>得到<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>中所有选中行的序号<br />方法一： <br /><span style="line-height: 1.3em">CString str;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">for(int i=0; i&lt;m_list.GetItemCount(); i++)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">str.Format(_T("</span><wbr><wbr><wbr><wbr>选中了第<span style="line-height: 1.3em">%d</span><wbr><wbr><wbr><wbr>行<span style="line-height: 1.3em">"), i);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">AfxMessageBox(str);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br />方法二： <br /><span style="line-height: 1.3em">POSITION pos = m_list.GetFirstSelectedItemPosition();</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">if (pos == NULL)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">TRACE0("No items were selected!\n");</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">Else</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">while (pos)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">int nItem = m_list.GetNextSelectedItem(pos);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">TRACE1("Item %d was selected!\n", nItem);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">// you could do your own processing on nItem here</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">8. </span><wbr><wbr><wbr><wbr>得到<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>的信息<br /><span style="line-height: 1.3em">TCHAR szBuf[1024];</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">LVITEM lvi;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">lvi.iItem = nItemIndex;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvi.iSubItem = 0;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvi.mask = LVIF_TEXT;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvi.pszText = szBuf;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvi.cchTextMax = 1024;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">m_list.GetItem(&amp;lvi);</span><wbr><wbr><wbr><wbr><br />关于得到设置<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>的状态，还可以参考<span style="line-height: 1.3em">msdn</span><wbr><wbr><wbr><wbr>文章<br /><span style="line-height: 1.3em">Q173242: Use Masks to Set/Get Item States in ClistCtrl</span><wbr><wbr><wbr><wbr><br /></span><a href="http://support.microsoft.com/kb/173242/en-us" target="_blank"><span style="line-height: 1.3em; color: rgb(0,0,0)">http://support.microsoft.com/kb/173242/en-us</span><wbr><wbr><wbr><wbr></a><wbr><wbr><wbr><wbr><span style="color: rgb(0,0,0)"><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">9. </span><wbr><wbr><wbr><wbr>得到<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>的所有列的<span style="line-height: 1.3em">header</span><wbr><wbr><wbr><wbr>字符串内容<br /><span style="line-height: 1.3em">LVCOLUMN lvcol;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">char str[256];</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">int nColNum;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">CString strColumnName[4];//</span><wbr><wbr><wbr><wbr>假如有<span style="line-height: 1.3em">4</span><wbr><wbr><wbr><wbr>列<br /><span style="line-height: 1.3em">nColNum = 0;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">lvcol.mask = LVCF_TEXT;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvcol.pszText = str;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvcol.cchTextMax = 256;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">while(m_list.GetColumn(nColNum, &amp;lvcol))</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{ </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">strColumnName[nColNum] = lvcol.pszText;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">nColNum++;</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">10. </span><wbr><wbr><wbr><wbr>使<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>中一项可见，即滚动滚动条<br /><span style="line-height: 1.3em">m_list.EnsureVisible(i, FALSE);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">11. </span><wbr><wbr><wbr><wbr>得到<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>列数<br /><span style="line-height: 1.3em">int nHeadNum = m_list.GetHeaderCtrl()-&gt;GetItemCount();</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">12. </span><wbr><wbr><wbr><wbr>删除所有列 <br />方法一： <br /><span style="line-height: 1.3em">while ( m_list.DeleteColumn (0))</span><wbr><wbr><wbr><wbr><br />因为你删除了第一列后，后面的列会依次向上移动。 <br />方法二： <br /><span style="line-height: 1.3em">int nColumns = 4;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">for (int i=nColumns-1; i&gt;=0; i--)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">m_list.DeleteColumn (i);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">13. </span><wbr><wbr><wbr><wbr>得到单击的<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>的行列号<br />添加<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>控件的<span style="line-height: 1.3em">NM_CLICK</span><wbr><wbr><wbr><wbr>消息相应函数<br /><span style="line-height: 1.3em">void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">// </span><wbr><wbr><wbr><wbr>方法一： <br /><span style="line-height: 1.3em">/*</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">DWORD dwPos = GetMessagePos();</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CPoint point( LOWORD(dwPos), HIWORD(dwPos) );</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">m_list.ScreenToClient(&amp;point);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">LVHITTESTINFO lvinfo;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvinfo.pt = point;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvinfo.flags = LVHT_ABOVE;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">int nItem = m_list.SubItemHitTest(&amp;lvinfo);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">if(nItem != -1)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">CString strtemp;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">strtemp.Format("</span><wbr><wbr><wbr><wbr>单击的是第<span style="line-height: 1.3em">%d</span><wbr><wbr><wbr><wbr>行第<span style="line-height: 1.3em">%d</span><wbr><wbr><wbr><wbr>列<span style="line-height: 1.3em">", lvinfo.iItem, lvinfo.iSubItem);</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">AfxMessageBox(strtemp);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">*/</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">// </span><wbr><wbr><wbr><wbr>方法二<span style="line-height: 1.3em">:</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">/*</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">if(pNMListView-&gt;iItem != -1)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">CString strtemp;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">strtemp.Format("</span><wbr><wbr><wbr><wbr>单击的是第<span style="line-height: 1.3em">%d</span><wbr><wbr><wbr><wbr>行第<span style="line-height: 1.3em">%d</span><wbr><wbr><wbr><wbr>列<span style="line-height: 1.3em">",</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">pNMListView-&gt;iItem, pNMListView-&gt;iSubItem);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">AfxMessageBox(strtemp);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">*/</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">*pResult = 0;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">14. </span><wbr><wbr><wbr><wbr>判断是否点击在<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>的<span style="line-height: 1.3em">checkbox</span><wbr><wbr><wbr><wbr>上<br />添加<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>控件的<span style="line-height: 1.3em">NM_CLICK</span><wbr><wbr><wbr><wbr>消息相应函数<br /><span style="line-height: 1.3em">void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{ </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">DWORD dwPos = GetMessagePos();</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">m_list.ScreenToClient(&amp;point);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">LVHITTESTINFO lvinfo;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvinfo.pt = point;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">lvinfo.flags = LVHT_ABOVE;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">UINT nFlag;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">int nItem = m_list.HitTest(point, &amp;nFlag);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">//</span><wbr><wbr><wbr><wbr>判断是否点在<span style="line-height: 1.3em">checkbox</span><wbr><wbr><wbr><wbr>上<br /><span style="line-height: 1.3em">if(nFlag == LVHT_ONITEMSTATEICON)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">AfxMessageBox("</span><wbr><wbr><wbr><wbr>点在<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>的<span style="line-height: 1.3em">checkbox</span><wbr><wbr><wbr><wbr>上<span style="line-height: 1.3em">");</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">} </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">*pResult = 0;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">15. </span><wbr><wbr><wbr><wbr>右键点击<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>的<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>弹出菜单<br />添加<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>控件的<span style="line-height: 1.3em">NM_RCLICK</span><wbr><wbr><wbr><wbr>消息相应函数<br /><span style="line-height: 1.3em">void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">if(pNMListView-&gt;iItem != -1)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">DWORD dwPos = GetMessagePos();</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CPoint point( LOWORD(dwPos), HIWORD(dwPos) );</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CMenu menu;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">VERIFY( menu.LoadMenu( IDR_MENU1 ) );</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CMenu* popup = menu.GetSubMenu(0);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">ASSERT( popup != NULL ); </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">popup-&gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">} </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">*pResult = 0;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span></span></p>
<div>16. item<wbr><wbr><wbr><wbr>切换焦点时<span style="line-height: 1.3em">(</span><wbr><wbr><wbr><wbr>包括用键盘和鼠标切换<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>时<span style="line-height: 1.3em">)</span><wbr><wbr><wbr><wbr>，状态的一些变化顺序<br />添加<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>控件的<span style="line-height: 1.3em">LVN_ITEMCHANGED</span><wbr><wbr><wbr><wbr>消息相应函数<br /><span style="line-height: 1.3em">void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">// TODO: Add your control notification handler code here</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">CString sTemp;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == LVIS_FOCUSED &amp;&amp; (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == 0)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">sTemp.Format("%d losted focus",pNMListView-&gt;iItem);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">else if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == 0 &amp;&amp;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">(pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == LVIS_FOCUSED)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">sTemp.Format("%d got focus",pNMListView-&gt;iItem);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">} </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == LVIS_SELECTED &amp;&amp;</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">(pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == 0)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">sTemp.Format("%d losted selected",pNMListView-&gt;iItem);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">else if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == 0 &amp;&amp; (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == LVIS_SELECTED)</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">{</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">sTemp.Format("%d got selected",pNMListView-&gt;iItem);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">}</span><wbr><wbr><wbr><wbr> <br /><span style="line-height: 1.3em">*pResult = 0; </span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">17. </span><wbr><wbr><wbr><wbr>得到另一个进程里的<span style="line-height: 1.3em">listctrl</span><wbr><wbr><wbr><wbr>控件的<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr>内容<br /><a href="http://www.codeproject.com/threads/int64_memsteal.asp" target="_blank"><span style="line-height: 1.3em; color: rgb(0,0,0)">http://www.codeproject.com/threads/int64_memsteal.asp</span><wbr><wbr><wbr><wbr></a><wbr><wbr><wbr><wbr><span style="color: rgb(0,0,0)"><br /><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">18. </span><wbr><wbr><wbr><wbr>选中<span style="line-height: 1.3em">listview</span><wbr><wbr><wbr><wbr>中的<span style="line-height: 1.3em">item</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">Q131284: How To Select a Listview Item Programmatically</span><wbr><wbr><wbr><wbr><br /></span><a href="http://support.microsoft.com/kb/131284/en-us" target="_blank"><span style="line-height: 1.3em; color: rgb(0,0,0)">http://support.microsoft.com/kb/131284/en-us</span><wbr><wbr><wbr><wbr></a><wbr><wbr><wbr><wbr><span style="color: rgb(0,0,0)"><br /><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">19. </span><wbr><wbr><wbr><wbr>如何在<span style="line-height: 1.3em">CListView</span><wbr><wbr><wbr><wbr>中使用<span style="line-height: 1.3em">CListCtrl</span><wbr><wbr><wbr><wbr>的派生类<br /></span><a href="http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/" target="_blank"><span style="line-height: 1.3em; color: rgb(0,0,0)">http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/</span><wbr><wbr><wbr><wbr></a><wbr><wbr><wbr><wbr><span style="color: rgb(0,0,0)"><br /><br /><span style="line-height: 1.3em">--------------------------------------------------------------------------------</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">20. listctrl</span><wbr><wbr><wbr><wbr>的<span style="line-height: 1.3em">subitem</span><wbr><wbr><wbr><wbr>添加图标<br /><span style="line-height: 1.3em">m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);</span><wbr><wbr><wbr><wbr><br /><span style="line-height: 1.3em">m_list.SetItem(..); //</span><wbr><wbr><wbr><wbr>具体参数请参考<span style="line-height: 1.3em">msdn</span><wbr><wbr><wbr><wbr><br /></span></div>
<p><br />} </p>
<p>str.Format("你双击了:%d行，%d列",pList-&gt;iItem,pList-&gt;iSubItem);<br />MessageBox(str);<br /><br />*pResult = 0;<br />}</p>
<p><br />常用操作：<br />1、添加列标题头：InsertColumn<br />2、获取与设置列宽：GetColumnWidth、SetColumnWidth<br />3、添加一行：InsertItem、SetItemText<br />4、获取与设置单元文本：GetItemText、SetItemText<br />5、允许多行选中时，获取选中的行数：GetSelectedCount<br />6、单行选中时，获取选中的行：GetSelectionMark<br />7、选中某行：SetItemState(n, LVIS_SELECTED, LVIS_SELECTED);取消选中的行SetItemState(n,0,-1);使用此函数前需要先调用SetFocus();<br />8、获取某行的状态是否为选中：GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED<br />9、删除所有行：DeleteAllItems<br />10、删除指定列：DeleteColumn<br />11、删除指定行：DeleteItem<br />12、获取与设置列表控件的背景色：GetBkColor、SetBkColor<br />13、获取与设置文字背景色：GetTextBkColor、SetTextBkColor<br />14、获取与设置文字前景色：GetTextColor、SetTextColor<br />15、获取与设置Check：GetCheck、SetCheck,使用前需要设置控件属性SetExtendedStyle(LVS_EX_CHECKBOXES);使控件有勾选功能<br />16、获取与设置图标列表：GetImageList、SetImageList<br />17、获取与设置行附加数据：GetItemData、SetItemData<br />18、获取与设置扩展风格样式：GetExtendedStyle、SetExtendedStyle<br />19、设置正行选中与网格线：SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);<br />20、让ListCtrl支持编辑的功能：<br />&#9312;、将属性中的 Edit Labels 设置为 True；<br />&#9313;、响应控件的 LVN_EDNLABELEDIT 消息，添加如下代码：<br />CString strText;<br />m_ListCtrl.GetEditControl()-&gt;GetWindowText(strText);<br />m_ListCtrl.SetItemText(pDispInfo-&gt;item.iItem, pDispInfo-&gt;item.iSubItem, strText);</p>
<p>21、多行可选时，跳到第一个被选中的行，即使第一个被选中的行可视。</p>
<p>POSITION pos = pView-&gt;GetListCtrl().GetFirstSelectedItemPosition();<br />int nFirstSel = pView-&gt;GetListCtrl().GetNextSelectedItem(pos);<br />if (nFirstSel != -1)<br />{<br />pView-&gt;GetListCtrl().EnsureVisible(nFirstSel,FALSE);<br />} </p>
<p>&nbsp;</p>
<p>列表中添加图标代码：</p>
<p>UINT nIconID[] = {IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4,IDI_ICON5};//图标ID<br />m_ImageList.Create(16,16,ILC_COLOR24,sizeof(nIconID)/sizeof(UINT),0);//初始化CImageList类，sizeof(nIconID)/sizeof(UINT)为图标个数，后面的0表示CImageList在sizeof(nIconID)/sizeof(UINT)个图标个数的基础上可再添加多少个图标。<br />m_ImageList.SetBkColor(RGB(255,255,255));//设置背景色为白色<br />for(int i = 0; i &lt; sizeof(nIconID)/sizeof(UINT); i++)<br />{<br />m_ImageList.Add(AfxGetApp()-&gt;LoadIcon(nIconID[i]));//将图标添加到CImageList<br />}<br />m_ListCtrl.SetImageList(&amp;m_ImageList,LVSIL_SMALL);//设置列表控件显示图标</p>
<p>m_ListCtrl.InsertColumn(0,_T("第1列"),0,100);<br />m_ListCtrl.InsertColumn(1,_T("第2列"),0,100);<br />m_ListCtrl.InsertColumn(2,_T("第3列"),0,100);<br />m_ListCtrl.InsertItem(0,_T("数据1"),0);//后面的0表示添加CImageList中的第0个图标<br />m_ListCtrl.InsertItem(1,_T("数据2"),1);//后面的1表示添加CImageList中的第1个图标<br />m_ListCtrl.InsertItem(2,_T("数据3"),2);<br />m_ListCtrl.SetItemText(0,1,_T("01"));<br />m_ListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);//设置控件有勾选功能<br />DWORD dwStyle = m_ListCtrl.GetExtendedStyle();<br />m_ListCtrl.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT);设置控件选中行的功能</p>
<p sizset="0" sizcache03751642967829892="1"><img alt="" src="http://hiphotos.baidu.com/cannotforget/pic/item/422a8101356914bb267fb5e3.jpg" small="0" /></p>
<p>&nbsp;</p>
<p>遍历文件夹并显示文件名与图标：</p>
<p>CFileFind fileFind;<br />CString szDir("D:\\Tools");<br />BOOL bRet = fileFind.FindFile(szDir+"\\*.*");<br />while(bRet)<br />{<br />bRet = fileFind.FindNextFile();<br />if(fileFind.IsDots())<br />continue;<br />if(!fileFind.IsDirectory())<br />{<br />SHFILEINFO shfi;<br />SHGetFileInfo(fileFind.GetFilePath(),FILE_ATTRIBUTE_NORMAL,&amp;shfi,sizeof(shfi),SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);<br />int nImageID = m_ImageList.Add(shfi.hIcon);<br />m_ListCtrl.InsertItem(m_ListCtrl.GetItemCount(),fileFind.GetFileName(),nImageID);<br />}<br />}</p>
<p sizset="1" sizcache03751642967829892="1"><img alt="" src="http://hiphotos.baidu.com/cannotforget/pic/item/a8b4b4b73a02959930add121.jpg" small="0" /></p>
<p>&nbsp;</p>
<p><strong>复制列表内容<br /></strong></p>
<p>void CXXXView::OnCopydataToClipboard() <br />{<br />int nSelectCount = GetListCtrl().GetSelectedCount();<br />int nSelect = -1;<br />CString strData = _T("");<br />for (int i = 0; i &lt; nSelectCount; i++)<br />{<br />//找到选择的行号<br />nSelect = GetListCtrl().GetNextItem(nSelect,LVNI_ALL | LVNI_SELECTED);<br />//列数<br />int nColumnCount = GetListCtrl().GetHeaderCtrl()-&gt;GetItemCount();<br />for (int j = 0; j &lt; nColumnCount; j++)<br />{<br />CString text;<br />text = GetListCtrl().GetItemText(nSelect,j);<br />if (j != 0)<br />strData += "\t";<br />strData += text;<br />}<br />//用\r\n来控制回车和换行<br />if (i != nSelectCount - 1)<br />strData += "\r\n";<br />}<br /><br />//复制到剪贴板<br />HGLOBAL clipbordBuf = GlobalAlloc(GMEM_DDESHARE,2*(strData.GetLength() + 1));<br />TCHAR *pBuf = (TCHAR*)GlobalLock(clipbordBuf);<br />lstrcpy((LPTSTR)pBuf,(LPCTSTR)strData);<br />GlobalUnlock(clipbordBuf);</p>
<p>OpenClipboard();<br />EmptyClipboard();<br />SetClipboardData(CF_TEXT,pBuf);<br />CloseClipboard();<br />}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>在非第一列中添加图标</strong></p>
<p>m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES);</p>
<p>&nbsp;</p>
<p>m_List.SetItem(0,1,LVIF_TEXT|LVIF_IMAGE,&#8220;aaa&#8221;,0,0,0,0);//在第一行第二列加入第1个图标</p>
<p>m_List.SetItem(i,1,LVIF_TEXT|LVIF_IMAGE,szBuffer,i,0,0,0);</p>
<p sizset="2" sizcache03751642967829892="1"><img alt="" src="http://hiphotos.baidu.com/cannotforget/pic/item/921164d0f703918ffeacd275513d269758eec4c3.jpg" small="0" /><br /></p></div><img src ="http://www.cppblog.com/Mumoo/aggbug/199461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-04-15 17:20 <a href="http://www.cppblog.com/Mumoo/archive/2013/04/15/199461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CStringList用法</title><link>http://www.cppblog.com/Mumoo/archive/2013/04/15/199460.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 15 Apr 2013 08:28:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/04/15/199460.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/199460.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/04/15/199460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/199460.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/199460.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div class="para">CStringList类成员</div>
<div class="para">构造</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="231" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="232">
<tr sizcache0721622997495204="1" sizset="233">
<td width="100" sizcache0721622997495204="1" sizset="234">
<div class="para" sizcache0721622997495204="1" sizset="235"><a href="http://baike.baidu.com/view/2962181.htm" target="_blank">CStringList</a> </div>
<td width="500" align="left" sizcache0721622997495204="1" sizset="237">构造一个空的CString对象列表 
<div></div></td></tr></tbody></table></p>
<div class="para">首/尾访问</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="240" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="241">
<tr sizcache0721622997495204="1" sizset="242">
<td width="100" sizcache0721622997495204="1" sizset="243">
<div class="para">GetHead </div>
<td width="500" align="left">返回此列表（不能是空的）中头部的元素 
<tr sizcache0721622997495204="1" sizset="246">
<td width="100">GetTail 
<td width="500" align="left" sizcache0721622997495204="1" sizset="248">返回此列表（不能是空的）中尾部的元素 
<div></div></td></tr></tbody></table></p>
<div class="para">操作</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="251" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="252">
<tr sizcache0721622997495204="1" sizset="253">
<td width="100" sizcache0721622997495204="1" sizset="254">
<div class="para">RemoveHead </div>
<td width="500" align="left">从列表的头部删除元素 
<tr sizcache0721622997495204="1" sizset="257">
<td width="100">RemoveTail 
<td width="500" align="left">从列表的尾部删除元素 
<tr sizcache0721622997495204="1" sizset="260">
<td width="100">AddHead 
<td width="500" align="left">在列表的头部添加一个元素（或者是另一个列表中的所有元素），即产生一个新的头部 
<tr sizcache0721622997495204="1" sizset="263">
<td width="100">AddTail 
<td width="500" align="left">在列表的尾部添加一个元素（或者是另一个列表中的所有元素），即产生一个新的尾部 
<tr sizcache0721622997495204="1" sizset="266">
<td width="100" sizcache0721622997495204="1" sizset="267"><a href="http://baike.baidu.com/view/1229958.htm" target="_blank">RemoveAll</a> 
<td width="500" align="left" sizcache0721622997495204="1" sizset="269">删除此列表中的所有元素 
<div></div></td></tr></tbody></table></p>
<div class="para">重复</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="272" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="273">
<tr sizcache0721622997495204="1" sizset="274">
<td width="100" sizcache0721622997495204="1" sizset="275">
<div class="para">GetHeadPosition </div>
<td width="500" align="left">返回列表中的头部元素的位置 
<tr sizcache0721622997495204="1" sizset="278">
<td width="100">GetTailPosition 
<td width="500" align="left">返回列表中尾部元素的位置 
<tr sizcache0721622997495204="1" sizset="281">
<td width="100">GetNext 
<td width="500" align="left">获取用于重复的下一个元素 
<tr sizcache0721622997495204="1" sizset="284">
<td width="100">GetPrev 
<td width="500" align="left" sizcache0721622997495204="1" sizset="286">获取用于重复的前一个元素 
<div></div></td></tr></tbody></table></p>
<div class="para">获取/修改</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="289" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="290">
<tr sizcache0721622997495204="1" sizset="291">
<td width="100" sizcache0721622997495204="1" sizset="292">
<div class="para" sizcache0721622997495204="1" sizset="293"><a href="http://baike.baidu.com/view/4729285.htm" target="_blank">GetAt</a> </div>
<td width="500" align="left">获取给定位置处的元素 
<tr sizcache0721622997495204="1" sizset="296">
<td width="100">SetAt 
<td width="500" align="left">设置给定位置处的元素 
<tr sizcache0721622997495204="1" sizset="299">
<td width="100">RemoveAt 
<td width="500" align="left" sizcache0721622997495204="1" sizset="301">从此列表中删除由位置指定的一个元素 
<div></div></td></tr></tbody></table></p>
<div class="para">插入</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="304" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="305">
<tr sizcache0721622997495204="1" sizset="306">
<td width="100" sizcache0721622997495204="1" sizset="307">
<div class="para">InsertBefore </div>
<td width="500" align="left">在一个给定位置之前插入一个新元素 
<tr sizcache0721622997495204="1" sizset="310">
<td width="100">InsertAfter 
<td width="500" align="left" sizcache0721622997495204="1" sizset="312">在一个给定位置之后插入一个新元素 
<div></div></td></tr></tbody></table></p>
<div class="para">搜索</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="315" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="316">
<tr sizcache0721622997495204="1" sizset="317">
<td width="100" sizcache0721622997495204="1" sizset="318">
<div class="para" sizcache0721622997495204="1" sizset="319"><a href="http://baike.baidu.com/view/801452.htm" target="_blank">Find</a> </div>
<td width="500" align="left">获取由字符串值指定的元素的位置 
<tr sizcache0721622997495204="1" sizset="322">
<td width="100">FindIndex 
<td width="500" align="left" sizcache0721622997495204="1" sizset="324">获取由一个从零开始的索引指定的元素的位置 
<div></div></td></tr></tbody></table></p>
<div class="para">状态</div>
<p>
<table class="table-view log-set-param" sizcache0721622997495204="1" sizset="327" log-set-param="table_view">
<tbody sizcache0721622997495204="1" sizset="328">
<tr sizcache0721622997495204="1" sizset="329">
<td width="100" sizcache0721622997495204="1" sizset="330">
<div class="para" sizcache0721622997495204="1" sizset="331"><a href="http://baike.baidu.com/view/9588697.htm" target="_blank">GetCount</a> </div>
<td width="500" align="left">返回此列表中的元素个数 
<tr sizcache0721622997495204="1" sizset="334">
<td width="100" sizcache0721622997495204="1" sizset="335"><a href="http://baike.baidu.com/view/1229891.htm" target="_blank">IsEmpty</a> 
<td width="500" align="left" sizcache0721622997495204="1" sizset="337">测试列表是否为空（没有元素）</td></tr></tbody></table><br />CStringList是CString链表，在MFC编程中STL之外的另一选择，用起来更加简洁.</p>
<p>插入数据：AddTail（）;AddHead()</p>
<p>删除数据：RemoveAll();RemoveAt();RemoveHead();RemoveTail()</p>
<p>取得元素个数：GetCount()</p>
<p>取得某个元素值：GetAt(cstringList.FindIndex(index))//index为整数</p>
<p>取得头尾元素：GetHead() ；GetTail(),</p>
<p>遍历最好用上面的方式，不要用POSITION变量，用FindIndex可以了。</p>
<p>初始化：</p>
<p>&nbsp;</p>
<p>CStringList listFileName;<br />listFileName.RemoveAll();</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>添加操作：</p>
<p>&nbsp;</p>
<p>listFileName.AddTail(szFullPathName);</p>
<p>&nbsp;</p>
<p>遍历操作：</p>
<p>&nbsp;</p>
<p>POSITION rPos;<br />rPos = listFileName.GetHeadPosition();<br />while (rPos != NULL)<br />{<br />strFileName = listFileName.GetNext(rPos);<br />strLog += "/r/n" + strFileName;<br />}</p><img src ="http://www.cppblog.com/Mumoo/aggbug/199460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-04-15 16:28 <a href="http://www.cppblog.com/Mumoo/archive/2013/04/15/199460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MessageBox提示语</title><link>http://www.cppblog.com/Mumoo/archive/2013/04/12/199374.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Fri, 12 Apr 2013 06:51:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/04/12/199374.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/199374.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/04/12/199374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/199374.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/199374.html</trackback:ping><description><![CDATA[<p>MessageBox(NULL, "警示框", "提示框", \<br />&nbsp;&nbsp;MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "信息提示框", "提示框", \<br />&nbsp;&nbsp;MB_OK|MB_ICONASTERISK|MB_SYSTEMMODAL|MB_SETFOREGROUND);<br />&nbsp;MessageBox(NULL, "信息框", "提示框", \<br />&nbsp;&nbsp;MB_OK|MB_ICONINFORMATION|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "错误框", "提示框", \<br />&nbsp;&nbsp;MB_OK|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "句柄框", "提示框", \<br />&nbsp;&nbsp;MB_OK|MB_ICONHAND|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "提问框", "提示框", \<br />&nbsp;&nbsp;MB_OKCANCEL|MB_ICONQUESTION|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "停止框", "提示框", \<br />&nbsp;&nbsp;MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "添加帮助框", "提示框", \<br />&nbsp;&nbsp;MB_HELP|MB_ICONWARNING|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "YESNO Cancel，添加默认选项", "提示框", \<br />&nbsp;&nbsp;MB_YESNOCANCEL|MB_ICONWARNING|MB_DEFBUTTON1|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "RETRYCANCEL", "提示框", \<br />&nbsp;&nbsp;MB_RETRYCANCEL|MB_ICONWARNING|MB_DEFBUTTON2|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p>
<p>&nbsp;MessageBox(NULL, "CANCELTRYCONTINUE", "提示框", \<br />&nbsp;&nbsp;MB_CANCELTRYCONTINUE|MB_ICONWARNING|MB_DEFBUTTON3|MB_SYSTEMMODAL|MB_SETFOREGROUND);</p><img src ="http://www.cppblog.com/Mumoo/aggbug/199374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-04-12 14:51 <a href="http://www.cppblog.com/Mumoo/archive/2013/04/12/199374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC Listcontrol 使用方法</title><link>http://www.cppblog.com/Mumoo/archive/2013/01/17/197332.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Thu, 17 Jan 2013 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2013/01/17/197332.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/197332.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2013/01/17/197332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/197332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/197332.html</trackback:ping><description><![CDATA[<div><span style="color: red">原文出处：</span><a href="http://blog.csdn.net/bqw2008/article/details/2047489"><span style="color: red">http://blog.csdn.net/bqw2008/article/details/2047489</span></a><br /><span class="ico ico_type_Original"></span>&nbsp;Windows ListCtrl使用技巧<br />1. ListCtrl 风格 <br />LVS_ICON: 为每个item显示大图标<br />LVS_SMALLICON: 为每个item显示小图标<br />LVS_LIST: 显示一列带有小图标的item<br />LVS_REPORT: 显示item详细资料
<div id="article_content" class="article_content">
<div class="postText">
<p>直观的理解：windows资源管理器，&#8220;查看&#8221;标签下的&#8220;大图标，小图标，列表，详细资料&#8221;<br />--------------------------------------------------------------------------------<br />2. 设置listctrl 风格及扩展风格 LONG lStyle;<br />lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style<br />lStyle &amp;= ~LVS_TYPEMASK; //清除显示方式位<br />lStyle |= LVS_REPORT; //设置style<br />SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style<br /><br />DWORD dwStyle = m_list.GetExtendedStyle();<br />dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮（只适用与report风格的listctrl）<br />dwStyle |= LVS_EX_GRIDLINES;//网格线（只适用与report风格的listctrl）<br />dwStyle |= LVS_EX_<font style="background-color: yellow" color="red">CHECKBOXES</font>;//item前生成checkbox控件<br />m_list.SetExtendedStyle(dwStyle); //设置扩展风格<br /><br />注：listview的style请查阅msdn<br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp"><font color="#000080">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp</font></a><br />--------------------------------------------------------------------------------<br />3. 插入数据 m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列<br />m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );<br />int nRow = m_list.InsertItem(0, &#8220;11&#8221;);//插入行<br />m_list.SetItemText(nRow, 1, &#8220;jacky&#8221;);//设置数据<br />--------------------------------------------------------------------------------<br />4. 一直选中item 选中style中的Show selection always，或者在上面第2点中设置LVS_SHOWSELALWAYS</p>
<p>--------------------------------------------------------------------------------<br />5. 选中和取消选中一行 int nIndex = 0;<br />//选中<br />m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);<br />//取消选中<br />m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);<br />--------------------------------------------------------------------------------<br />6. 得到listctrl中所有行的checkbox的状态 m_list.SetExtendedStyle(LVS_EX_<font style="background-color: yellow" color="red">CHECKBOXES</font>);<br />CString str;<br />for(int i=0; i&lt;m_list.GetItemCount(); i++)<br />{<br />if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))<br />{<br />str.Format(_T("第%d行的checkbox为选中状态"), i);<br />AfxMessageBox(str);<br />}<br />}<br />--------------------------------------------------------------------------------<br />7. 得到listctrl中所有选中行的序号<br />方法一：<br />CString str;<br />for(int i=0; i&lt;m_list.GetItemCount(); i++)<br />{<br />if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )<br />{<br />str.Format(_T("选中了第%d行"), i);<br />AfxMessageBox(str);<br />}<br />}</p>
<p>方法二：<br />POSITION pos = m_list.GetFirstSelectedItemPosition();<br />if (pos == NULL)<br />TRACE0("No items were selected!/n");<br />else<br />{<br />while (pos)<br />{<br />int nItem = m_list.GetNextSelectedItem(pos);<br />TRACE1("Item %d was selected!/n", nItem);<br />// you could do your own processing on nItem here<br />}<br />}<br />--------------------------------------------------------------------------------<br />8. 得到item的信息 TCHAR szBuf[1024];<br />LVITEM lvi;<br />lvi.iItem = nItemIndex;<br />lvi.iSubItem = 0;<br />lvi.mask = LVIF_TEXT;<br />lvi.pszText = szBuf;<br />lvi.cchTextMax = 1024;<br />m_list.GetItem(&amp;lvi);</p>
<p>关于得到设置item的状态，还可以参考msdn文章<br />Q173242: Use Masks to Set/Get Item States in CListCtrl<br /><a href="http://support.microsoft.com/kb/173242/en-us"><font color="#000080">http://support.microsoft.com/kb/173242/en-us</font></a><br />--------------------------------------------------------------------------------<br />9. 得到listctrl的所有列的header字符串内容 LVCOLUMN lvcol;<br />char str[256];<br />int nColNum;<br />CString strColumnName[4];//假如有4列</p>
<p>nColNum = 0;<br />lvcol.mask = LVCF_TEXT;<br />lvcol.pszText = str;<br />lvcol.cchTextMax = 256;<br />while(m_list.GetColumn(nColNum, &amp;lvcol))<br />{ <br />strColumnName[nColNum] = lvcol.pszText;<br />nColNum++;<br />}<br />--------------------------------------------------------------------------------<br />10. 使listctrl中一项可见，即滚动滚动条 m_list.EnsureVisible(i, FALSE);<br />--------------------------------------------------------------------------------<br />11. 得到listctrl列数 int nHeadNum = m_list.GetHeaderCtrl()-&gt;GetItemCount();<br />--------------------------------------------------------------------------------<br />12. 删除所有列 方法一：<br />while ( m_list.DeleteColumn (0))<br />因为你删除了第一列后，后面的列会依次向上移动。</p>
<p>方法二：<br />int nColumns = 4;<br />for (int i=nColumns-1; i&gt;=0; i--)<br />m_list.DeleteColumn (i);<br />--------------------------------------------------------------------------------<br />13. 得到单击的listctrl的行列号 添加listctrl控件的NM_CLICK消息相应函数<br />void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br />{<br />// 方法一：<br />/*<br />DWORD dwPos = GetMessagePos();<br />CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br /><br />m_list.ScreenToClient(&amp;point);<br /><br />LVHITTESTINFO lvinfo;<br />lvinfo.pt = point;<br />lvinfo.flags = LVHT_ABOVE;<br /><br />int nItem = m_list.SubItemHitTest(&amp;lvinfo);<br />if(nItem != -1)<br />{<br />CString strtemp;<br />strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);<br />AfxMessageBox(strtemp);<br />}<br />*/<br /><br />// 方法二:<br />/*<br />NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />if(pNMListView-&gt;iItem != -1)<br />{<br />CString strtemp;<br />strtemp.Format("单击的是第%d行第%d列",<br />pNMListView-&gt;iItem, pNMListView-&gt;iSubItem);<br />AfxMessageBox(strtemp);<br />}<br />*/<br />*pResult = 0;<br />}<br />--------------------------------------------------------------------------------<br />14. 判断是否点击在listctrl的checkbox上 添加listctrl控件的NM_CLICK消息相应函数<br />void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br />{<br />DWORD dwPos = GetMessagePos();<br />CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br /><br />m_list.ScreenToClient(&amp;point);<br /><br />LVHITTESTINFO lvinfo;<br />lvinfo.pt = point;<br />lvinfo.flags = LVHT_ABOVE;<br /><br />UINT nFlag;<br />int nItem = m_list.HitTest(point, &amp;nFlag);<br />//判断是否点在checkbox上<br />if(nFlag == LVHT_ONITEMSTATEICON)<br />{<br />AfxMessageBox("点在listctrl的checkbox上");<br />} <br />*pResult = 0;<br />}<br />--------------------------------------------------------------------------------<br />15. 右键点击listctrl的item弹出菜单 添加listctrl控件的NM_RCLICK消息相应函数<br />void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)<br />{<br />NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />if(pNMListView-&gt;iItem != -1)<br />{<br />DWORD dwPos = GetMessagePos();<br />CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br /><br />CMenu menu;<br />VERIFY( menu.LoadMenu( IDR_MENU1 ) );<br />CMenu* popup = menu.GetSubMenu(0);<br />ASSERT( popup != NULL );<br />popup-&gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );<br />} <br />*pResult = 0;<br />}<br />--------------------------------------------------------------------------------<br />16. item切换焦点时(包括用键盘和鼠标切换item时)，状态的一些变化顺序 添加listctrl控件的LVN_ITEMCHANGED消息相应函数<br />void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)<br />{<br />NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />// TODO: Add your control notification handler code here<br /><br />CString sTemp;<br /><br />if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == LVIS_FOCUSED &amp;&amp; <br />(pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == 0)<br />{<br />sTemp.Format("%d losted focus",pNMListView-&gt;iItem);<br />}<br />else if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == 0 &amp;&amp;<br />(pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == LVIS_FOCUSED)<br />{<br />sTemp.Format("%d got focus",pNMListView-&gt;iItem);<br />} <br /><br />if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == LVIS_SELECTED &amp;&amp;<br />(pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == 0)<br />{<br />sTemp.Format("%d losted selected",pNMListView-&gt;iItem);<br />}<br />else if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == 0 &amp;&amp;<br />(pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == LVIS_SELECTED)<br />{<br />sTemp.Format("%d got selected",pNMListView-&gt;iItem);<br />}<br /><br />*pResult = 0;<br />}<br />--------------------------------------------------------------------------------<br />20. listctrl的subitem添加图标 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);<br />m_userlist.SetItem(..); //具体参数请参考msdn<br />--------------------------------------------------------------------------------<br />21. 在CListCtrl显示文件，并根据文件类型来显示图标 网上找到的代码，share<br />BOOL CTest6Dlg::OnInitDialog()<br />{<br />CDialog::OnInitDialog();<br /><br />HIMAGELIST himlSmall;<br />HIMAGELIST himlLarge;<br />SHFILEINFO sfi;<br />char cSysDir[MAX_PATH];<br />CString strBuf;<br /><br />memset(cSysDir, 0, MAX_PATH);<br /><br />GetWindowsDirectory(cSysDir, MAX_PATH);<br />strBuf = cSysDir;<br />sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("<a href="file:///"><font color="#000080">file:///</font></a>));<br /><br />himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir, <br />0, <br />&amp;sfi, <br />sizeof(SHFILEINFO), <br />SHGFI_SYSICONINDEX | SHGFI_SMALLICON );<br /><br />himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, <br />0, <br />&amp;sfi, <br />sizeof(SHFILEINFO), <br />SHGFI_SYSICONINDEX | SHGFI_LARGEICON);<br /><br />if (himlSmall &amp;&amp; himlLarge)<br />{<br />::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<br />(WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);<br />::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<br />(WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);<br />}<br />return TRUE; // return TRUE unless you set the focus to a control<br />}<br /><br />void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)<br />{<br />int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);<br />CString strSize;<br />CFileFind filefind;<br /><br />// get file size<br />if (filefind.FindFile(lpszFileName))<br />{<br />filefind.FindNextFile();<br />strSize.Format("%d", filefind.GetLength());<br />}<br />else<br />strSize = "0";<br /><br />// split path and filename<br />CString strFileName = lpszFileName;<br />CString strPath;<br /><br />int nPos = strFileName.ReverseFind('//');<br />if (nPos != -1)<br />{<br />strPath = strFileName.Left(nPos);<br />strFileName = strFileName.Mid(nPos + 1);<br />}<br /><br />// insert to list<br />int nItem = m_list.GetItemCount();<br />m_list.InsertItem(nItem, strFileName, nIcon);<br />m_list.SetItemText(nItem, 1, strSize);<br />m_list.SetItemText(nItem, 2, strFileName.Right(3));<br />m_list.SetItemText(nItem, 3, strPath);<br />}<br /><br />int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)<br />{<br />SHFILEINFO sfi;<br />memset(&amp;sfi, 0, sizeof(sfi));<br /><br />if (bIsDir)<br />{<br />SHGetFileInfo(lpszPath, <br />FILE_ATTRIBUTE_DIRECTORY, <br />&amp;sfi, <br />sizeof(sfi), <br />SHGFI_SMALLICON | SHGFI_SYSICONINDEX |<br />SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0)); <br />return sfi.iIcon;<br />}<br />else<br />{<br />SHGetFileInfo (lpszPath, <br />FILE_ATTRIBUTE_NORMAL, <br />&amp;sfi, <br />sizeof(sfi), <br />SHGFI_SMALLICON | SHGFI_SYSICONINDEX | <br />SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));<br />return sfi.iIcon;<br />}<br />return -1;<br />}</p>
<p>--------------------------------------------------------------------------------<br />22. listctrl内容进行大数据量更新时，避免闪烁 m_list.SetRedraw(FALSE);<br />//更新内容<br />m_list.SetRedraw(TRUE);<br />m_list.Invalidate();<br />m_list.UpdateWindow();</p>
<p>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</p>
<p><font color="#3366ff" size="3">创建图形列表并和CListCtrl关联：<br />m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192));<br />m_image_list.SetBkColor( GetSysColor( COLOR_WINDOW ) );<br />m_caller_list.SetImageList( &amp;m_image_list, LVSIL_SMALL);<br />为报表添加4列：<br />char *szColumn[]={"昵称","IP地址","登陆时间","状态"};<br />int widths[]={100,98,70,55};<br />LV_COLUMN lvc;<br />lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;<br />lvc.fmt=LVCFMT_LEFT;<br />for(int i=0;i&lt;4;i++) {//插入各列<br />lvc.pszText=szColumn[i];<br />lvc.cx=widths[i];<br />lvc.iSubItem=i;<br />m_caller_list.InsertColumn(i,&amp;lvc);<br />}<br />为报表添加两项，以附加方式添加：<br />char* data[4];<br />data[0]="所有人";<br />data[1]="0.0.0.0";<br />data[3]="在线";<br />data[2]=new char;<br />CTime now=CTime::GetCurrentTime();<br />CString temp = now.Format("%H:%M:%S");<br />data[2]=temp.GetBuffer(1);<br />LV_ITEM lvi;<br />lvi.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;<br />lvi.iSubItem=0;<br />lvi.pszText=(char *)data[0];<br />lvi.iImage = 0;<br />lvi.iItem=0;<br />m_caller_list.InsertItem(&amp;lvi);<br />for (int j=0;j&lt;4;j++) m_caller_list.SetItemText(count,j,data[j]);<br />count++;<br />lvi.iImage = 1;<br />lvi.iItem=count;<br />m_caller_list.InsertItem(&amp;lvi);<br />data[0]="cherami";<br />data[1]="127.0.0.1"; <br />for (int n=0;n&lt;4;n++) m_caller_list.SetItemText(count,n,data[n]);<br />count++;<br />设置报表的样式<br />选中一整行：<br />m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT); <br />绘制表格：<br />m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_GRIDLINES); <br />带复选框：<br />m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_<font style="background-color: yellow" color="red">CHECKBOXES</font>); <br />自动切换：<br />m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_TRACKSELECT); <br />选定一行：<br />设置CListCtrl的Show selection always选项<br />SetItemState (iIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED) <br />选中一个或多个项目时,会发送LVN_ITEMCHANGED消息，可以使用<br />GetSelectedCount()方法得到被选定的项的数目。<br />点击列头的消息响应：<br />ON_NOTIFY(HDN_ITEMCLICKW, 0, ResponseFunc)<br />消息，需要自己添加 <br />或者：<br />ON_NOTIFY(LVN_COLUMNCLICK, ID_yourCtrl, ResponseFunc)//向导添加<br />前者后响应，后者先响应<br />响应函数：<br />ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult) <br />双击CListCtrl中的ITEM的消息是及消息函数：<br />ON_NOTIFY(NM_DBLCLK, ID_yourCtrl, ResponseFunc) <br />单击ITEM的消息响应：<br />ON_NOTIFY(NM_CLICK, ID_yourCtrl, ResponseFunc)<br />ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult) </font></p>
<p><font color="#3366ff" size="3">HDN_ITEMCLICK 就是Header control Notify message for mouse left click on the Header control!<br />而HDN_ITEMCLICK是当List View中存在一个Header Contrl时，Header Ctrl通知父窗口List View的！<br />CListCtrl中的Item被选中触发LBN_SELCHANGE(通过WM_COMMAND)消息！<br />删除CListCtrl中选定的项：<br />POSITION pos;<br />int nIndex;<br />for(; pos= GetFirstSelectedItemPosition();)<br />{<br />nIndex = GetNextSelectedItem(pos);<br />DeleteItem(nIndex);<br />}<br />在ListCtrl中进行排序<br />列表控件（CListCtrl）的顶部有一排按钮，用户可以通过选择不同的列来对记录进行排序。但是 CListCtrl并没有自动排序的功能，我们需要自己添加一个用于排序的回调函数来比较两个数据的大小，此外还需要响应排序按钮被点击的消息。下面讲述一下具体的做法。<br />CListCtrl提供了用于排序的函数，函数原型为：BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData )。其中第一个参数为全局排序函数的地址，第二个参数为用户数据，你可以根据你的需要传递一个数据或是指针。该函数返回-1代表第一项排应在第二项前面，返回1代表第一项排应在第二项后面，返回0代表两项相等。<br />用于排序的函数原形为：int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)，其中第三个参数为调用者传递的数据（即调用SortItems时的第二个参数dwData）。第一和第二个参数为用于比较的两项的ItemData，你可以通过DWORD CListCtrl::GetItemData( int nItem )/BOOL CListCtrl::SetItemData( int nItem, DWORD dwData )来对每一项的ItemData进行存取。在添加项时选用特定的CListCtrl::InsertItem也可以设置该值。由于你在排序时只能通过该值来确定项的位置所以你应该比较明确的确定该值的含义。<br />最后一点，我们需要知道什么时候需要排序，实现这点可以在父窗口中对LVN_COLUMNCLICK消息进行处理来实现。 <br />下面我们看一个例子，这个例子是一个派生类，并支持顺序/倒序两种方式排序。为了简单我对全局数据进行排序，而在实际应用中会有多组需要排序的数据，所以需要通过传递参数的方式来告诉派序函数需要对什么数据进行排序。</font></p>
<p><font color="#3366ff" size="3">//全局数据<br />struct DEMO_DATA<br />{<br />char szName[20];<br />int iAge;<br />}strAllData[5]={{"王某",30},{"张某",40},{"武某",32},{"陈某",20},{"李某",36}};<br />//CListCtrl派生类定义<br />class CSortList : public CListCtrl<br />{<br />// Construction<br />public:<br />CSortList();<br />BOOL m_fAsc;//是否顺序排序<br />int m_nSortedCol;//当前排序的列<br />protected:<br />//{{AFX_MSG(CSortList)<br />//}}AFX_MSG<br />...<br />};<br />//父窗口中包含该CListCtrl派生类对象<br />class CSort_in_list_ctrlDlg : public CDialog<br />{<br />// Construction<br />public:<br />CSort_in_list_ctrlDlg(CWnd* pParent = NULL); // standard constructor<br />// Dialog Data<br />//{{AFX_DATA(CSort_in_list_ctrlDlg)<br />enum { IDD = IDD_SORT_IN_LIST_CTRL_DIALOG };<br />CSortList m_listTest;<br />//}}AFX_DATA<br />}<br />//在父窗口中定义LVN_COLUMNCLICK消息映射<br />BEGIN_MESSAGE_MAP(CSort_in_list_ctrlDlg, CDialog)<br />//{{AFX_MSG_MAP(CSort_in_list_ctrlDlg)<br />ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnColumnclickList1)<br />//}}AFX_MSG_MAP<br />END_MESSAGE_MAP()<br />//初始化数据<br />BOOL CSort_in_list_ctrlDlg::OnInitDialog()<br />{<br />CDialog::OnInitDialog();<br />//初始化ListCtrl中数据列表<br />m_listTest.InsertColumn(0,"姓名");<br />m_listTest.InsertColumn(1,"年龄");<br />m_listTest.SetColumnWidth(0,80);<br />m_listTest.SetColumnWidth(1,80);<br />for(int i=0;i&lt;5;i++)<br />{<br />m_listTest.InsertItem(i,strAllData[i].szName);<br />char szAge[10];<br />sprintf(szAge,"%d",strAllData[i].iAge);<br />m_listTest.SetItemText(i,1,szAge);<br />//设置每项的ItemData为数组中数据的索引<br />//在排序函数中通过该ItemData来确定数据<br />m_listTest.SetItemData(i,i);<br />}<br />return TRUE; // return TRUE unless you set the focus to a control<br />}<br />//处理消息<br />void CSort_in_list_ctrlDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) <br />{<br />NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />//设置排序方式<br />if( pNMListView-&gt;iSubItem == m_listTest.m_nSortedCol )<br />m_listTest.m_fAsc = !m_listTest.m_fAsc;<br />else<br />{<br />m_listTest.m_fAsc = TRUE;<br />m_listTest.m_nSortedCol = pNMListView-&gt;iSubItem;<br />}<br />//调用排序函数<br />m_listTest.SortItems( ListCompare, (DWORD)&amp;m_listTest ); <br />*pResult = 0;<br />}<br />//排序函数实现<br />int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)<br />{<br />//通过传递的参数来得到CSortList对象指针，从而得到排序方式<br />CSortList* pV=(CSortList*)lParamSort;<br />//通过ItemData来确定数据<br />DEMO_DATA* pInfo1=strAllData+lParam1;<br />DEMO_DATA* pInfo2=strAllData+lParam2;<br />CString szComp1,szComp2;<br />int iCompRes;<br />switch(pV-&gt;m_nSortedCol)<br />{<br />case(0):<br />//以第一列为根据排序<br />szComp1=pInfo1-&gt;szName;<br />szComp2=pInfo2-&gt;szName;<br />iCompRes=szComp1.Compare(szComp2);<br />break;<br />case(1):<br />//以第二列为根据排序<br />if(pInfo1-&gt;iAge == pInfo2-&gt;iAge)<br />iCompRes = 0;<br />else<br />iCompRes=(pInfo1-&gt;iAge &lt; pInfo2-&gt;iAge)?-1:1;<br />break;<br />default:<br />ASSERT(0);<br />break;<br />}<br />//根据当前的排序方式进行调整<br />if(pV-&gt;m_fAsc)<br />return iCompRes;<br />else<br />return iCompRes*-1;<br />}<br />排序最快：<br />CListCtrl::SortItems<br />Example<br />// Sort the item in reverse alphabetical order.<br />static int CALLBACK <br />MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)<br />{<br />// lParamSort contains a pointer to the list view control.<br />// The lParam of an item is just its index.<br />CListCtrl* pListCtrl = (CListCtrl*) lParamSort;<br />CString strItem1 = pListCtrl-&gt;GetItemText(lParam1, 0);<br />CString strItem2 = pListCtrl-&gt;GetItemText(lParam2, 0);<br />return strcmp(strItem2, strItem1);<br />}<br />void snip_CListCtrl_SortItems()<br />{<br />// The pointer to my list view control.<br />extern CListCtrl* pmyListCtrl;<br />// Sort the list view items using my callback procedure.<br />pmyListCtrl-&gt;SortItems(MyCompareProc, (LPARAM) pmyListCtrl);<br />}</font></p>
<p><font color="#3366ff" size="3">If you don&#8217;t want to allow the users to sort the list by clicking on the header, you can use the style LVS_NOSORTHEADER. However, if you do want to allow sorting, you do not specify the LVS_NOSORTHEADER. The control, though, does not sort the items. You have to handle the HDN_ITEMCLICK notification from the header control and process it appropriately. In the code below, we have used the sorting function SortTextItems() developed in a previous section. You may choose to sort the items in a different manner. <br />Step 1: Add two member variables<br />Add two member variables to the CListCtrl. The first variable to track which column has been sorted on, if any. The second variable to track if the sort is ascending or descending. <br />int nSortedCol; <br />BOOL bSortAscending; <br /><br />Step 2: Initialize them in the constructor.<br />Initialize nSortedCol to -1 to indicate that no column has been sorted on. If the list is initially sorted, then this variable should reflect that. <br /><br />nSortedCol = -1; <br />bSortAscending = TRUE; <br /><br />Step 3: Add entry in message map to handle HDN_ITEMCLICK<br />Actually you need to add two entries. For HDN_ITEMCLICKA and HDN_ITEMCLICKW. Do not use the class wizard to add the entry. For one, you need to add two entries whereas the class wizard will allow you only one. Secondly, the class wizard uses the wrong macro in the entry. It uses ON_NOTIFY_REFLECT() instead of ON_NOTIFY(). Since the HDN_ITEMCLICK is a notification from the header control to the list view control, it is a direct notification and not a reflected one. <br />ON_NOTIFY(HDN_ITEMCLICKA, 0, OnHeaderClicked) <br />ON_NOTIFY(HDN_ITEMCLICKW, 0, OnHeaderClicked)<br />Note that we specify the same function for both the notification. Actually the program will receive one or the other and not both. What notification it receives will depend on the OS. The list view control on Windows 95 will send the ANSI version and the control on NT will send the UNICODE version. <br />Also, note that the second argument is zero. This value filters for the id of the control and we know that header control id is zero. <br />Step 4: Write the OnHeaderClicked() function<br />Here&#8217;s where you decide what to do when the user clicks on a column header. The expected behaviour is to sort the list based on the values of the items in that column. In this function we have used the SortTextItems() function developed in a previous section. If any of the columns displays numeric or date values, then you would have to provide custom sorting for them. <br /><br />void CMyListCtrl::OnHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult) <br />{<br />HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;<br />if( phdn-&gt;iButton == 0 )<br />{<br />// User clicked on header using left mouse button<br />if( phdn-&gt;iItem == nSortedCol )<br />bSortAscending = !bSortAscending;<br />else<br />bSortAscending = TRUE;<br />nSortedCol = phdn-&gt;iItem;<br />SortTextItems( nSortedCol, bSortAscending );<br />}<br />*pResult = 0;<br />}<br />让CListCtrl的SubItem也具有编辑功能:<br />要重载一个文本框，然后在LVN_BEGINLABELEDIT时改变文本框位置。<br />CInEdit m_InEdit;<br />if( ( GetStyle() &amp; LVS_TYPEMASK ) == LVS_REPORT &amp;&amp; ( m_nEditSubItem != 0 ) )<br />{<br />HWND hwndEdit;<br />CRect rtBound;<br />CString strText;<br />hwndEdit = (HWND)SendMessage( LVM_GETEDITCONTROL );<br />GetSubItemRect( pDispInfo-&gt;item.iItem, m_nEditSubItem, LVIR_LABEL, rtBound );<br />m_InEdit.SubclassWindow( hwndEdit );<br />m_InEdit.m_left = rtBound.left;<br />strText = GetItemText( pDispInfo-&gt;item.iItem, m_nEditSubItem );<br />m_InEdit.SetWindowText( strText );<br />}<br />void CInEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) <br />{<br />CRect rtClient;<br />lpwndpos-&gt;x = m_left; // m_left在LVN_BEGINLABELEDIT中设置<br />CEdit::OnWindowPosChanging(lpwndpos);<br /><br />// TODO: Add your message handler code here<br /><br />} </font></p></div></div></div><img src ="http://www.cppblog.com/Mumoo/aggbug/197332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2013-01-17 10:32 <a href="http://www.cppblog.com/Mumoo/archive/2013/01/17/197332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CTime()类</title><link>http://www.cppblog.com/Mumoo/archive/2012/11/27/195738.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Tue, 27 Nov 2012 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/11/27/195738.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/195738.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/11/27/195738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/195738.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/195738.html</trackback:ping><description><![CDATA[<div>结构:<br />CTime( 
<div class="spctrl"></div>　　int nYear, 
<div class="spctrl"></div>　　int nMonth, 
<div class="spctrl"></div>　　int nDay, 
<div class="spctrl"></div>　　int nHour, 
<div class="spctrl"></div>　　int nMin, 
<div class="spctrl"></div>　　int nSec, 
<div class="spctrl"></div>　　int nDST = -1<br />&nbsp;//参数nDST指定是否实行夏令时，为0时表示实行标准时间，为正数时表示实行夏令时，为负数时由系统自动计算实行的是标准时间还是夏令时。 
<div class="spctrl"></div>　　); <br /><br /><span style="color: #0000ff">　===================================================================== </span>
<div class="spctrl"></div><span style="color: #0000ff">　　</span><strong style="color: #0000ff">C++中，CTime 与 CString转换</strong><span style="color: #0000ff"> </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CTime m_StartTime1 = CTime::GetCurrentTime(); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString csStartTime = m_StartTime1.Format( "%Y%m%d%H%M%S" ); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　</span><strong style="color: #0000ff">一.将CString转为CTime的几种方法</strong><span style="color: #0000ff"> </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString timestr = "2000年04月05日"; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　int a,b,c ; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&amp;a,&amp;b,&amp;c); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CTime time(a,b,c,0,0,0); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　--------or - --------------------- </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString s("2001-8-29 19:06:23"); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　int nYear, nMonth, nDate, nHour, nMin, nSec; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　sscanf(s, "%d-%d-%d %d:%d:%d", &amp;nYear, &amp;nMonth, &amp;nDate, &amp;nHour, &amp;nMin, &amp;nSec); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CTime t(nYear, nMonth, nDate, nHour, nMin, nSec); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　---- or ------------------------ </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString timestr = "2000年04月05日"; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　int year,month,day; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　BYTE tt[5]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　//get year </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　memset(tt, 0, sizeof(tt)); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[0] = timestr[0]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[1] = timestr[1]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[2] = timestr[2]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[3] = timestr[3]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　year= atoi((char *)tt); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　//get month </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　memset(tt, 0, sizeof(tt)); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[0] = timestr[6]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[1] = timestr[7]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　month = atoi((char *)tt); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　//get day </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　memset(tt, 0, sizeof(tt)); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[0] = timestr[10]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　tt[1] = timestr[11]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CTime time(year,month,day,0,0,0); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　从上面来看,很明显使用sscanf()函数的优势. </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　</span><strong style="color: #0000ff">二.将CTime转换为CString的方法:</strong><span style="color: #0000ff"> </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CTime tmSCan = CTime::GetCurrentTime(); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'"); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　这样得到的</span><a style="color: #0000ff" href="http://baike.baidu.com/view/566414.htm" target="_blank">日期</a><span style="color: #0000ff">时间字符串就是以"2006-11-27 23:30:59"的格式.</span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　//取得CTime中的日期 </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString cstrDate = tmScan.Format("%Y-%m-%d"); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　//取得CTime中的时间 </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　CString cstrTime = tmScan.Format("%H:%M-%S"); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　sprintf还有个不错的表妹：strftime，专门用于格式化时间字符串的，用法跟她表哥很像，也是一大堆格式控制符，只是毕竟小姑娘家心细，她还要调用者指定缓冲区的最大长度，可能是为了在出现问题时可以推卸责任吧。这里举个例子： </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　更多更好的sprintf()函数说明参考:《spirntf，你知道多少？》 </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　time_t t = time(0); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　//产生"YYYY-MM-DD hh:mm:ss"格式的字符串。 </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　char s[32]; </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&amp;t)); </span>
<div style="color: #0000ff" class="spctrl"></div><span style="color: #0000ff">　　sprintf在MFC中也能找到他的知音：CString::Format，strftime在MFC中自然也有她的同道：CTime::Format，这一对由于从</span><a style="color: #0000ff" href="http://baike.baidu.com/view/125370.htm" target="_blank">面向对象</a><span style="color: #0000ff">哪里得到了赞助，用以写出的代码更觉优雅 </span><br /><span style="color: #0000ff">===================================================================== </span><br /><br />获取时间及时间参数方法：<br /><span style="color: red">static CTime WINAPI GetCurrentTime( ); </span>
<div class="spctrl"></div><span style="color: red">　　获取系统当前日期和时间。返回表示当前日期和时间的CTime对象。&nbsp;<br />CString Format(LPCTSTR pszFormat) const; 
<div class="spctrl"></div>　　将CTime对象中的时间信息格式化为字符串。参数pszFormat是格式化字符串，与printf中的格式化字符串类似，格式化字符串中带有%前缀的格式码将会被相应的CTime时间分量代替，而其他字符会原封不动的拷贝到返回字符串中。格式码及含义如下： 
<div class="spctrl"></div>　　%a：周的英文缩写形式。 
<div class="spctrl"></div>　　%A：周的英文全名形式。 
<div class="spctrl"></div>　　%b： 月的英文缩写形式。 
<div class="spctrl"></div>　　%B：月的英文全名形式。 
<div class="spctrl"></div>　　%c： 完整的日期和时间。 
<div class="spctrl"></div>　　%d：十进制形式的日期（01-31）。 
<div class="spctrl"></div>　　%H：24小时制的小时（00-23）。 
<div class="spctrl"></div>　　%I： 12小时制的小时（00-11）。 
<div class="spctrl"></div>　　%j： 十进制表示的一年中的第几天（001-366）。 
<div class="spctrl"></div>　　%m： 月的十进制表示（01-12）。 
<div class="spctrl"></div>　　%M：十进制表示的分钟（00-59）。 
<div class="spctrl"></div>　　%p： 12小时制的上下午标示（AM/PM）。 
<div class="spctrl"></div>　　%S： 十进制表示的秒（00-59）。 
<div class="spctrl"></div>　　%U： 一年中的第几个星期（00-51），星期日是一周的第一天。 
<div class="spctrl"></div>　　%W： 一年中的第几个星期（00-51），星期一是一周的第一天。 
<div class="spctrl"></div>　　%w： 十进制表示的星期几（0-6）。 
<div class="spctrl"></div>　　%Y： 十进制表示的年。 </span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTime(const SYSTEMTIME&amp; st,int nDST = - 1) ; 
<div class="spctrl"></div>　　以一个SYSTEMTIME结构体变量来构造CTime对象。SYSTEMTIME结构体也是我们对日期时间的常用表示方式。参数st为以本地时间表示的SYSTEMTIME对象，参数nDST同上。 
<div class="spctrl"></div>　　int GetYear( ) const； 
<div class="spctrl"></div>　　获取CTime对象表示时间的年份。范围从1970年1月1日到2038年（包括2038年）1月18日。 
<div class="spctrl"></div>　　int GetMonth( ) const; 
<div class="spctrl"></div>　　获取CTime对象表示时间的月份。范围为1到12。 
<div class="spctrl"></div>　　int GetDay( ) const; 
<div class="spctrl"></div>　　获取CTime对象表示时间的日期。范围为1到31。 
<div class="spctrl"></div>　　int GetHour( ) const; 
<div class="spctrl"></div>　　获取CTime对象表示时间的小时。范围为0到23。 
<div class="spctrl"></div>　　int GetMinute( ) const; 
<div class="spctrl"></div>　　获取CTime对象表示时间的分钟。范围为0到59。 
<div class="spctrl"></div>　　int GetSecond( ) const; 
<div class="spctrl"></div>　　获取CTime对象表示时间的秒。范围为0到59。 
<div class="spctrl"></div>　　int GetDayOfWeek( ) const; 
<div class="spctrl"></div>　　此函数的返回值表示CTime对象代表的是星期几，1表示是周日，2表示是周一，以此类推。<br />&nbsp;<br />操作与比较：<br />CTime operator +(CTimeSpan timeSpan) const; 
<div class="spctrl"></div>　　将CTime对象和CTimeSpan对象相加，返回一个CTime对象。实际意义就是在一个时间的基础上推后一个时间间隔，得到一个新的时间。 
<div class="spctrl"></div>CTime operator -(CTimeSpan timeSpan) const; 
<div class="spctrl"></div>　　将CTime对象和一个CTimeSpan相减，返回一个CTime对象。实际意义就是在一个时间的基础上提前一个时间间隔，得到一个新的时间。 
<div class="spctrl"></div>CTimeSpan operator -(CTime time) const; 
<div class="spctrl"></div>　　将该CTime对象和另一个CTime对象相减，返回一个CTimeSpan对象。实际意义就是计算两个时间点的间隔，得到一个CTimeSpan对象。 
<div class="spctrl"></div>CTime&amp; operator +=(CTimeSpan span); 
<div class="spctrl"></div>　　为该CTime对象增加一个span表示的时间间隔。 
<div class="spctrl"></div>CTime&amp; operator -=(CTimeSpan span); 
<div class="spctrl"></div>　　为该CTime对象减去一个span表示的时间间隔。 
<div class="spctrl"></div>CTime&amp; operator =(__time64_t time); 
<div class="spctrl"></div>　　为该CTime对象赋予一个新的时间值。 
<div class="spctrl"></div>　　简单说下剩下的几个重载i运算符： 
<div class="spctrl"></div>　　operator == ： 比较两个绝对时间是否相等。 
<div class="spctrl"></div>　　operator != ： 比较两个绝对时间是否不相等。 
<div class="spctrl"></div>　　operator &gt; ： 比较两个绝对时间，是否前一个大于后一个。 
<div class="spctrl"></div>　　operator &lt; ： 比较两个绝对时间，是否前一个小于后一个。 
<div class="spctrl"></div>　　operator &gt;= ： 比较两个绝对时间，是否前一个大于等于后一个。 
<div class="spctrl"></div>　　operator &lt;= ： 比较两个绝对时间，是否前一个小于等于后一个<br /></div><img src ="http://www.cppblog.com/Mumoo/aggbug/195738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-11-27 16:20 <a href="http://www.cppblog.com/Mumoo/archive/2012/11/27/195738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListControl 设置表格行高与字体</title><link>http://www.cppblog.com/Mumoo/archive/2012/11/20/195410.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Tue, 20 Nov 2012 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/11/20/195410.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/195410.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/11/20/195410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/195410.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/195410.html</trackback:ping><description><![CDATA[设置行高：<br />CImageList&nbsp;&nbsp; m_l;&nbsp;&nbsp; <br />&nbsp;m_l.Create(1,18,TRUE|ILC_COLOR32,1,0);&nbsp;&nbsp; <br />&nbsp;SetImageList(&amp;m_l,LVSIL_SMALL); <br /><br />设置字体： 
<p>&nbsp;</p>
<p>CFont m_font;</p>
<p>m_font.CreatePointFont(100, "新宋体");<br />m_listCtrl.SetFont(&amp;m_font);</p><img src ="http://www.cppblog.com/Mumoo/aggbug/195410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-11-20 16:00 <a href="http://www.cppblog.com/Mumoo/archive/2012/11/20/195410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CDateTimeCtrl 的使用</title><link>http://www.cppblog.com/Mumoo/archive/2012/11/06/194714.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Tue, 06 Nov 2012 07:03:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/11/06/194714.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/194714.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/11/06/194714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/194714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/194714.html</trackback:ping><description><![CDATA[<div align="left">
<div align="left"><font style="font-size: 14px" color="#0099cc"><strong style="color: red; font-size: 10pt">转自：<a href="http://blog.163.com/zgkingdom@126/blog/static/227347320077214150750/">http://blog.163.com/zgkingdom@126/blog/static/227347320077214150750/</a><br /></strong><strong><br />1.CDateTimeCtrl 格式</strong></font></div>
<div align="left"><font color="#000000" face="宋体">CDateTimeCtrl 设定为&#8220;ShowNone&#8221; 为 <font face="宋体">True</font></font></div>
<div align="left"></div>
<div align="left"><strong><font style="font-size: 14px" color="#0099cc">2.Format 初始化</font></strong></div></div>
<div align="left"><font face="宋体"><font face="宋体">CDateTimeCtrl m_Date1;</font></font></div>
<div align="left"><font face="宋体">m_Date1.SetFormat(_T("yyyy'- 'MM'- 'dd"));<br /></font>
<div align="left"><font face="宋体"><strong><font style="font-size: 14px" color="#0099cc">3.Format初始化选择确认框为空</font></strong></font></div>
<div align="left"><font face="宋体"><font face="宋体">CDateTimeCtrl m_Date1;</font></font></div>
<div align="left"><font face="宋体"><font face="宋体">::SendMessage( this-&gt;m_Date1.m_hWnd,(UINT)DTM_SETSYSTEMTIME,GDT_NONE, NULL);</font></font></div>
<div align="left"></div>
<div align="left">
<p><font face="宋体"><strong><font style="font-size: 14px" color="#0099cc">4.Format初始化选择确认框变化是产生的动作</font></strong></font></p>
<p><font face="宋体">voidPageDialog4::OnDtnDatetimechangeDatetimepicker1(NMHDR *pNMHDR,LRESULT *pResult)<br />{<br />LPNMDATETIMECHANGE pDTChange =reinterpret_cast&lt;LPNMDATETIMECHANGE&gt;(pNMHDR);<br />// TODO: 在此添加控件通知处理程序代码<br />if(pDTChange-&gt;dwFlags == GDT_NONE)<br />{<br />this-&gt;m_Date2.EnableWindow(FALSE);<br />}<br />else if (pDTChange-&gt;dwFlags == GDT_VALID)<br />{<br />if( this-&gt;m_Date2.IsWindowEnabled() == FALSE)<br />{<br />this-&gt;m_Date2.EnableWindow(TRUE);<br />CTime theTime = CTime::GetCurrentTime();<br />this-&gt;m_Date1.SetTime(&amp;theTime);<br />this-&gt;m_Date2.SetTime(&amp;theTime); <br />}<br />}</font></p>
<p><font face="宋体">*pResult= 0;<br />}</font></p>
<p><font face="宋体"><font face="宋体"><strong><font style="font-size: 14px" color="#0099cc">5.获取时间</font></strong></font></font></p>
<p><font face="宋体"><font face="宋体">CTimetimeTime;<br />CString szDate;<br />CDateTimeCtrl* pCtrl =&amp;this-&gt;m_Date1;<br />DWORD dwResult =pCtrl-&gt;GetTime(timeTime);<br />if (dwResult == GDT_VALID)<br />{<br />szDate = timeTime.Format(TEXT("%Y/%m/%d"));<br />}<br /><br />获取时间的第二种方法：<br /><br /><br /></font></font></p>
<p><font face="宋体"><font face="宋体"><font face="宋体"><strong><font style="font-size: 14px" color="#0099cc">6.根据Format格式设定时间</font></strong></font></font></font></p>
<p><font face="宋体">CTime theTime = CTime::GetCurrentTime();<br />this-&gt;m_Date1.SetTime(&amp;theTime);</font></p></div></div><img src ="http://www.cppblog.com/Mumoo/aggbug/194714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-11-06 15:03 <a href="http://www.cppblog.com/Mumoo/archive/2012/11/06/194714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ LNK2001错误总结 </title><link>http://www.cppblog.com/Mumoo/archive/2012/10/22/193673.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 22 Oct 2012 07:19:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/10/22/193673.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/193673.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/10/22/193673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/193673.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/193673.html</trackback:ping><description><![CDATA[<div><span style="color: red">本文转载至</span><a href="http://www.cppblog.com/jialisoft/archive/2012/10/11/193149.html"><span style="color: red">http://www.cppblog.com/jialisoft/archive/2012/10/11/193149.html</span></a><br />
<div class="posttitle">&nbsp;</div>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 宋体">学习</span><span style="font-family: 'Times New Roman'">VC</span><span style="font-family: 宋体">＋＋时经常会遇到链接错误</span><span style="font-family: 'Times New Roman'">LNK2001</span><span style="font-family: 宋体">，该错误非常讨厌，因为对于编程者来说，最好改的错误莫过于编译错误，而一般说来发生连接错误时，编译都已通过。产生连接错误的原因非常多，尤其</span><span style="font-family: 'Times New Roman'">LNK2001</span><span style="font-family: 宋体">错误，常常使人不明其所以然。如果不深入地学习和理解</span><span style="font-family: 'Times New Roman'">VC</span><span style="font-family: 宋体">＋＋，要想改正连接错误</span><span style="font-family: 'Times New Roman'">LNK2001</span><span style="font-family: 宋体">非常困难</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 'Times New Roman'">unresolved external symbol </span><span style="font-family: 宋体">（不确定的外部</span><span style="font-family: 'Times New Roman'">&#8220;</span><span style="font-family: 宋体">符号</span><span style="font-family: 'Times New Roman'">&#8221;</span><span style="font-family: 宋体">）。</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-family: 宋体"><span style="font-size: small">如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签，将产生此错误消息。一般来说，发生错误的原因有两个：</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 'Times New Roman'">(1) </span><span style="font-family: 宋体">所引用的函数、变量不存在、拼写不正确或者使用错误；</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 'Times New Roman'">(2) </span><span style="font-family: 宋体">可能使用了不同版本的连接库。</span></span></p><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 宋体; font-size: 12pt">以下是可能产生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">错误的原因：</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">1. </span><span style="font-family: 宋体; font-size: 12pt">由于编码错误导致的</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(1) </span><span style="font-family: 宋体; font-size: 12pt">不相匹配的程序代码或模块定义</span><span style="font-family: 'Times New Roman'; font-size: 12pt">(.DEF)</span><span style="font-family: 宋体; font-size: 12pt">文件能导致</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。例如</span><span style="font-family: 'Times New Roman'; font-size: 12pt">,   </span><span style="font-family: 宋体; font-size: 12pt">如果在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">C</span><span style="font-family: 宋体; font-size: 12pt">＋＋</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span><span style="font-family: 宋体; font-size: 12pt">源文件内声明了一变量</span><span style="font-family: 'Times New Roman'; font-size: 12pt">&#8220;var1&#8221;</span><span style="font-family: 宋体; font-size: 12pt">，却试图在另一文件内以变量</span><span style="font-family: 'Times New Roman'; font-size: 12pt">&#8220;VAR1&#8221;</span><span style="font-family: 宋体; font-size: 12pt">访问该变量</span><span style="font-family: 'Times New Roman'; font-size: 12pt">,</span><span style="font-family: 宋体; font-size: 12pt">将发生该错误。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(2) </span><span style="font-family: 宋体; font-size: 12pt">如果使用的内联函数是在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">.CPP</span><span style="font-family: 宋体; font-size: 12pt">文件内定义的，而不是在头文件内定义将导致</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">错误。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(3) </span><span style="font-family: 宋体; font-size: 12pt">调用函数时如果所用的参数类型同函数声明时的类型不符将会产生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(4) </span><span style="font-family: 宋体; font-size: 12pt">试图从基类的构造函数或析构函数中调用虚拟函数时将会导致</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(5) </span><span style="font-family: 宋体; font-size: 12pt">要注意函数和变量的可公用性，只有全局变量、函数是可公用的。</span> <span style="font-family: 宋体; font-size: 12pt">静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 宋体; font-size: 12pt">函数内声明的变量</span><span style="font-family: 'Times New Roman'; font-size: 12pt">(</span><span style="font-family: 宋体; font-size: 12pt">局部变量</span><span style="font-family: 'Times New Roman'; font-size: 12pt">)   </span><span style="font-family: 宋体; font-size: 12pt">只能在该函数的范围内使用。</span> </pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; color: red; font-size: 12pt">C</span><span style="font-family: 宋体; color: red; font-size: 12pt">＋＋的全局常量只有静态连接性能。这不同于</span><span style="font-family: 'Times New Roman'; color: red; font-size: 12pt">C</span><span style="font-family: 宋体; color: red; font-size: 12pt">，如果试图在</span><span style="font-family: 'Times New Roman'; color: red; font-size: 12pt">C</span><span style="font-family: 宋体; color: red; font-size: 12pt">＋＋的多个文件内使用全局变量也会产生</span><span style="font-family: 'Times New Roman'; color: red; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; color: red; font-size: 12pt">错误。一种解决的方法是需要时在头文件中加入该常量的初始化代码，并在</span><span style="font-family: 'Times New Roman'; color: red; font-size: 12pt">.CPP</span><span style="font-family: 宋体; color: red; font-size: 12pt">文件中包含该头文件；另一种方法是使用时给该变量赋以常数。</span> </pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">  </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">2. </span><span style="font-family: 宋体; font-size: 12pt">由于编译和链接的设置而造成的</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001 </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(1) </span><span style="font-family: 宋体; font-size: 12pt">如果编译时使用的是</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/NOD(/NODEFAULTLIB)</span><span style="font-family: 宋体; font-size: 12pt">选项，程序所需要的运行库和</span><span style="font-family: 'Times New Roman'; font-size: 12pt">MFC</span><span style="font-family: 宋体; font-size: 12pt">库在连接时由编译器写入目标文件模块，</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span><span style="font-family: 宋体; font-size: 12pt">但除非在文件中明确包含这些库名，否则这些库不会被链接进工程文件。在这种情况下使用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/NOD</span><span style="font-family: 宋体; font-size: 12pt">将导致错误</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(2) </span><span style="font-family: 宋体; font-size: 12pt">如果没有为</span><span style="font-family: 'Times New Roman'; font-size: 12pt">wWinMainCRTStartup</span><span style="font-family: 宋体; font-size: 12pt">设定程序入口，在使用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">Unicode</span><span style="font-family: 宋体; font-size: 12pt">和</span><span style="font-family: 'Times New Roman'; font-size: 12pt">MFC</span><span style="font-family: 宋体; font-size: 12pt">时将得到</span><span style="font-family: 'Times New Roman'; font-size: 12pt">&#8220;unresolved   external   on   _WinMain@16&#8221;</span><span style="font-family: 宋体; font-size: 12pt">的</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">错误信息。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(3)</span><span style="font-family: 宋体; font-size: 12pt">使用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/MD</span><span style="font-family: 宋体; font-size: 12pt">选项编译时</span><span style="font-family: 'Times New Roman'; font-size: 12pt">,</span><span style="font-family: 宋体; font-size: 12pt">既然所有的运行库都被保留在动态链接库之内，源文件中对</span><span style="font-family: 'Times New Roman'; font-size: 12pt">&#8220;func&#8221;</span><span style="font-family: 宋体; font-size: 12pt">的引用，在目标文件里即对</span><span style="font-family: 'Times New Roman'; font-size: 12pt">&#8220;__imp__func&#8221;   </span><span style="font-family: 宋体; font-size: 12pt">的引用。如果试图使用静态库</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LIBC.LIB</span><span style="font-family: 宋体; font-size: 12pt">或</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LIBCMT.LIB</span><span style="font-family: 宋体; font-size: 12pt">进行连接，将在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">__imp__func</span><span style="font-family: 宋体; font-size: 12pt">上发生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">；如果不使用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/MD</span><span style="font-family: 宋体; font-size: 12pt">选项编译，在使用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">MSVCxx.LIB</span><span style="font-family: 宋体; font-size: 12pt">连接时也会发生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(4)</span><span style="font-family: 宋体; font-size: 12pt">使用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/ML</span><span style="font-family: 宋体; font-size: 12pt">选项编译时，如用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LIBCMT.LIB</span><span style="font-family: 宋体; font-size: 12pt">链接会在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">_errno</span><span style="font-family: 宋体; font-size: 12pt">上发生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(5)</span><span style="font-family: 宋体; font-size: 12pt">当编译调试版的应用程序时，如果采用发行版模态库进行连接也会产生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">；同样，使用调试版模态库连接发行版应用程序时也会产生相同的问题。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(6) </span><span style="font-family: 宋体; font-size: 12pt">不同版本的库和编译器的混合使用也能产生问题，因为新版的库里可能包含早先的版本没有的符号和说明。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre><pre style="line-height: 26px; background-color: white; text-indent: 24pt; word-wrap: break-word; white-space: pre-wrap; font-size: 13px"><span style="font-family: 'Times New Roman'; font-size: 12pt">(7) </span><span style="font-family: 宋体; font-size: 12pt">在不同的模块使用内联和非内联的编译选项能够导致</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">。如果创建</span><span style="font-family: 'Times New Roman'; font-size: 12pt">C</span><span style="font-family: 宋体; font-size: 12pt">＋＋库时打开了函数内联（</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/Ob1</span><span style="font-family: 宋体; font-size: 12pt">或</span><span style="font-family: 'Times New Roman'; font-size: 12pt">/Ob2)</span><span style="font-family: 宋体; font-size: 12pt">，但是在描述该函数的相应头文件里却关闭了函数内联（没有</span><span style="font-family: 'Times New Roman'; font-size: 12pt">inline</span><span style="font-family: 宋体; font-size: 12pt">关键字），这时将得到该错误信息。为避免该问题的发生，应该在相应的头文件中用</span><span style="font-family: 'Times New Roman'; font-size: 12pt">inline</span><span style="font-family: 宋体; font-size: 12pt">关键字标志内联函数。</span><span style="font-family: 'Times New Roman'; font-size: 12pt">   </span></pre>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 'Times New Roman'">(8) </span><span style="font-family: 宋体">不正确的</span><span style="font-family: 'Times New Roman'">/SUBSYSTEM</span><span style="font-family: 宋体">或</span><span style="font-family: 'Times New Roman'">/ENTRY</span><span style="font-family: 宋体">设置也能导致</span><span style="font-family: 'Times New Roman'">LNK2001</span><span style="font-family: 宋体">。</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 宋体">其实，产生</span><span style="font-family: 'Times New Roman'">LNK2001</span><span style="font-family: 宋体">的原因还有很多，以上的原因只是一部分而已。</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 宋体">上面错误的原因是在程序中违反了标准</span><span style="font-family: 'Times New Roman'">C++</span><span style="font-family: 宋体">的规定而引起的。下面还要说明一中由于编译器而引起的错误：</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; text-indent: 24pt; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-size: small"><span style="font-family: 宋体">在标准</span><span style="font-family: 'Times New Roman'">C++</span><span style="font-family: 宋体">中模板类的定义和实现是不能分开的，原因是类模板和函数模板都不是真正的定义，真正的定义是在模板实例化时由编译器生成的。如果将模板的定义和实现分离的话，编译器在生成定义时就会因为找不到实现而报错。</span></span></p>
<p style="padding-bottom: 0px; line-height: 26px; background-color: #ffffff; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; font-size: 13px; padding-top: 0px"><span style="font-family: 宋体; font-size: 12pt">在标准</span><span style="font-family: 'Times New Roman'; font-size: 12pt">C++</span><span style="font-family: 宋体; font-size: 12pt">中模板类的定义和实现是可以像普通类一样分开来存放</span><span style="font-family: 'Times New Roman'; font-size: 12pt">(</span><span style="font-family: 宋体; font-size: 12pt">类定义放在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">.h</span><span style="font-family: 宋体; font-size: 12pt">中，类实现放在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">.cpp</span><span style="font-family: 宋体; font-size: 12pt">中</span><span style="font-family: 'Times New Roman'; font-size: 12pt">)</span><span style="font-family: 宋体; font-size: 12pt">。然而这个实现起来太困难，所以大多数编译器都不支持</span><span style="font-family: 'Times New Roman'; font-size: 12pt">(</span><span style="font-family: 宋体; font-size: 12pt">比如</span><span style="font-family: 'Times New Roman'; font-size: 12pt">VC)</span><span style="font-family: 宋体; font-size: 12pt">。这样，如果在</span><span style="font-family: 'Times New Roman'; font-size: 12pt">VC</span><span style="font-family: 宋体; font-size: 12pt">中编译代码，代码中将模板的定义和实现分开了，就会产生</span><span style="font-family: 'Times New Roman'; font-size: 12pt">LNK2001</span><span style="font-family: 宋体; font-size: 12pt">的错误。</span></p></div><img src ="http://www.cppblog.com/Mumoo/aggbug/193673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-10-22 15:19 <a href="http://www.cppblog.com/Mumoo/archive/2012/10/22/193673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ListCtrl 获取首列值相同的插入算法</title><link>http://www.cppblog.com/Mumoo/archive/2012/09/04/189420.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Tue, 04 Sep 2012 06:48:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/09/04/189420.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/189420.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/09/04/189420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/189420.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/189420.html</trackback:ping><description><![CDATA[<div>ListCtrl的InsertItem方法默认首列不相同，若首列值相同，则每次均插入第0行。<br />修改算法如下：<br />int nSize = 100;<br />
<p>int nCount = 0;<br />&nbsp;for (int i = 0; i &lt; nSize; i++)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;CString sValue;<br />&nbsp;&nbsp;sValue.Format("%d", nCount);</p>
<p>&nbsp;&nbsp;int nInsLine = InsertItem(nCount, sValue);<br />&nbsp;&nbsp;nCount++;</p>
<p>&nbsp;&nbsp;int nColumn = 0;<br />&nbsp;&nbsp;for (int j = 0; j &lt; vRecord.size(); j++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sValue = recordItem.sValue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetItemText(nInsLine, nColumn, sValue);<br />&nbsp;&nbsp;&nbsp;nColumn++;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;}<br /></p></div><img src ="http://www.cppblog.com/Mumoo/aggbug/189420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-09-04 14:48 <a href="http://www.cppblog.com/Mumoo/archive/2012/09/04/189420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 获取字符串中间的字符串~</title><link>http://www.cppblog.com/Mumoo/archive/2012/08/23/188060.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Thu, 23 Aug 2012 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/08/23/188060.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/188060.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/08/23/188060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/188060.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/188060.html</trackback:ping><description><![CDATA[//Source:<a href="http://192.168.20.1/svn/domas25/sandbox/DOMASNoneShardedClient/AllCode_Release?/PCPrintManage?/USBRegedit">AllCode_Release?/PCPrintManage?/USBRegedit</a>;<br />&nbsp;&nbsp;&nbsp;//Dest:&nbsp;&nbsp; PCPrintManage<br />&nbsp;&nbsp;&nbsp;int nURLFindFirstSecond = sURL.ReverseFind('?');<br />&nbsp;&nbsp;&nbsp;ASSERT(nURLFindFirstSecond != -1);<br />&nbsp;&nbsp;&nbsp;CString sMidDir = sURL.Mid(nURLFindFirst+2, nURLFindFirstSecond-(nURLFindFirst+2));<br />&nbsp;&nbsp;&nbsp;sSubCodeOutPath = m_sCodeOutPath + "\\" + sMidDir;<br />&nbsp;&nbsp;&nbsp;sSubCodeOutPath.Replace("?", "");<img src ="http://www.cppblog.com/Mumoo/aggbug/188060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-08-23 17:27 <a href="http://www.cppblog.com/Mumoo/archive/2012/08/23/188060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ staticText显示内容更改</title><link>http://www.cppblog.com/Mumoo/archive/2012/07/20/184306.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Fri, 20 Jul 2012 02:17:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/07/20/184306.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/184306.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/07/20/184306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/184306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/184306.html</trackback:ping><description><![CDATA[<div>1）创建CStatic Control变量 m_sStatic; <br />2)OnInit函数中 调用：m_sStatic.SetWindowText(sName);</div><img src ="http://www.cppblog.com/Mumoo/aggbug/184306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-07-20 10:17 <a href="http://www.cppblog.com/Mumoo/archive/2012/07/20/184306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 添加右键菜单</title><link>http://www.cppblog.com/Mumoo/archive/2012/07/10/182623.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Tue, 10 Jul 2012 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/07/10/182623.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/182623.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/07/10/182623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/182623.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/182623.html</trackback:ping><description><![CDATA[对话框类中添加消息函数(Messages) WM_OnContextMenu<br />&nbsp;afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/); //函数声明<br />
<p>&nbsp;void CBarView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/) //函数体<br />&nbsp;{<br />&nbsp; // TODO: Add your message handler code here<br />&nbsp; CMenu menu;<br />&nbsp; menu.LoadMenu(IDR_RIGHTMENU);<br />&nbsp; CMenu* pop=menu.GetSubMenu(0);<br />&nbsp; POINT ptMouse;<br />&nbsp; GetCursorPos(&amp;ptMouse);<br />&nbsp; pop-&gt;TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,ptMouse.x,ptMouse.y, this); </p>
<p>&nbsp;}</p><br /><br /><img src ="http://www.cppblog.com/Mumoo/aggbug/182623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-07-10 15:35 <a href="http://www.cppblog.com/Mumoo/archive/2012/07/10/182623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++程序设计注意事项</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/21/179617.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Thu, 21 Jun 2012 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/21/179617.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/179617.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/21/179617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/179617.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/179617.html</trackback:ping><description><![CDATA[<p>1.<br />&nbsp; 所有变量定义位于函数开始处。</p>
<p>2.<br />&nbsp;尽量避免全局变量，全局变量需于实现文件中定义，头文件中extern声明。</p>
<p>3.<br />浮点零值比较采用区间值。</p>
<p>4.<br />保证正确的前提下尽量使用移位运算。</p>
<p>5.<br />If语句、switch语句优先处理出现概率大的情况。</p>
<p>6.<br />&nbsp;指针与NULL比较反写如：NULL==p。</p>
<p>7.<br />&nbsp;循环嵌套时最长的循环放内层短的放外层。</p>
<p>8.<br />尽量不在循环体内修改循环变量。</p>
<p>9.<br />凡是无返回值、无参数、任意类型指针参数的函数均使用void或void指针。</p>
<p>10.<br />适当使用const，使用目的限于节省空间、提高效率、不允许修改或可能产生的函数参数修改。</p>
<p>11.<br />对于可变、多变的寄存器变量、多线程共享变量，在经过代码优化处理的releas版本下需使用volatile类型修饰符修饰变量。</p>
<p>12.<br />多参数函数应使用结构体减少参数个数。</p>
<p>13.<br />负数右移操作时会带上符号位，高位补零或补一取决编译器。左移或右移时移动位数不能大于数据的存储位数。</p>
<p>14.<br />&nbsp;Release版下assert()语句无效，故非调试状态下还是可能出现数据溢出而不报错。</p>
<p>15.<br />使用宏定义#define定义文件路径时候使用带双引号、双反斜杠的字符串。宏定义函数时候尽可能的使用括号。宏定义中的换行接续后和行起始处保证无任何字符。</p>
<p>16.<br />一种变量名称代表一段有限空间，其内容称为值，c/c++中称之为从左值到右值的转换。另一种变量是一段有限空间的引用，同时规定空间的长度(数组)。</p>
<p>17.<br />创建动态二维数组(指向指针的指针)一维使用new char*[一维度] 或者 (char**)malloc(一维度).二维循环于一维下动态创建new char[二维度] 或者(char*)malloc(二维度)。释放动态二维数组刚好相反，先循环释放二维，再释放一维。</p>
<p>18.<br />使用vector作为全局变量时候存在问题。release版下push_back（）会出现错误，估计是vector本身具有动态扩展性而做为全局变量其空间大小是固定的。如果允许其变量使用push_back添加数据则可能导致堆数据破坏。解决办法是将变量定义于类中并完成push_back再赋值于全局变量。</p>
<p>19.<br />利用字符创的结束标识'/0' （其ascII 码是 0,0x00）而非空格(其ascII 码是 32，0x20)可判断字符串结束以否，并可以移动指针的方式计算字符串的大小。</p>
<p>20.<br />Dll库，不但可以导出函数接口，也可以导出类。如：calss _declspec(dllexport) CALSSNAME{}; class _declspec(dllimport) CLASSNAME{};#pragma comment(lib,"path")。</p>
<p>21.<br />合理使用整数的/ 和 % 可取得整数(浮点数整数部分)的各个位数(%10 /10)，合理使用h,p,q,t做循环下的指针移动可以构建链表和逆序链表。合理利用数组下标可实现折半循环逆序数组(字符串)</p>
<p>22.<br />int a= 4; (++a) += (a++)&nbsp; a= ? </p>
<p>23.<br />字符数组的大小不要忘了最后的'/0'（字符指针不能使用sizeof(point)计算）。</p>
<p>24.<br />free后的内存空间只是被标记为了可重新分配，但作为该进程的内存块他依然具有读写权限，为了避免内存混乱需要NULL指针避免野指针的存在。</p>
<p>25.<br />不存在下载文件夹的说法，只有下载文件数据和文件目录信息，文件夹于本地创建。</p>
<p>26.<br />使用哈希查找加速检索，哈希过程就是建立直接索引的过程，经过哈希处理的数据在查找时候可以通过函数计算后直接定位(哈希表的索引值相当于数组索引直接定位)到该数据。哈希不能做到百分百的唯一，所以需要处理哈希冲突，通常使用链表加关键值匹配。</p>
<p>27.<br />减少程序与外存的交互次数可提速程序执行，考虑使用链表一次加载多次使用、内存块分配或者文件映射等方法。</p>
<p>28.<br />对大数据大文件的处理，考虑使用多线程均分工作任务的办法从而可降低对处理器的占用率。<br /></p><img src ="http://www.cppblog.com/Mumoo/aggbug/179617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-21 16:45 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/21/179617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各类型数据转换</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/21/179609.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Thu, 21 Jun 2012 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/21/179609.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/179609.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/21/179609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/179609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/179609.html</trackback:ping><description><![CDATA[<p>string 转 CString <br />CString.format("%s", string.c_str()); <br /><br />char 转 CString <br />CString.format("%s", char*); <br /><br />char 转 string <br />string s(char *); <br /><br />string 转 char * <br />char *p = string.c_str(); <br /><br />CString 转 string <br />string CStringTostring(CString str)<br />{<br />string s;</p>
<p>s.append(str.GetBuffer(str.GetLength()));</p>
<p>str.ReleaseBuffer();<br /><br />return s;<br /><br />}<br /><br />1，string -&gt; CString <br />CString.format("%s", string.c_str()); <br />用c_str()确实比data()要好. <br />2，char -&gt; string <br />string s(char *); <br />你的只能初始化，在不是初始化的地方最好还是用assign(). <br /><br /><br />《<a href="http://www.amazon.cn/gp/search?ie=UTF8&amp;keywords=C%2B%2B%E6%A0%87%E5%87%86%E5%87%BD%E6%95%B0%E5%BA%93&amp;tag=w-90003088&amp;linkCode=ur2&amp;camp=536&amp;creative=3200" target="_blank"><font color="#003399">C++标准函数库</font></a>》中说的 <br />有三个函数可以将字符串的内容转换为字符数组和C&#8212;string <br />1.data(),返回没有&#8221;{post.content}&#8220;的字符串数组 <br />2,c_str()，返回有&#8221;{post.content}&#8220;的字符串数组 <br />3，copy() <br /><br />--------------------------------------------------------------- <br /><br />CString与int、char*、char[100]之间的转换- - <br /><br /><br />CString与int、char*、char[100]之间的转换- - <br /><br /><br /><br />CString互转int <br /><br />将字符转换为整数，可以使用atoi、_atoi64或atol。 <br />而将数字转换为CString变量，可以使用CString的Format函数。如 <br />CString s; <br />int i = 64; <br />s.Format("%d", i) <br />Format函数的功能很强，值得你研究一下。 <br /><br />void CStrDlg::OnButton1() <br />{ <br />// TODO: Add your control notification handler code here <br />CString <br />ss="1212.12"; <br />int temp=atoi(ss); <br />CString aa; <br />aa.Format("%d",temp); <br />AfxMessageBox("var is " + aa); <br />} <br /><br />sart.Format("%s",buf); <br /><br />CString互转char* <br /><br />///char * TO cstring <br />CString strtest; <br />char * charpoint; <br />charpoint="give string a value"; <br />strtest=charpoint; <br /><br /><br />///cstring TO char * <br />charpoint=strtest.GetBuffer(strtest.GetLength()); <br /><br />标准C里没有string,char *==char []==string <br /><br />可以用CString.Format("%s",char *)这个方法来将char *转成CString。要把CString转成char *，用操作符（LPCSTR）CString就可以了。 <br /><br /><br />CString转换 char[100] <br /><br />char a[100]; <br />CString str("aaaaaa"); <br />strncpy(a,(LPCTSTR)str,sizeof(a)); </p><img src ="http://www.cppblog.com/Mumoo/aggbug/179609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-21 15:25 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/21/179609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tinyxml 合并两个XML文件</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/18/179330.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 18 Jun 2012 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/18/179330.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/179330.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/18/179330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/179330.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/179330.html</trackback:ping><description><![CDATA[<p>BOOL &nbsp;MergeXMLToDesXML(const CString &amp;sDesXMLPath, const CString &amp;sSrcXMLPath)<br />{<br />&nbsp;TiXmlDocument XmlDocSrc(sSrcXMLPath);<br />&nbsp;if (!XmlDocSrc.LoadFile())<br />&nbsp;{<br />&nbsp;&nbsp;LOG("GetJobXMLInfo:加载XML文件%s失败", sSrcXMLPath);<br />&nbsp;&nbsp;return FALSE;<br />&nbsp;}</p>
<p>&nbsp;TiXmlDocument XmlDocDes(sDesXMLPath);<br />&nbsp;if (!XmlDocDes.LoadFile())<br />&nbsp;{<br />&nbsp;&nbsp;LOG("GetJobXMLInfo:加载XML文件%s失败", sDesXMLPath);<br />&nbsp;&nbsp;return FALSE;<br />&nbsp;}</p>
<p>&nbsp;TiXmlElement *pFirstChildSrc = XmlDocSrc.FirstChildElement("Root");</p>
<p>&nbsp;TiXmlElement *pFirstChildDes = XmlDocDes.FirstChildElement("Root");<br />&nbsp;if (TiXmlElement* pRecordAtributeDes = pFirstChildDes-&gt;FirstChildElement("FirstChild"))<br />&nbsp;{<br />&nbsp;&nbsp;while(pRecordAtributeDes)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;pFirstChildSrc-&gt;InsertEndChild(*pRecordAtributeDes);&nbsp;<br />&nbsp;&nbsp;&nbsp;pRecordAtributeDes = pRecordAtributeDes-&gt;NextSiblingElement();<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>&nbsp;XmlDocSrc.SaveFile(sDesXMLPath);<br />&nbsp;return TRUE;<br />}<br /></p><img src ="http://www.cppblog.com/Mumoo/aggbug/179330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-18 17:53 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/18/179330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 调用windows图片和传真查看器打开图片</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/18/179313.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 18 Jun 2012 08:41:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/18/179313.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/179313.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/18/179313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/179313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/179313.html</trackback:ping><description><![CDATA[<div><br />CString sPicturePath = "C:\Users\Public\Pictures\Sample Pictures\八仙花.jpg";<br />
<p>CString sPicturePara= "shimgvw.dll ImageView_Fullscreen "+ sPicturePath ;</p>
<p>&nbsp;ShellExecute(NULL, NULL, "rundll32.exe",&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sPicturePara,"C:\\WINDOWS\\system32", SW_SHOW);</p></div><img src ="http://www.cppblog.com/Mumoo/aggbug/179313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-18 16:41 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/18/179313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++  对话框 不选定所有项的提示</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/11/178411.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 11 Jun 2012 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/11/178411.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/178411.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/11/178411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/178411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/178411.html</trackback:ping><description><![CDATA[int nTest = ((CButton *)GetDlgItem(IDC_RADIO1))-&gt;GetCheck(); <br />int nTest1 = ((CButton *)GetDlgItem(IDC_RADIO2))-&gt;GetCheck();//单选框&nbsp;&nbsp;<br />if (nTest == 1) <br />{ <br />AfxMessageBox("你好a"); <br />} <br />else if (nTest1 == 1) <br />{ <br />AfxMessageBox("你好b"); <br />} <br />else <br />{ <br />UpdateData(TRUE); <br />m_comMsg = "你好"; <br />UpdateData(FALSE); <br />}<br /><br />//m_sSeclectLevel:静态框的value变量<br />//m_ctrlSecretLevel:复选框变量<br />
<p>m_ctrlSecretLevel.GetWindowText(m_sSeclectLevel);</p>
<p>if (m_sSeclectLevel.IsEmpty())<br />{<br />MessageBox(PRINT_MSG, "打印监控", MB_OK | MB_ICONERROR);<br />}<br />else<br />{<br />LOG("确认打印，打印密级为 %s", m_sSeclectLevel);<br />OnOK();<br />}//复选框<br /></p><br />改变提示信息字体颜色<br />Class -&gt; 类名 -&gt;属性 -&gt; Message -&gt; WM_CTLCOLOR -&gt; &lt;Add&gt; OnCtlColor<br />int nId = pWnd-&gt; GetDlgCtrlID(); <br />if(nCtlColor == CTLCOLOR_STATIC) <br />{ <br />if(nId == IDC_STATIC1) <br />{ <br />pDC-&gt; SetTextColor((COLORREF)(RGB(255,0,0))); <br />} <br />}<img src ="http://www.cppblog.com/Mumoo/aggbug/178411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-11 14:58 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/11/178411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++  ListControl 插入数值的方法调用</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/07/177914.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Thu, 07 Jun 2012 06:38:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/07/177914.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/177914.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/07/177914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/177914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/177914.html</trackback:ping><description><![CDATA[<div>列表控件可以看作是功能增强的 ListBox，它提供了四种风格，而且可以同时显示一列的多中属性值。<br />MFC 中使用 CListCtrl 类来封装列表控件的各种操作。<br />创建一个窗口:可通过调用 BOOL Create( DWORD dwStyle, const RECT&amp; rect, CWnd* pParentWnd, UINT nID );<br />dwStyle 中可以使用以下一些列表控件的专用风格： <br />l LVS_ICON ,LVS_SMALLICON ,LVS_LIST, LVS_REPORT 这四种风格决定控件的外观，同时只可以选择其中一种，分别对应：大图标显示，小图标显示，列表显示，详细报表显示 <br /><br />l LVS_EDITLABELS 结点的显示字符可以被编辑，对于报表风格来讲可编辑的只为第一列。 <br />l LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点 <br />l LVS_SINGLESEL 同时只能选中列表中一项 <br /><span style="color: red">也可通过listcontrl对话框的 View 属性-&gt;Report <font color="#ff0000">设置<br /></font></span><br /><span style="color: red">设置为Report属性后，若要ListControl显示为列表状，则在Init函数中，添加：</span><br /><span style="color: red">ListView_SetExtendedListViewStyle(m_listctrl.m_hWnd, LVS_EX_GRIDLINES|LVS_EX_ONECLICKACTIVATE|LVS_EX_FULLROWSELECT);</span><br /><br />int InsertItem( int nItem, LPCTSTR lpszItem ); 插入行<br /><br />nItem：指明插入位置<br />lpszItem：为显示字符。<br />除 LVS_REPORT 风格外其他三种风格都只需要直接调用 InsertItem 就可以了，但如果使用报表风格就必须先设置列表控件中的列信息。<br /><br />int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem); 插入列<br /><br />iCol：为列的位置，从零开始<br />lpszColumnHeading：为显示的列名<br />nFormat：为显示对齐方式<br />nWidth：为显示宽度<br />nSubItem：为分配该列的列索引。 <br /><br />BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );设置每列的显示字符<br /><br />nItem：为行位置<br />nSubItem：为列位置<br />lpszText：为显示字符<br /><br />下面的代码演示了如何设置多列并插入数据： <br />m_list.SetImageList(&amp;m_listSmall,LVSIL_SMALL);//设置 ImageList<br />m_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//设置列<br />m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1);<br />m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2);<br /><br />m_list.InsertItem(0,"Item 1_1");//插入行<br />m_list.SetItemText(0,1,"Item 1_2");//设置该行的不同列的显示字符<br />m_list.SetItemText(0,2,"Item 1_3")<br /><br /></div> <img src ="http://www.cppblog.com/Mumoo/aggbug/177914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-07 14:38 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/07/177914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++  TinyXML的使用</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/06/177810.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Wed, 06 Jun 2012 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/06/177810.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/177810.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/06/177810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/177810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/177810.html</trackback:ping><description><![CDATA[<div>读取XML文件：TiXmlDocument XmlDoc(sJobXML);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!XmlDoc.LoadFile())<br />&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG("GetJobXMLInfo:加载XML文件%s失败", sJobXML);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />获取根结点：TiXmlElement* rootElement = XmlDoc.RootElement();&nbsp;<br /><br />获取根结点的第一个标签值：TiXmlElement* pElement= rootElement-&gt;FirstChildElement();&nbsp; <br /><br />获取标签值的第一个键值：&nbsp;TiXmlElement* pChildElement= pElement-&gt;FirstChildElement();&nbsp;<br /><br />获取该键值的所有属性值：while ( pChildElement)&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;{<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;TiXmlAttribute* pAttribute= pChildElement-&gt;FirstAttribute(); //键值的第一个属性值<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;while ( pAttribute)&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;{<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;&nbsp;&nbsp;&nbsp;&nbsp;// pAttribute-&gt;Name() &#8212;&#8212;属性名称；pAttribute-&gt;Value()&#8212;&#8212;属性值<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;&nbsp;&nbsp;&nbsp;pAttribute= pAttribute-&gt;Next();&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;}<br /><br />获取键值的第一个子属性值&nbsp;&nbsp;&nbsp;TiXmlElement* pSecElement = pChildElement-&gt;FirstChildElement();<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;//pSecElement -&gt;GetText()&#8212;&#8212;子属性的属性值<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;依次获取键值的n个子属性值&nbsp;&nbsp; TiXmlElement* pChildElement= pChildElement-&gt;NextSiblingElement();<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;}</div><img src ="http://www.cppblog.com/Mumoo/aggbug/177810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-06 17:27 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/06/177810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CString、BSTR和LPCTSTR之间的区别（转）</title><link>http://www.cppblog.com/Mumoo/archive/2012/06/04/177414.html</link><dc:creator>Mumoo</dc:creator><author>Mumoo</author><pubDate>Mon, 04 Jun 2012 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/Mumoo/archive/2012/06/04/177414.html</guid><wfw:comment>http://www.cppblog.com/Mumoo/comments/177414.html</wfw:comment><comments>http://www.cppblog.com/Mumoo/archive/2012/06/04/177414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Mumoo/comments/commentRss/177414.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Mumoo/services/trackbacks/177414.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><br />&nbsp;CString cstr(asdd);<br />&nbsp;const char* ch = (LPCTSTR)cstr;</p>
<p>&nbsp;CString.format("%s", char*);</p>
<p>&nbsp;CString cstr(asdd);<br />&nbsp;const char* ch = (LPCTSTR)cstr;</p>
<p>&nbsp;char* = (LPTSTR)(LPCTSTR)cstr</p>
<p><br />一、定义</p>
<p>1、CString：动态的TCHAR数组。它是一个完全独立的类，封装了+等操作符和字符串操作方法。</p>
<p>2、BSTR：专有格式的字符串（需要使用系统函数来操纵）。定义为：typedef OLECHAR FAR* BSTR</p>
<p>3、LPCTSTR：常量的TCHAR指针。定义为：typedef const char* LPCTSTR</p>
<p>二、要点</p>
<p>1、char*：指向ANSI字符数组的指针，其中每个字符占8位（有效数据是除掉最高位的其他七位），它保持</p>
<p>了与传统C/C++的兼容。</p>
<p>2、LPSTR：指向一个以&#8220;\0&#8221;结尾的ANSI字符数组的指针，可与char*互换使用，它通常在Win32中使用。</p>
<p>其中LP表示长指针（long pointer）。</p>
<p>3、LPCSTR：该数据类型的特性在于它的实例不能被使用它的API函数改变，除此之外与LPSTR等同。其</p>
<p>中C表示常量（CONSTANT）。</p>
<p>4、在Win16下长指针（LP）和短指针（P）有区别，而在Win32下它们是没有区别的，都是32位。</p>
<p>5、TCHAR在采用Unicode方式下编译时为wchar_t，在普通编码方式下编译时位char。</p>
<p>三、Unicode标准</p>
<p>1、为了满足程序代码国际化的需要，业界推出了Unicode标准，它提供了一种简单和一致的表示字符串的</p>
<p>方法，所有字符中的字节都是16位（两个字节）的值，其数量也可以满足几乎世界上所有书面语言字符的</p>
<p>编码需求，开发程序时使用Unicode（类型位wchar_t）是一种被鼓励的做法。</p>
<p>2、LPWSTR和LPCWSTR由此产生，它们的含义类似于LPSTR和LPCSTR，不同的是字符数据wchar_t为</p>
<p>16位，而char却为8位。</p>
<p>四、TCHAR数据类型</p>
<p>TCHAR数据类型是为了实现ANSI和Unicode两种编码的通用而提出来的</p>
<p>1、如果定义了_UNICODE，则声明如下：</p>
<p>typedef wchar_t TCHAR;</p>
<p>2、如果没有定义_UNICODE，则声明如下：</p>
<p>typedef char TCHAR;</p>
<p>这样就可以让CString、LPTSTR和LPCTSTR中的每个字符都是TCHAR类型，而不考虑它们的编码格</p>
<p>式。而且CString是一个封装好了的类，更是大大地方便了用户的使用。</p>
<p>五、VC++中常用数据类型之间的转换</p>
<p>1、定义</p>
<p>int i=100;</p>
<p>long l=2001;</p>
<p>float f=300.2;</p>
<p>double d=12345.119</p>
<p>char username[]="2008北京奥运";</p>
<p>char temp[200];</p>
<p>char* buf;</p>
<p>CString str;</p>
<p>_variant_t v1;</p>
<p>_bstr_t v2;</p>
<p>2、其他数据类型到字符串的转换</p>
<p>(1)短整形int-&gt;字符串</p>
<p>itoa(i,temp,10); //按十进制把i转换为字符串存入temp中</p>
<p>itoa(i,temp,2); //按二进制把i转换为字符串存入temp中</p>
<p>(2)长整形long-&gt;字符串</p>
<p>ltoa(l,temp,10);</p>
<p>3、从其他包含了字符串的变量中获取指向该字符串的指针</p>
<p>(1)从CString变量中获取字符串</p>
<p>str="祈福四川";</p>
<p>buf=(LPSTR)(LPCTSTR)str;</p>
<p>(2)从BSTR类型的_varitant_t变量中获取字符串</p>
<p>v1=(_bstr_t)"程序员";</p>
<p>buf=_com_util::ConvertBSTRToString((_bstr_t)v1);</p>
<p>4、字符串转换为其他数据类型</p>
<p>strcpy(temp,"123");</p>
<p>(1)i=atoi(temp); //字符串-&gt;短整型int</p>
<p>(2)l=atol(temp); //字符串-&gt;长整形long</p>
<p>(3)d=atof(temp); //字符串-&gt;浮点型double</p>
<p>5、其他数据类型转换到CString</p>
<p>(1)使用CString的成员函数Format来转换</p>
<p>A：str.Format("%d",i); //短整型int-&gt;CString</p>
<p>B：str.Format("%f",f); //浮点数float-&gt;CString</p>
<p>(2)支持CString构造函数的数据类型可以直接赋值，例如char*</p>
<p>str=username;</p>
<p>六、BSTR、_bstr_t和CCombBSTR</p>
<p>BSTR：指向字符串的32位指针，_bstr_t和CComBSTR都是对它的封装。</p>
<p>1、char*-&gt;BSTR的转换</p>
<p>BSTR b=_com_util::ConvertStringToBSTR("数据");</p>
<p>注：使用之前需要加上comutil.h头文件</p>
<p>2、BSTR-&gt;char*的转换</p>
<p>char* p=_com_util::ConvertBSTRToString(b);</p>
<p>七、VARIANT、_variant_t和COleVariant</p>
<p>1、对于VARIANT变量的赋值：首先给vt成员赋值，指明数据类型。再对联合结构中相同数据类型的变量赋</p>
<p>值（可参考VC98\Inlude\OAIDL.H头文件中关于tagVARIANT结构体的定义）。举例如下：</p>
<p>VARIANT va;</p>
<p>va.vt=VT_l4; //指明数据类型</p>
<p>va.lVal=2008;</p>
<p>2、对于不马上赋值的VARIANT，最好先使用void VariantInit(VARIANTARG FAR* pvarg)函数对其进行初始</p>
<p>化，其本质是将vt设置为VT_EMPTY。vt与常用数据类型的对应关系（略）。</p>
<p>3、_variant_t是VARIANT的封装类，赋值可以使用强制类型转换，其构造函数会自动处理这些数据类型。</p>
<p>例如：</p>
<p>long l=222;</p>
<p>int i=100;</p>
<p>_variant_t lVal(l);</p>
<p>lVal=(long)i;</p>
<p>4、COleVariant与_variant_t的使用方法基本一样，示例如下：</p>
<p>COleVariant v3="字符串",v4=(long)1999;</p>
<p>CString str=(BSTR)v3.pbstrVal;</p>
<p>long l=v4.lVal;</p>
<p>八、其他</p>
<p>1、对消息的处理中，我们通常需要将WPARAM或LPARAM等32位数据（DWORD）分解成两个16位数据</p>
<p>（WORD），例如：</p>
<p>LPARAM lParam;</p>
<p>WORD loValue=LOWORD(lParam); //取低16位</p>
<p>WORD hiValue=HIWORD(lParam); //取高16位</p>
<p>2、对于16位的数据（WORD），我们可以使用同样的方法分解成高低两个8位的数据（BYTE），例如：</p>
<p>WORD wValue; </p>
<p>BYTE loValue=LOBYTE(wValue); //取低8位</p>
<p>BYTE hiValue=HIBYTE(wValue); //取高8位</p>
<p>3、如何将CString类型的变量赋给char*类型的变量</p>
<p>(1)CString::GetBuffer函数</p>
<p>char* p;</p>
<p>CString str="hello";</p>
<p>p=str.GetBuffer(str.GetLength());</p>
<p>str.ReleaseBuffer();</p>
<p>(2)strcpy函数</p>
<p>CString str("aaaaaaaa");</p>
<p>strcpy(str.GetBuffer(10),"aa");</p>
<p>str.ReleaseBuffer();</p>
<p>GetBuffer(int n)函数用于获取字符数组，其中n表示字符数组的长度，使用完该字符数组之后一定要调用</p>
<p>ReleaseBuffer()函数来释放这个字符数组。</p>
<p>注：在能够使用const char*的地方，通常不要使用char*</p>
<p>(3)memcpy函数</p>
<p>CString mCS=_T("cxl");</p>
<p>char mch[20];</p>
<p>memcpy(mch,mCS,20);</p>
<p>(4)LPCTSTR强制类型转换（不建议使用）</p>
<p>char* ch;</p>
<p>CString str;</p>
<p>ch=(LPSTR)(LPCTSTR)str;</p>
<p>str="good!";</p>
<p>sprintf(ch,"%s",(LPTSTR)(LPCTSTR)str);</p>
<p>(5)CString-&gt;LPTSTR-&gt;char*</p>
<p>CString Msg;</p>
<p>Msg=Msg+"abc";</p>
<p>LPTSTR lpsz;</p>
<p>lpsz=new TCHAR[Msg.GetLength()+1];</p>
<p>_tcscpy(lpsz,Msg);</p>
<p>char* psz;</p>
<p>strcpy(psz,lpsz);</p>
<p>4、如何将CString类型的变量赋给const char*类型的变量</p>
<p>char* a[100];</p>
<p>CString str("abcdef");</p>
<p>strncpy(a,(LPCTSTR)str,sizeof(a));</p>
<p>或</p>
<p>strncpy(a,str,sizeof(a));</p>
<p>注：编译器会自动将CString类型的变量转换为const char*类型</p>
<p>5、如何将CString类型的变量赋给LPCTSTR类型的变量</p>
<p>CString cStr;</p>
<p>const char* lpctStr=(LPCTSTR)cStr;</p>
<p>6、如何将LPCTSTR类型的变量赋给CString类型的变量</p>
<p>LPCTSTR lpctStr;</p>
<p>CString cStr=lpctStr;</p>
<p>7、如何将char*类型的变量赋给CString类型的变量</p>
<p>(1)直接赋值：CString myString="This is a test";</p>
<p>(2)构造函数：CString s1("Tom");</p>
<p>8、如何将CString类型的变量赋给char[]（字符串）类型的变量</p>
<p>(1)sprintf函数</p>
<p>CString str="good!";</p>
<p>char temp[200];</p>
<p>sprintf(temp,"%s",(LPCSTR)str);</p>
<p>注：强制类型转换(LPCSTR)str与(LPTSTR)(LPCTSTR)str等同，使用的区别仅在于CString对象是变量</p>
<p>还是常量。LPCTSTR表示const char*，它得到的字符串是不可写的！如果将其强制转换位LPTSTR（去</p>
<p>掉const），是极为危险的！要得到char*，应该使用GetBuffer或GetBufferSetLength函数，用完之后再调</p>
<p>用ReleaseBuffer函数。</p>
<p>(2)strcpy函数</p>
<p>CString str;</p>
<p>char c[256];</p>
<p>strcpy(c,str);</p>
<p>str="Hello";</p>
<p>strcpy((char*)&amp;c,(LPCTSTR)str);</p>
<p>九、关于CString的使用</p>
<p>1、指定CString形参</p>
<p>(1)对于大多数需要字符串参数的函数，最好将函数原型中的形参指定为一个指向字符（LPCTSTR），而非</p>
<p>CString的const指针。当将形参指定为指向字符的const指针时，可将指针传递到TCHAR数组（如字符串["hi</p>
<p>here"]或传递到CString对象）。CString对象将自动转换成LPCTSTR。任何能够使用LPCTSTR的地方也能</p>
<p>够使用CString对象。</p>
<p>(2)如果某个形参将不会被修改，则也将该参数指定为常量字符串引用（const CString&amp;）。如果函数要修改</p>
<p>该字符串，则删除const修饰符。如果需要默认为空值，则将其初始化为空字符串（[""]），如下所示：</p>
<p>void AddCustomer(const CString&amp; name,const CString&amp; address,const CString&amp; comment="");</p>
<p>(3)对于大多数函数的结果，按值返回CString对象即可。</p>
<p>2、串的基本运算</p>
<p>char s1[20]="dir/bin/appl",s2[20]="file.asm",s3[30],*p;</p>
<p>int result;</p>
<p>(1)求串长</p>
<p>int strlen(char* s); //求串s的长度</p>
<p>例：printf("%d",strlen(s1));</p>
<p>(2)串复制</p>
<p>char* strcpy(char* to,char* from); //将from串复制到to串中，并返回to开始处的指针</p>
<p>例：strcpy(s3,s1);</p>
<p>(3)串联接</p>
<p>char* strcat(char* to,char* from); //将from串复制到to串的末尾</p>
<p>例：strcat(s3,"/");</p>
<p>strcat(s3,s2);</p>
<p>(4)串比较</p>
<p>int strcmp(char* s1,char* s2); //比较s1和s2的大小，s1&lt;s2（小于0）、s1=s2（0）和s1&gt;s2（大于0）</p>
<p>例：result=strcmp("baker","Baker"); //大于0</p>
<p>result=strcmp("12","12"); //等于0</p>
<p>result=strcmp("Joe","joseph"); //小于0</p>
<p>(5)字符定位</p>
<p>char* strchr(char* s,char c); //找c在字符串s中第一次出现的位置。若找到，则返回该位置；否则NULL。</p>
<p>例：p=strchr(s2,'.'); //p指向"file"之后的位置</p>
<p>(6)注意</p>
<p>A：上述操作是最基本的，其中后4个操作还有变种形式：strncpy、strncath和strnchr。</p>
<p>B：其他的串操作见C的&lt;string.h&gt;头文件。在不同的高级语言中，对串运算的种类及符号都不尽相同。</p>
<p>C：其余的串操作一般可由这些基本操作组合而成。</p>
<p>例：求子串的操作可如下实现</p>
<p>//s和sub是字符数组，用sub返回串s的第pos个字符长度为len的子串</p>
<p>void substr(char* sub,char* s,int pos,int len)</p>
<p>{</p>
<p>//其中0&lt;=pos&lt;=strlen(s)-1，且数组sub至少可容纳len+1个字符</p>
<p>if(pos&lt;0 || pos&gt;strlen(s)-1 ||len&lt;0)</p>
<p>Error("parameter error!");</p>
<p>//从s[pos]起复制至多len个字符到sub</p>
<p>strncpy(sub,*s[pos],len);</p>
<p>}</p><img src ="http://www.cppblog.com/Mumoo/aggbug/177414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Mumoo/" target="_blank">Mumoo</a> 2012-06-04 09:05 <a href="http://www.cppblog.com/Mumoo/archive/2012/06/04/177414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>