﻿<?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++博客-奔向C++-随笔分类-MFC学习笔记</title><link>http://www.cppblog.com/zhaoyg/category/12443.html</link><description>记录点滴，成就未来</description><language>zh-cn</language><lastBuildDate>Mon, 10 Jan 2011 05:38:26 GMT</lastBuildDate><pubDate>Mon, 10 Jan 2011 05:38:26 GMT</pubDate><ttl>60</ttl><item><title>目录扫描</title><link>http://www.cppblog.com/zhaoyg/archive/2011/01/09/138212.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 09 Jan 2011 12:44:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2011/01/09/138212.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/138212.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2011/01/09/138212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/138212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/138212.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在做一个东西时需要扫描目录下所有图片，于是就产生了如下的东西给定速要扫描的路径，则以其为根目录扫描其下所有目录和文件，并且还可以设定扫描的深度P.S.: 1. 扫描是递归实现的，所以缺点很明显。2. 在扫描过程中会用到用户指定的回调函数，并且会将文件类型和名字一并传入，以便用户自行决定是否需要将其添加到tree控件中。头文件#include&#160;functional>class&#160...&nbsp;&nbsp;<a href='http://www.cppblog.com/zhaoyg/archive/2011/01/09/138212.html'>阅读全文</a><img src ="http://www.cppblog.com/zhaoyg/aggbug/138212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2011-01-09 20:44 <a href="http://www.cppblog.com/zhaoyg/archive/2011/01/09/138212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我也来说说透明静态文本框的实现</title><link>http://www.cppblog.com/zhaoyg/archive/2010/11/14/133590.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 14 Nov 2010 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/11/14/133590.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/133590.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/11/14/133590.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/133590.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/133590.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt">Google一下&#8220;透明静态文本框&#8221;，给出的大多数都是靠如下代码来实现的：<br></span><br>
<div style="BORDER-BOTTOM: #ff0000 1px solid; BORDER-LEFT: #ff0000 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #ffcc99; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #ff0000 1px solid; BORDER-RIGHT: #ff0000 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">HBRUSH&nbsp;CTransparentLabelDlg::OnCtlColor(CDC</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pDC,&nbsp;CWnd</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pWnd,&nbsp;UINT&nbsp;nCtlColor)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;HBRUSH&nbsp;hbr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CDialog::OnCtlColor(pDC,&nbsp;pWnd,&nbsp;nCtlColor);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(CTLCOLOR_STATIC&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;nCtlColor)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetBkMode(TRANSPARENT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(HBRUSH)GetStockObject(NULL_BRUSH);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;&nbsp;如果默认的不是所需画笔，则返回另一个画笔</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;hbr;<br>}<br></span></div>
<br><span style="FONT-SIZE: 14pt">效果如图：<br></span>&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;&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; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/1.png" width=456 height=277><br><br><span style="FONT-SIZE: 14pt">在大多数情况下这种方法都没问题，但是，当需要动态更改静态文本框中的内容时就会出现这样的问题：<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/3.png" width=888 height=217><br><span style="FONT-SIZE: 14pt">也就是出现了文字重叠现象。<br><br>其原因出在&#8220;透明&#8221;身上。一般情况下在绘制界面时会先绘制对话框的背景然后才会绘制子控件，而子控件通常都会自绘其背景的，于是子控件绘制完之后就会盖住对话框原先所绘制的一部分内容，所以&#8220;透明&#8221;效果就是靠禁止子控件自绘背景而实现的。<br><br>了解了&#8220;透明&#8221;后，再来回到刚才的问题上。因为现在静态文本框不会去擦除背景而只是绘制出文字，于是之前的&#8220;测试&#8221;就会残留在对话框背景上，只有引起对话框背景重绘时才能去掉。于是，我们应该在设置完文本框的文字后再让对话框重绘背景才行。<br>修改一下&#8220;更改文本&#8221;按钮响应函数：<br></span>
<div style="BORDER-BOTTOM: #ff0000 1px solid; BORDER-LEFT: #ff0000 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #ffcc99; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; COLOR: #ffffff; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #ff0000 1px solid; BORDER-RIGHT: #ff0000 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CTransparentLabelDlg::OnBnClickedButton1()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItemText(IDC_EDIT1&nbsp;,&nbsp;tmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;SetDlgItemText(IDC_STATIC1&nbsp;,&nbsp;tmp);<br><br>&nbsp;&nbsp;&nbsp; //&nbsp;一下为新添加内容。只需局部重绘背景即可<br>&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;rect;<br>&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_STATIC1)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowRect(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br>&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br>&nbsp;&nbsp;&nbsp;&nbsp;InvalidateRect(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br>&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow();<br><br>}</span></div>
<span style="FONT-SIZE: 14pt">效果如图：<br></span>&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; <img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/5.png" width=888 height=217> <br><br><span style="FONT-SIZE: 14pt">这样一来就更好的实现了&#8220;透明&#8221;。<br><br>以上只是小弟的一些理解，如果有什么地方说的不对，或者你有更好的方法来实现&#8220;透明&#8221;，还望告知，小弟先谢过了 : P</span> 
<img src ="http://www.cppblog.com/zhaoyg/aggbug/133590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-11-14 15:34 <a href="http://www.cppblog.com/zhaoyg/archive/2010/11/14/133590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]用MFC编制Windows打印程序</title><link>http://www.cppblog.com/zhaoyg/archive/2010/07/15/120496.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 15 Jul 2010 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/07/15/120496.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/120496.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/07/15/120496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/120496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/120496.html</trackback:ping><description><![CDATA[文档打印是许多Windows程序所必需的，在DOS下进行图形方面的打印是件比较麻烦的事，幸好Windows提供了统一接口，将程序员与具体的硬件系统隔离开来。同时Visual &nbsp; C++ &nbsp; MFC（微软基础类库）则将Windows的API函数以类的形式封装了很多细节，使得许多烦琐的工作变得轻松起来。 &nbsp; <br><br>一般来说，用Visual &nbsp; C++编制需要打印的程序时，在用AppWizard生成工程文件时就加入打印和打印预览选项（该选项在AppWizard的第四步）。若用手工加入，则稍微麻烦些。 &nbsp; <br><br>MFC对于打印的支持是在视类CView中实现的，该类中有如下几个成员函数是与打印或打印预览有关的： &nbsp; <br><br>BOOL &nbsp; OnPreparePrinting(CPrintInfopInfo) &nbsp; <br><br>void &nbsp; OnBeginPrinting(CDCpDC, &nbsp; CPrintInfopInfo) &nbsp; <br><br>void &nbsp; OnPrepareDC(CDCpDC, &nbsp; CPrintInfopInfo) &nbsp; <br><br>void &nbsp; OnPrint(CDCpDC, &nbsp; CPrintInfopInfo) &nbsp; <br><br>void &nbsp; OnEndPrinting(CDCpDC, &nbsp; CPrintInfopInfo) &nbsp; <br><br>其中，pDC是打印或显示的设备场指针，pInfo是打印过程信息指针。pInfo包含许多有用的信息，如打印的总页数、当前打印页的页码、是打印还是打印预览、是否继续打印等，具体参数内容和意义可以参考MFC联机手册。 &nbsp; <br><br>以上几个函数都是虚函数，可以重载。若在用AppWizard生成工程文件时选择了打印和打印预览选项，则函数OnPreparePrinting、OnBeginPrinting、OnEndPrinting自动地被AppWizard插入到你的视类中加以重载。另外两个函数则可以手工加入，如果使用的是Visual &nbsp; C++ &nbsp; 4.0以上版本，可以通过ClassWizard加入到视类中。 &nbsp; <br><br>这几个函数在用户选择打印命令时由应用框架自动调用，用户程序不用显式调用。下面讲述这几个函数在打印过程中的调用顺序及其意义。 &nbsp; <br><br>1.OnPreparePrinting &nbsp; <br><br>OnPreparePrinting函数最先被调用，用来初始化打印机等。比如，若没有安装打印机，则该函数将提示用户安装打印机。用户程序可以向其中加入别的初始化代码，比如，计算打印你的文档所需要的总页数，然后调用视类中的打印机初始化函数BOOL &nbsp; DoPreparePrinting(CPrintInfopInfo)即可。而用AppWizard生成的代码中，OnPreparePrinting函数将只是调用函数DoPreparePrinting，并传递参数。 &nbsp; <br><br>2.OnBeingPrinting &nbsp; <br><br>OnBeingPrinting函数是开始打印文档前调用的函数，用户可以在其中加入另一些对于打印过程的初始化代码，比如分配打印过程中将要使用的&#8220;笔&#8221;（CPen）、&#8220;刷子&#8221;（CBrush）等，默认的代码中该函数将直接返回。 &nbsp; <br><br>3.OnEndPrinting &nbsp; <br><br>OnEndPrinting函数是与OnBeginPrinting函数相对应的函数，它在打印完成后由应用框架调用，用于释放在OnBeginPrinting中分配的&#8220;对象&#8221;，如&#8220;笔&#8221;、&#8220;刷子&#8221;等，其默认的代码中该函数将直接返回。 &nbsp; <br><br>4.OnPrepareDC &nbsp; <br><br>OnPrepareDC函数用于在打印前准备打印设备场，如窗口大小、原点，视图大小、原点等。同时该函数在视类显示文档内容时也被调用，默认的代码中该函数调用基类中的OnPrepareDC函数。 &nbsp; <br><br>5.OnPrint &nbsp; <br><br>OnPrint函数则是具体的打印过程，它利用前面准备好的设备场进行打印。 &nbsp; <br><br>这几个函数中，OnPreparePrinting、OnBeginPrinting、OnEndPrinting函数在一次打印过程中将只被调用一次，不管这一次打印内容有多少页，而OnPrepareDC、OnPrint函数则每打印一页都将被调用一次，这种调用次序对于打印是很有用的。 &nbsp; <br><br>在编程中，相信大家只要用好这几个基本函数，一定会编制出满意的Windows打印程序。 <br>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/120496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-07-15 23:53 <a href="http://www.cppblog.com/zhaoyg/archive/2010/07/15/120496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让进度条接收鼠标双击消息</title><link>http://www.cppblog.com/zhaoyg/archive/2010/05/06/114707.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 06 May 2010 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/05/06/114707.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/114707.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/05/06/114707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/114707.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/114707.html</trackback:ping><description><![CDATA[<p>（按我的观点）一般来讲进度条就是用来显示进度的，也就是说，除了设置进度外，估计不再需要和用户有什么交互了，但是近来在做一个东西的时候需要完成这样的功能，就是用进度条显示文件的读取进度，并且可以<span style="COLOR: red">通过双击进度条来对文件进行&#8220;跳读&#8221;</span>。<br>对于双击进度条，当初心想，添加一个WM_LBUTTONDBLCLK 响应函数就是了，但后来发现进度条中没有这个消息。于是就想那就在PreTranslateMessage中截获进度条的WM_LBUTTONDBLCLK 消息，但实验后发现PreTranslateMessage并不能截到这个消息。<br>后来在MSDN中对于WM_LBUTTONDBCLICK消息有这么一行文字：<br>&#8220;<br>Only windows that have the <strong>CS_DBLCLKS</strong>&nbsp;<mshelp:link tabIndex=0 keywords="_win32_WNDCLASS_str">WNDCLASS</mshelp:link> style will receive <strong>OnLButtonDblClk</strong> calls<br>&#8221;。<br><br>看到这行文字后，我便认为是进度条的wndclass对象中没有CS_DBCLKS，经下面代码确认，证明了我的正确</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">&nbsp;LONG&nbsp;style&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetClassLong(m_ProcessCtrl.GetSafeHwnd()&nbsp;,&nbsp;GCL_STYLE);<br>&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;val&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;style&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;CS_DBLCLKS;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;val&nbsp;为false说明进度条真的没有CS_DBLCLKS</span></div>
<p><br>为了让进度条可以获取鼠标双击，只需在OnInitDialog中加入如下两行代码便可以了：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">&nbsp;LONG&nbsp;style&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetClassLong(m_ProcessCtrl.GetSafeHwnd()&nbsp;,&nbsp;GCL_STYLE);<br>&nbsp;SetClassLong(m_ProcessCtrl.GetSafeHwnd()&nbsp;,&nbsp;GCL_STYLE&nbsp;,&nbsp;style&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;CS_DBLCLKS&nbsp;);</span></div>
在PreTranslateMessage中加入<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">BOOL&nbsp;CDataAnalyzerDlg::PreTranslateMessage(MSG</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pMsg)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(pMsg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hwnd&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;m_ProcessCtrl.m_hWnd&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;WM_LBUTTONDBLCLK&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;pMsg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">message)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(m_isStartRead)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008000">&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;........<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;........</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ProcessCtrl.SetPos(offset</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;CDialog::PreTranslateMessage(pMsg);<br>}</span></div>
<br>有了上面的代码，问题就解决了。<br><br>P.S.:<br>&nbsp;当然通过继承一个进度条类，然后在那个派生类中接收WM_LBUTTONDBLCLK也应该是可以的。 
<img src ="http://www.cppblog.com/zhaoyg/aggbug/114707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-05-06 22:24 <a href="http://www.cppblog.com/zhaoyg/archive/2010/05/06/114707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]VC++中 PostMessage和SendMessage的区别</title><link>http://www.cppblog.com/zhaoyg/archive/2010/03/07/109096.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 07 Mar 2010 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/03/07/109096.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/109096.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/03/07/109096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/109096.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/109096.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#003366" size="3">1， PostMessage只把消息放入队列，不管其他程序是否处理都返回，然后继续执行，这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回，继续执行，这是个同步消息投放函数。而且，PostMessage的返回值表示PostMessage函数执行是否正确；而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。 </font>
		</p>
		<p>
				<font color="#003366" size="3">2， 如果在同一个线程内，PostMessage发送消息时，消息要先放入线程的消息队列，然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时，系统直接调用目标窗口的消息处理程序，并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列，然后发送消息的线程等待(事实上，他应该还在做一些监测工作，比如监视QS_SENDMESSAGE标志)，直到目标窗口处理完并且结果返回，发送消息的线程才继续运行。这是SendMessage的一般情况，事实上，处理过程要复杂的多。比如，当发送消息的线程监测到有别的窗口SendMessage一个消息到来时，他直接调用窗口处理过程(重入)，并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。 </font>
		</p>
		<p>
				<font color="#003366" size="3">3， msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.</font>
		</p>
		<p>
				<font color="#003366" size="3">如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针，那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。</font>
		</p>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/109096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-03-07 11:47 <a href="http://www.cppblog.com/zhaoyg/archive/2010/03/07/109096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个很弱的托盘类</title><link>http://www.cppblog.com/zhaoyg/archive/2010/02/01/106955.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Mon, 01 Feb 2010 10:10:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/02/01/106955.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/106955.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/02/01/106955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/106955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/106955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很弱的托盘类&nbsp;&nbsp;<a href='http://www.cppblog.com/zhaoyg/archive/2010/02/01/106955.html'>阅读全文</a><img src ="http://www.cppblog.com/zhaoyg/aggbug/106955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-02-01 18:10 <a href="http://www.cppblog.com/zhaoyg/archive/2010/02/01/106955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MFC中基于对话框的程序启动后自动隐藏</title><link>http://www.cppblog.com/zhaoyg/archive/2010/01/26/106491.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Tue, 26 Jan 2010 14:33:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/01/26/106491.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/106491.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/01/26/106491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/106491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/106491.html</trackback:ping><description><![CDATA[<p>本文简单介绍一下VC中基于对话框的程序启动后的自动隐藏技术。<br><br>有的程序需要在启动后立即隐藏主窗口，只在系统托盘区域显示一个图标，这常见于很多后台服务程序。对于基于对话框的程序，要实现此功能需要一点技巧。<br><br>&nbsp; &nbsp; 该技术的关键点在于，需要使用非模态对话框，而不是默认的模态对话框。模态对话框的DoModal()事实上执行了对话框的创建、显示、消息循环等一系列过程。我们这里要做的就是把这个过程重现，并控制中间的显示过程来达到我们隐藏主窗口的目的。现实起来非常简单，我们只需要把CXXXApp中的InitInstance()函数中默认的对话框显示代码：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">BOOL&nbsp;CXXXApp::InitInstance()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;其它代码<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;主窗口对话框实例</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CXXXDlg&nbsp;dlg;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dlg;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;模态对话框</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dlg.DoModal();<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br>}</span></div>
<br>改变为如下代码即可，其它地方的代码完全不用修改：<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">BOOL&nbsp;CXXXApp::InitInstance()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;其它代码<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;主窗口对话框实例</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CXXXDlg&nbsp;dlg;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pMainWnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dlg;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;非模态对话框</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dlg.Create(CXXXDlg::IDD);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;dlg.DoSomethingBeforeMsgLoop();&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;可以在此函数隐藏窗口及执行其它操作</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;dlg.RunModalLoop();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;FALSE;<br>}<br></span></div>
<p>在上面的代码中，可以在DoSomethingBeforeMsgLoop()函数中使用ShowWindow()来隐藏窗口，同时还可以执行其它一些操作，也可以直接在DoSomethingBeforeMsgLoop()函数调用处调用ShowWindow()函数来隐藏窗口。</p>
<p>&nbsp;&nbsp;&nbsp; 也有人提出了其它方法。比如仍然使用模态对话框，但使用计数器设定很短一个时间来触发事件，并在处理该计数器事件中隐藏窗口。该方法可行，但太麻烦，没有上面的方法方便。</p>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/106491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-01-26 22:33 <a href="http://www.cppblog.com/zhaoyg/archive/2010/01/26/106491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件名批量修改器</title><link>http://www.cppblog.com/zhaoyg/archive/2010/01/12/105493.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Tue, 12 Jan 2010 10:53:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/01/12/105493.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/105493.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/01/12/105493.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/105493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/105493.html</trackback:ping><description><![CDATA[起因：<br>&nbsp; 本人硬盘里攒了不少的壁纸，但这些图像文件的名字都各自为政，没有统一的格式，当有新的图片进行存放时常常会产生重名的问题。为了解决重名问题，于是才有了写这个&#8220;文件名批量修改器&#8221;的念头。虽然类似程序网上多如牛毛，但还是自己写了个，以来练练手。<br><br><br>程序界面<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/FileRenamer-userface.PNG" width=637 height=281><br><br><br>主要使用步骤说明：<br>&nbsp;&nbsp;&nbsp;1. 添加需要更名的文件<br>&nbsp;&nbsp; 2. 在"文件名格式"中输入含有通配符字符串"(*)"样式的文件名，例如"文件_(*)"<br>&nbsp;&nbsp; 3. 在"文件序列"的两个输入框中分别输入"起始"和"截止"的数值，以对文件进行编号。"截止"和"起始"的数值之差即为实际更名的文件数量，其余文件将不被更名。<br>&nbsp;&nbsp; 4. 在"通配符长"中输入一个数值，如果该数值大于文件编号的最大值的位数，则会加入数值零作为填充。<br>&nbsp;&nbsp; 5. 如果需要，还可以在"文件列表"中通过"上移"或"下移"来改变文件顺序，同时也可以移除某文件。<br><br><br><a title=源码下载 href="http://www.cppblog.com/Files/zhaoyg/FileRenamer_SRC.rar">源码下载</a><br><br>如果有任何意见或建议，请告知本人。 <br>EMAIL:&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#104;&#97;&#111;&#121;&#103;&#49;&#57;&#56;&#54;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">zhaoyg1986@gmail.com</a><br><br>使用图例：<br><br>为更名之前：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/before.PNG" width=511 height=437><br><br>进行更名：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/ing.PNG" width=674 height=437><br><br>更名后：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/zhaoyg/after.PNG" width=191 height=437>&nbsp;<br>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/105493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-01-12 18:53 <a href="http://www.cppblog.com/zhaoyg/archive/2010/01/12/105493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] MFC CListCtrl 使用介绍</title><link>http://www.cppblog.com/zhaoyg/archive/2010/01/12/105461.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Mon, 11 Jan 2010 16:19:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2010/01/12/105461.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/105461.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2010/01/12/105461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/105461.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/105461.html</trackback:ping><description><![CDATA[<p>列表控件可以看作是功能增强的ListBox，它提供了四种风格，而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用<br>BOOL Create( DWORD dwStyle, const RECT&amp; rect, CWnd* pParentWnd, UINT nID );创建一个窗口，dwStyle中可以使用以下一些列表控件的专用风格： </p>
<ul>
    <li>LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观，同时只可以选择其中一种，分别对应：大图标显示，小图标显示，列表显示，详细报表显示
    <li>LVS_EDITLABELS 结点的显示字符可以被编辑，对于报表风格来讲可编辑的只为第一列。
    <li>LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
    <li>LVS_SINGLESEL 同时只能选中列表中一项 </li>
</ul>
<p>首先你需要设置列表控件所使用的ImageList，如果你使用大图标显示风格，你就需要以如下形式调用： <br>CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); <br>如果使用其它三种风格显示而不想显示图标你可以不进行任何设置，否则需要以如下形式调用： <br>CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL); <br>通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项，lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用 InsertItem就可以了，但如果使用报表风格就必须先设置列表控件中的列信息。</p>
<p>通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位置，从零开始，lpszColumnHeading为显示的列名，nFormat为显示对齐方式， nWidth为显示宽度，nSubItem为分配给该列的列索引。 </p>
<p>在有多列的列表控件中就需要为每一项指明其在每一列中的显示字符，通过调用 <br>BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以设置每列的显示字符。nItem为设置的项的位置，nSubItem为列位置，lpszText为显示字符。下面的代码演示了如何设置多列并插入数据： </p>
<p>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>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>此外CListCtrl还提供了一些函数用于得到/修改控件的状态。 <br>COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/设置显示的字符颜色。 <br>COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/设置显示的背景颜色。 <br>void SetItemCount( int iCount );用于得到添加进列表中项的数量。 <br>BOOL DeleteItem(int nItem);用于删除某一项，BOOL DeleteAllItems( );将删除所有项。 <br>BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于设置背景位图。 <br>CString GetItemText( int nItem, int nSubItem );用于得到某项的显示字符。 </p>
<p>列表控件的消息映射同样使用ON_NOTIFY宏，形式如同：ON_NOTIFY( wNotifyCode, id, memberFxn )，wNotifyCode为通知代码，id为产生该消息的窗口ID，memberFxn为处理函数，函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult)，其中pNMHDR为一数据结构，在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为： </p>
<ul>
    <li>LVN_BEGINLABELEDIT 在开始某项编辑字符时发送，所用结构：NMLVDISPINFO
    <li>LVN_ENDLABELEDIT 在结束某项编辑字符时发送，所用结构：NMLVDISPINFO
    <li>LVN_GETDISPINFO 在需要得到某项信息时发送，（如得到某项的显示字符）所用结构：NMLVDISPINFO </li>
</ul>
<p>关于ON_NOTIFY有很多内容，将在以后的内容中进行详细讲解。 <br><br><strong>关于动态提供结点所显示的字符：</strong>首先你在项时需要指明lpszItem参数为： LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符，在处理该消息时先将参数 pNMHDR转换为LPNMLVDISPINFO，然后填充其中item.pszText。通过item中的iItem,iSubItem可以知道当前显示的为那一项。下面的代码演示了这种方法： </p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;szOut[</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">No.1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">No.2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">No.3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">};</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加结点</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">m_list.InsertItem(LPSTR_TEXTCALLBACK,<img src="http://www.cppblog.com/Images/dot.gif">)<br>m_list.InsertItem(LPSTR_TEXTCALLBACK,<img src="http://www.cppblog.com/Images/dot.gif">)<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">处理消息</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CParentWnd::OnGetDispInfoList(NMHDR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pNMHDR,&nbsp;LRESULT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pResult)<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;LV_DISPINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pLVDI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(LV_DISPINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pNMHDR;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;pLVDI</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">item.pszText</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">szOut[pTVDI</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">item.iItem];</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通过iItem得到需要显示的字符在数组中的位置&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p><br><strong>关于编辑某项的显示字符：</strong>（在报表风格中只对第一列有效）首先需要设置列表控件的 LVS_EDITLABELS风格，在开始编辑时该控件将会发送LVN_BEGINLABELEDIT，你可以通过在处理函数中返回TRUE来取消接下来的编辑，在编辑完成后会发送LVN_ENDLABELEDIT，在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO，然后通过其中的item.pszText得到编辑后的字符，并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息： </p>
<p>&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">处理消息&nbsp;LVN_BEGINLABELEDIT</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CParentWnd::OnBeginEditList(NMHDR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pNMHDR,&nbsp;LRESULT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pResult)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;LV_DISPINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pLVDI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(LV_DISPINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pNMHDR;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pLVDI</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">item.iItem</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断是否取消该操作</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">；<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">处理消息&nbsp;LVN_BEGINLABELEDIT</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CParentWnd::OnBeginEditList(NMHDR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pNMHDR,&nbsp;LRESULT</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pResult)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;LV_DISPINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pLVDI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(LV_DISPINFO</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pNMHDR;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pLVDI</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">item.pszText</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断是否已经取消取消编辑&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_list.SetItemText(pLVDI</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">item.iItem,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,pLVDI</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">pszText);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">重置显示字符&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p><br>上面讲述的方法所进行的消息映射必须在父窗口中进行（同样WM_NOTIFY的所有消息都需要在父窗口中处理）。 <br><strong>如何得到当前选中项位置：</strong>在列表控件中没有一个类似于ListBox中GetCurSel()的函数，但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到选中项位置。</p>
<p><br>下面是一些例子</p>
<p><br>作者：lixiaosan<br>时间：04/06/2006</p>
<p>以下未经说明，listctrl默认view 风格为report</p>
<p>相关类及处理函数</p>
<p>MFC：CListCtrl类</p>
<p>SDK：以 &#8220;ListView_&#8221;开头的一些宏。如 ListView_InsertColumn</p>
<p><br>--------------------------------------------------------------------------------</p>
<p><strong>1. CListCtrl 风格</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_ICON: 为每个item显示大图标<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_SMALLICON: 为每个item显示小图标<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_LIST: 显示一列带有小图标的item<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVS_REPORT: 显示item详细资料</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 直观的理解：windows资源管理器，&#8220;查看&#8221;标签下的&#8220;大图标，小图标，列表，详细资料&#8221;</p>
<p>&nbsp;</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>2. 设置listctrl 风格及扩展风格<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG lStyle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lStyle. = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lStyle. &amp;= ~LVS_TYPEMASK; //清除显示方式位<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lStyle.|= LVS_REPORT; //设置style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwStyle. = m_list.GetExtendedStyle();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwStyle.|= LVS_EX_FULLROWSELECT;//选中某行使整行高亮（只适用与report风格的listctrl）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwStyle.|= LVS_EX_GRIDLINES;//网格线（只适用与report风格的listctrl）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwStyle.|= LVS_EX_CHECKBOXES;//item前生成checkbox控件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetExtendedStyle(dwStyle); //设置扩展风格</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：listview的style请查阅msdn<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp</a></p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>3. 插入数据</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nRow = m_list.InsertItem(0, &#8220;11&#8221;);//插入行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetItemText(nRow, 1, &#8220;jacky&#8221;);//设置数据</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>4. 一直选中item</strong><br>&nbsp;&nbsp;&nbsp; 选中style中的Show selection always，或者在上面第2点中设置LVS_SHOWSELALWAYS</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>5. 选中和取消选中一行</strong><br>&nbsp;&nbsp;&nbsp; int nIndex = 0;<br>&nbsp;&nbsp;&nbsp; //选中<br>&nbsp;&nbsp;&nbsp; m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);<br>&nbsp;&nbsp;&nbsp; //取消选中<br>&nbsp;&nbsp;&nbsp; m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);<br>--------------------------------------------------------------------------------</p>
<p><strong>6. 得到listctrl中所有行的checkbox的状态</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;m_list.GetItemCount(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.Format(_T("第%d行的checkbox为选中状态"), i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>7. 得到listctrl中所有选中行的序号</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;m_list.GetItemCount(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.Format(_T("选中了第%d行"), i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法二：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POSITION pos = m_list.GetFirstSelectedItemPosition();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE0("No items were selected!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (pos)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.GetNextSelectedItem(pos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE1("Item %d was selected!\n", nItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // you could do your own processing on nItem here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>8. 得到item的信息</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCHAR szBuf[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVITEM lvi;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.iItem = nItemIndex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.iSubItem = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.mask = LVIF_TEXT;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.pszText = szBuf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvi.cchTextMax = 1024;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.GetItem(&amp;lvi);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于得到设置item的状态，还可以参考msdn文章<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Q173242: Use Masks to Set/Get Item States in CListCtrl<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://support.microsoft.com/kb/173242/en-us">http://support.microsoft.com/kb/173242/en-us</a></p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>9. 得到listctrl的所有列的header字符串内容<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVCOLUMN lvcol;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char str[256];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; nColNum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strColumnName[4];//假如有4列</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nColNum = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvcol.mask = LVCF_TEXT;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvcol.pszText = str;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvcol.cchTextMax = 256;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(m_list.GetColumn(nColNum, &amp;lvcol))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strColumnName[nColNum] = lvcol.pszText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nColNum++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>10. 使listctrl中一项可见，即滚动滚动条</strong><br>&nbsp;&nbsp;&nbsp; m_list.EnsureVisible(i, FALSE);<br>--------------------------------------------------------------------------------</p>
<p><strong>11. 得到listctrl列数<br></strong>&nbsp;&nbsp;&nbsp; int nHeadNum = m_list.GetHeaderCtrl()-&gt;GetItemCount();<br>--------------------------------------------------------------------------------</p>
<p><strong>12. 删除所有列<br></strong>&nbsp;&nbsp;&nbsp; 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( m_list.DeleteColumn (0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为你删除了第一列后，后面的列会依次向上移动。</p>
<p>&nbsp;&nbsp;&nbsp; 方法二：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nColumns = 4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=nColumns-1; i&gt;=0; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.DeleteColumn (i);</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>13. 得到单击的listctrl的行列号</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的NM_CLICK消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 方法一：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwPos = GetMessagePos();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.ScreenToClient(&amp;point);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVHITTESTINFO lvinfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.pt = point;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.flags = LVHT_ABOVE;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.SubItemHitTest(&amp;lvinfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nItem != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strtemp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(strtemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 方法二:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pNMListView-&gt;iItem != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strtemp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strtemp.Format("单击的是第%d行第%d列",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pNMListView-&gt;iItem, pNMListView-&gt;iSubItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox(strtemp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>14. 判断是否点击在listctrl的checkbox上</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的NM_CLICK消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwPos = GetMessagePos();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.ScreenToClient(&amp;point);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LVHITTESTINFO lvinfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.pt = point;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lvinfo.flags = LVHT_ABOVE;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT nFlag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.HitTest(point, &amp;nFlag);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断是否点在checkbox上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(nFlag == LVHT_ONITEMSTATEICON)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxMessageBox("点在listctrl的checkbox上");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>15. 右键点击listctrl的item弹出菜单</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的NM_RCLICK消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pNMListView-&gt;iItem != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwPos = GetMessagePos();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMenu menu;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VERIFY( menu.LoadMenu( IDR_MENU1 ) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMenu* popup = menu.GetSubMenu(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT( popup != NULL );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popup-&gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>}</p>
<p>&nbsp;<br>--------------------------------------------------------------------------------</p>
<p><strong>16. item切换焦点时(包括用键盘和鼠标切换item时)，状态的一些变化顺序</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加listctrl控件的LVN_ITEMCHANGED消息相应函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO: Add your control notification handler code here<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString sTemp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == LVIS_FOCUSED &amp;&amp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d losted focus",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == 0 &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == LVIS_FOCUSED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d got focus",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == LVIS_SELECTED &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d losted selected",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == 0 &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == LVIS_SELECTED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sTemp.Format("%d got selected",pNMListView-&gt;iItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pResult = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>--------------------------------------------------------------------------------</p>
<p><strong>17. 得到另一个进程里的listctrl控件的item内容</strong><br><a href="http://www.codeproject.com/threads/int64_memsteal.asp">http://www.codeproject.com/threads/int64_memsteal.asp</a></p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>18. 选中listview中的item</strong><br>Q131284: How To Select a Listview Item Programmatically<br><a href="http://support.microsoft.com/kb/131284/en-us">http://support.microsoft.com/kb/131284/en-us</a></p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>19. 如何在CListView中使用CListCtrl的派生类</strong><br><a href="http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/">http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/</a></p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>20. listctrl的subitem添加图标</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetItem(..); //具体参数请参考msdn</p>
<p>--------------------------------------------------------------------------------</p>
<p><strong>21. 在CListCtrl显示文件，并根据文件类型来显示图标</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网上找到的代码，share<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL CTest6Dlg::OnInitDialog()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDialog::OnInitDialog();<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIMAGELIST himlSmall;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIMAGELIST himlLarge;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHFILEINFO sfi;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char cSysDir[MAX_PATH];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strBuf;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(cSysDir, 0, MAX_PATH);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetWindowsDirectory(cSysDir, MAX_PATH);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBuf = cSysDir;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("<a href="file://%22)+1/">\\")+1</a>));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;sfi, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(SHFILEINFO), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHGFI_SYSICONINDEX | SHGFI_SMALLICON );<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;sfi, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(SHFILEINFO), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHGFI_SYSICONINDEX | SHGFI_LARGEICON);<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (himlSmall &amp;&amp; himlLarge)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<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; (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<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; (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE; // return TRUE unless you set the focus to a control<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFileFind filefind;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // get file size<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filefind.FindFile(lpszFileName))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filefind.FindNextFile();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strSize.Format("%d", filefind.GetLength());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strSize = "0";<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // split path and filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strFileName = lpszFileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strPath;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nPos = strFileName.ReverseFind('\\');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nPos != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strPath = strFileName.Left(nPos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strFileName = strFileName.Mid(nPos + 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // insert to list<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nItem = m_list.GetItemCount();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.InsertItem(nItem, strFileName, nIcon);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetItemText(nItem, 1, strSize);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetItemText(nItem, 2, strFileName.Right(3));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_list.SetItemText(nItem, 3, strPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHFILEINFO sfi;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(&amp;sfi, 0, sizeof(sfi));<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bIsDir)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHGetFileInfo(lpszPath, <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; FILE_ATTRIBUTE_DIRECTORY, <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; &amp;sfi, <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; sizeof(sfi), <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; SHGFI_SMALLICON | SHGFI_SYSICONINDEX |<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; SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sfi.iIcon;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SHGetFileInfo (lpszPath, <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; FILE_ATTRIBUTE_NORMAL, <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; &amp;sfi, <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; sizeof(sfi), <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; SHGFI_SMALLICON | SHGFI_SYSICONINDEX | <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; SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; sfi.iIcon;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/KataDoc360/archive/2009/05/18/4195356.aspx">http://blog.csdn.net/KataDoc360/archive/2009/05/18/4195356.aspx</a></p>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/105461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2010-01-12 00:19 <a href="http://www.cppblog.com/zhaoyg/archive/2010/01/12/105461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置控件的字体</title><link>http://www.cppblog.com/zhaoyg/archive/2009/12/30/104492.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Wed, 30 Dec 2009 14:05:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2009/12/30/104492.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/104492.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2009/12/30/104492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/104492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/104492.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">前提假定，对话框上有一个ID为IDC_TEST的控件。<br><br>在OnInitDialog函数中插入一下代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">m_font.CreatePointFont(</span><span style="COLOR: #000000">909</span><span style="COLOR: #000000">,_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宋体</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br>GetDlgItem(IDC_TEST)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetFont(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_font);</span></div>
编译后便可看见效果<br><br>说明：<br>在我第一次尝试更改控件变量的字体时，使用了如下的代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CFont&nbsp;font<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">font.CreatePointFont(</span><span style="COLOR: #000000">909</span><span style="COLOR: #000000">,_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">宋体</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">GetDlgItem(IDC_TEST)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetFont(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">font);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<br>结果，控件的字体并没有改变。后来得知SetFont函数有如下要求：<br>The SetFont() member function of the CWnd class changes the font in a specified control. For this function to work correctly in a Windows- based application, you must ensure that the CFont object specified in the SetFont() call is not destroyed until after the specified control has been destroyed.</span> <br>其中的"...you must ensure that the CFont object specified in the SetFont() call is not destroyed until after the specified control has been destroyed.&nbsp;"便是关键。<br>所以在更该控件的字体时，CFont对象必须是静态或者成员变量。 
<img src ="http://www.cppblog.com/zhaoyg/aggbug/104492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2009-12-30 22:05 <a href="http://www.cppblog.com/zhaoyg/archive/2009/12/30/104492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无模式对话框的销毁</title><link>http://www.cppblog.com/zhaoyg/archive/2009/12/03/102387.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Thu, 03 Dec 2009 12:27:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2009/12/03/102387.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/102387.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2009/12/03/102387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/102387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/102387.html</trackback:ping><description><![CDATA[<br>from&nbsp; MSDN<br><br>
<p>When you implement a modeless dialog box, always override the <strong>OnCancel</strong> member function and call <strong>DestroyWindow</strong> from within it. Don't call the base class <strong>CDialog::OnCancel</strong>, because it calls <strong>EndDialog</strong>, which will make the dialog box invisible but will not destroy it. You should also override <strong>PostNcDestroy</strong> for modeless dialog boxes in order to delete <strong>this</strong>, since modeless dialog boxes are usually allocated with <strong>new</strong>. Modal dialog boxes are usually constructed on the frame and do not need <strong>PostNcDestroy</strong> cleanup.</p>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/102387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2009-12-03 20:27 <a href="http://www.cppblog.com/zhaoyg/archive/2009/12/03/102387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让CListBox响应鼠标右键</title><link>http://www.cppblog.com/zhaoyg/archive/2009/11/30/102250.html</link><dc:creator>zhaoyg</dc:creator><author>zhaoyg</author><pubDate>Sun, 29 Nov 2009 18:54:00 GMT</pubDate><guid>http://www.cppblog.com/zhaoyg/archive/2009/11/30/102250.html</guid><wfw:comment>http://www.cppblog.com/zhaoyg/comments/102250.html</wfw:comment><comments>http://www.cppblog.com/zhaoyg/archive/2009/11/30/102250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhaoyg/comments/commentRss/102250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhaoyg/services/trackbacks/102250.html</trackback:ping><description><![CDATA[<p>这两天遇见了如何让CListBox的内容响应鼠标右键的问题，没有头绪，Google了半天，基本上都是清一色的答复：从clistbox派生一个类，且响应WM_RBUTTONDOWN消息。但起初的实践发现，这种方法只是让整个控件响应右键，而我想要的是让其内容响应。<br>后来才发现是我没有领悟&#8220;答复&#8221;的真谛。<br><br>为让CListBox类响应鼠标右键，需要从CListBox类派生出一个新类，且在该派生类中添加一个WM_RBUTTONDOWN消息的响应函数，例如如下代码：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;newlist::OnRButtonDown(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;message&nbsp;handler&nbsp;code&nbsp;here&nbsp;and/or&nbsp;call&nbsp;default</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Ok,响应鼠标右键!</span><span style="COLOR: #000000">")</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;CListBox::OnRButtonDown(nFlags,&nbsp;point);<br>}<br></span></div>
<br>以上这段代码是让整个listbox空间响应右键，为了只让listbox中的条目响应右击则需要更改为：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;newlist::OnRButtonDown(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;message&nbsp;handler&nbsp;code&nbsp;here&nbsp;and/or&nbsp;call&nbsp;default</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetCurSel();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(LB_ERR&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;i)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ok</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;CListBox::OnRButtonDown(nFlags,&nbsp;point);<br>}<br></span></div>
<br>因为当listbox没有选中内容或多选时，GetCurSel函数返回LB_ERR，于是可以借由GetCurSel函数来实现只让listbox中的条目响应鼠标右击，而非整个控件。<br>P.S: 一旦能够让listbox的内容响应右键，那么就可以对listbox的内容实现右键弹出菜单了，这正我想要的。下附右击listbox中的内容弹出菜单<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;newlist::OnRButtonDown(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;在此添加消息处理程序代码和/或调用默认值</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;curpoint;<br>&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">curpoint);<br>&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">curpoint);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;RECT&nbsp;test;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;GetCount())<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetItemRect(i,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">test);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(curpoint.y&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;test.bottom)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;将当前右击项选中</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurSel(i);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;加载弹出菜单</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu&nbsp;temp,</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.LoadMenu(IDR_MENU1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;temp.GetSubMenu(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientToScreen(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">TrackPopupMenu(TPM_LEFTALIGN&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;TPM_RIGHTBUTTON,point.x,point.y,GetParent());<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;若之前选中了某项,而现在的右击又没有击中选项,则取消之前的选项</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCurSel(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;CListBox::OnRButtonDown(nFlags,&nbsp;point);<br>}</span></div>
<img src ="http://www.cppblog.com/zhaoyg/aggbug/102250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhaoyg/" target="_blank">zhaoyg</a> 2009-11-30 02:54 <a href="http://www.cppblog.com/zhaoyg/archive/2009/11/30/102250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>