﻿<?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>BlogJava-jasmine214--love-随笔分类-C++</title><link>http://www.blogjava.net/jasmine214--love/category/45708.html</link><description>将目标执着于心间，保持热情，才会让自己每一天充满活力。</description><language>zh-cn</language><lastBuildDate>Thu, 02 Sep 2010 19:52:20 GMT</lastBuildDate><pubDate>Thu, 02 Sep 2010 19:52:20 GMT</pubDate><ttl>60</ttl><item><title>VC ----------对话框添加背景图片的方法</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/09/01/330515.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 01 Sep 2010 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/09/01/330515.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330515.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/09/01/330515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330515.html</trackback:ping><description><![CDATA[<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">1</span><span style="font-family: 宋体; font-size: 12pt">、在资源视图中 填加位图<br />
2、在nameDlg.cpp中填加</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">CBitmap m_bmZD,m_bmBack;</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">CBrush m_brZD,m_brBack;</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">和在初始化函数中&nbsp;BOOL <font size="3" face="宋体">nameDlg</font>::OnInitDialog(){填加</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; VERIFY(m_bmZD.LoadBitmap(IDB_BG));&nbsp;// IDB_BG </span><span style="font-family: 新宋体; font-size: 9pt">为位图ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; VERIFY(m_brZD.CreatePatternBrush(&amp;m_bmZD));&nbsp;&nbsp; </span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; VERIFY(m_bmBack.LoadBitmap(IDB_BG));</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; VERIFY(m_brBack.CreatePatternBrush(&amp;m_bmBack));&nbsp;&nbsp; </span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt">3</span><span style="font-family: 宋体; font-size: 12pt">、填加</span><span style="font-family: 宋体; color: black; font-size: 10pt">利用向导映射</span><span style="font-family: Arial; color: black; font-size: 10pt">AboutDlg</span><span style="font-family: 宋体; color: black; font-size: 10pt">的</span><span style="font-family: Arial; color: black; font-size: 10pt">WM_CTLCOLOR</span><span style="font-family: 宋体; color: black; font-size: 10pt">消息，产生函数</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">HBRUSH <font size="3" face="宋体">nameDlg</font>::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">{</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;SetBkMode(TRANSPARENT);&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span> (nCtlColor==CTLCOLOR_EDIT)<span style="color: blue">return</span> hbr;</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">else</span> <span style="color: blue">if</span>(nCtlColor == CTLCOLOR_LISTBOX&nbsp;)</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> m_brBack;</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> m_brZD;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// TODO:&nbsp;</span></span><span style="font-family: 新宋体; color: green; font-size: 9pt">如果默认的不是所需画笔，则返回另一个画笔</span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//return hbr;</span></span></p>
<p style="text-align: left; margin: 0cm 0cm 0pt" class="MsoNormal" align="left"><span style="font-family: 新宋体; font-size: 9pt">}&nbsp;<br />
<br />
http://blog.ednchina.com/jimmy_qiu/49876/message.aspx</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-09-01 10:50 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/09/01/330515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> CRgn类--属性，成员函数--解释</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330332.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 12:35:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330332.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330332.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330332.html</trackback:ping><description><![CDATA[<table>
    <tbody>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/1856093.htm" target="_blank">CObject</a></td>
        </tr>
        <tr>
            <td width="100">└<a href="http://baike.baidu.com/view/2911714.htm" target="_blank">CGdiObject</a></td>
        </tr>
        <tr>
            <td width="100">└CRgn</td>
        </tr>
    </tbody>
</table>
<div class="spctrl">&nbsp;</div>
　　CRgn类封装了一个Windows图形设备接口（GDI）区域。这一区域是某一窗口中的一个椭圆或多边形区域。要使用这个区域，你可以使用类CRgn的成员函数以及被定义为类CDC的成员函数的剪贴函数。
<div class="spctrl">&nbsp;</div>
　　调用CRgn的成员函数就可以创建，修改和检取关于此区域对象的信息。
<div class="spctrl">&nbsp;</div>
　　#include &lt;afxwin.h&gt;
<div class="spctrl">&nbsp;</div>
　　CRgn类成员
<div class="spctrl">&nbsp;</div>
　　Construction
<table>
    <tbody>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2873968.htm" target="_blank">CRgn</a></td>
            <td width="500" align="left">构造一个CRgn对象</td>
        </tr>
    </tbody>
</table>
<div class="spctrl">&nbsp;</div>
　　Initialization
<table>
    <tbody>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2035082.htm" target="_blank">CreateRectRgn</a></td>
            <td width="500" align="left">用一个矩形区域来初始化一个CRgn对象</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2035087.htm" target="_blank">CreateRectRgnIndirect</a></td>
            <td width="500" align="left">用由一个RECT结构定义的矩形区域来初始化一个CRgn对象</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2034860.htm" target="_blank">CreateEllipticRgn</a></td>
            <td width="500" align="left">用一个椭圆形区域来初始化一个CRgn对象</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2034956.htm" target="_blank">CreateEllipticRgnIndirect</a></td>
            <td width="500" align="left">用由一个RECT结构定义的椭圆形区域来初始化一个CRgn对象</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2035040.htm" target="_blank">CreatePolygonRgn</a></td>
            <td width="500" align="left">用一个多边形区域来初始化一个CRgn对象。如果有必要，系统通过在第一个顶点和最后一个顶点之间绘制直线来自动关闭该多边形</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2035042.htm" target="_blank">CreatePolyPolygonRgn</a></td>
            <td width="500" align="left">用一系列封闭的多边形组成的区域来初始化一个CRgn对象。这些多边形可能互不相交或相互重叠</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/1426914.htm" target="_blank">CreateRoundRectRgn</a></td>
            <td width="500" align="left">用一个圆角的矩形区域来初始化一个CRgn对象</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2034702.htm" target="_blank">CombineRgn</a></td>
            <td width="500" align="left">设置一个CRgn对象，使它等效于两个指定的CRgn对象的联合</td>
        </tr>
        <tr>
            <td width="100">CopyRgn</td>
            <td width="500" align="left">设置一个CRgn对象，使它为一个指定的CRgn对象的拷贝</td>
        </tr>
        <tr>
            <td width="100">CreateFromPath</td>
            <td width="500" align="left">从被选入给定设备环境的路径创建一个区域</td>
        </tr>
        <tr>
            <td width="100">CreateFromData</td>
            <td width="500" align="left">根据给定的区域和变换数据创建一个区域</td>
        </tr>
    </tbody>
</table>
<div class="spctrl">&nbsp;</div>
　　Operations
<table>
    <tbody>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2031321.htm" target="_blank">EqualRgn</a></td>
            <td width="500" align="left">检查两个CRgn对象，确定它们是否相等</td>
        </tr>
        <tr>
            <td width="100">FromHandle</td>
            <td width="500" align="left">当给定了一个Windows区域的句柄时返回指向一个CRgn对象的指针</td>
        </tr>
        <tr>
            <td width="100">GetRegionData</td>
            <td width="500" align="left">用描述给定区域的数据来填充指定的缓冲区</td>
        </tr>
        <tr>
            <td width="100">GetRgnBox</td>
            <td width="500" align="left">检取一个CRgn对象的限定矩形的坐标</td>
        </tr>
        <tr>
            <td width="100">OffsetRgn</td>
            <td width="500" align="left">用指定的偏移量移动一个CRgn对象</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2033992.htm" target="_blank">PtInRegion</a></td>
            <td width="500" align="left">确定一个指定的点是否在矩形内</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/2034030.htm" target="_blank">RectInRegion</a></td>
            <td width="500" align="left">确定一个指定矩形的任何部分是否都在区域的边界内</td>
        </tr>
        <tr>
            <td width="100"><a href="http://baike.baidu.com/view/1288754.htm" target="_blank">SetRectRgn</a></td>
            <td width="500" align="left">将CRgn对象设置为指定的矩形区域</td>
        </tr>
    </tbody>
</table>
<div class="spctrl">&nbsp;</div>
　　Operators
<table>
    <tbody>
        <tr>
            <td width="100">operator HRGN</td>
            <td width="500" align="left">返回包含在CRgn对象中的Windows句柄</td>
        </tr>
    </tbody>
</table>
http://www.itbaby.net/index.php/Article-view-id-156.shtml
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 20:35 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CRgn类--例子</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330331.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330331.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330331.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330331.html</trackback:ping><description><![CDATA[在<a href="http://www.vckbase.com/document/viewdoc.asp?id=551" target="_blank">《自绘按钮的实现》</a>一文中所示范的CXPButton按钮从形状上看可以说是一个不规则按钮。我们把MFC中提供的控件成为标准控件，而其中的按钮控件则可称为规则按钮，因为它是的形状是一个规则的矩形。但是随着流线型设计在界面设计中被广泛采用，越来越多的程序设计者都乐意在自己的作品中加入一些非规则形状的控件。以按钮为例，最简单的就到有圆形按钮，三角按钮等。下图是一组定义好的圆形按钮：<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase18/images/OwnerButton1.gif" width="272" height="92"  alt="" /> <br />
<br />
但是这些在我们眼中似乎呈现出不规则形状的按钮，有时候的表现却不近乎人意。以之前设计的CXPButton为例，下面我们就来找找它的缺陷。我们把对话框的背景色改为其它颜色，看看会有什么效果。修改背景色的方法如下：为对话框类添加WM_ERASEBKGND消息，如果你在类向导中找不到该消息，请参考<a href="http://www.vckbase.com/document/viewdoc.asp?id=551" target="_blank">《自绘按钮的实现》</a>中介绍的方法，注意在添加对话框中要把Filter for messages available to设为Child Window才能在列表中看到WM_ERASEBKGND消息。我们在函数中添加绘制背景色的代码：<br />
<pre>BOOL CXPButtonDemoDlg::OnEraseBkgnd(CDC* pDC)
{
BOOL retValue= CDialog::OnEraseBkgnd(pDC);
CRect rc;
GetClientRect(&amp;rc);
pDC-&gt;FillSolidRect(&amp;rc,RGB(0,0,255));
return retValue;
}</pre>
编译后运行程序，可以看到下面的效果，在按钮的四个角上出现了难看的边角，这就是我所说的缺陷了：<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase18/images/OwnerButton2.gif" width="446" height="198"  alt="" /> <br />
<br />
既然发现了问题，下面当然就是动手来解决问题的时间了。在《自绘按钮的实现》一文中曾经讲过，按钮的绘制主要在DrawItem()函数中完成。这里要补充一点就是DrawItem()是MFC所提供的系统函数，所以可以通过下图的方法添加。选择Add Virtual Function&#8230;之后在弹出对话框左边的列表中找到DrawItem，选择Add and Edit即可。<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase18/images/OwnerButton3.gif" width="380" height="222"  alt="" /> <br />
<br />
好了，我们接着上面的话题。要解决按钮显示的&#8220;残角&#8221;问题，在这里需要使用一个叫做CRgn的类，这个类在创建不规则控件的时候经常要用到，我们可以通过CRgn类来设置控件的有效区域。那么什么是有效区域呢？以圆形按钮为例，MFC默认的按钮形状是矩形的，为了实现圆形按钮的效果，我们希望能够把原来矩形的四角裁剪掉，只保留中间的圆形区域。这种关系可以用下图来表示：<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase18/images/OwnerButton4.gif" width="388" height="123"  alt="" /><br />
<br />
图中的A是原来的矩形区域，B是需要裁剪的区域，而C是有效区域。我们希望程序不要把B看作按钮的一部分，当鼠标在B上面点击的时候不要产生任何效果。设置按钮的有效区域一般是在PreSubclassWindow()函数里面实现的：<br />
<pre>void CXPButton::PreSubclassWindow()
{
CButton::PreSubclassWindow();
ModifyStyle(0, BS_OWNERDRAW);
//设置按钮的有效区域
CRgn rgn;
CRect rc;
GetClientRect(&amp;rc);
//有效区域为一个角半径为5的圆角矩形
rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom,5,5);
SetWindowRgn(rgn,TRUE);
rgn.DeleteObject();
}
</pre>
编译后运行程序，我们发现尽管已经设置了按钮的有效区域，但是问题还是没有解决，这是为什么呢？前面我们曾经通过对话框的WM_ERASEBKGND消息函数来改变对话框的底色，其实按钮也有它的WM_ERASEBKGND消息函数，它会使用系统颜色根据控件的默认形状来绘制控件的底色。所以我们要重载按钮的WM_ERASEBKGND消息函数，让它什么都不做：<br />
<pre>BOOL CXPButton::OnEraseBkgnd(CDC* pDC)
{
//禁止绘制底色
return TRUE;
}
</pre>
再编译一次，运行后发现，难看的"残角"不见了：<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase18/images/OwnerButton5.gif" width="446" height="198"  alt="" />
<p>&nbsp;</p>
<br />
<br />
在<a href="http://www.vckbase.com/document/viewdoc.asp?id=551" target="_blank">《自绘按钮的实现》</a>一文中还讲过在DrawItem()函数中应该先画底色，其实这是有前提的，前提就是你已经知道了按钮所在对话框所使用的背景色，你可以使用这个颜色作为按钮的底色来进行填充。这样即使程序会在WM_ERASEBKGND消息函数中使用系统颜色来绘制控件的底色，但是等到它执行DrawItem()的时候，马上又会把之前的矩形底色覆盖，从而不留痕迹地把&#8220;残角&#8221;掩盖掉。<br />
在本篇开头列举的圆形按钮中也有类似的问题，大家不防把它作为练习，看看是否能够解决圆形按钮中的&#8220;残角&#8221;问题。我在本篇提供的练习程序中需要修改的地方会表明&#8220;提示&#8221;的字眼，大家可以先把源程序中有&#8220;提示&#8221;字眼的地方找出来，再根据提示的内容进行修改。<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase18/images/OwnerButton6.gif" width="237" height="88"  alt="" /> <br />
<br />
最后还要补充的是各位对CRgn类的关注。在VC中，要创建出各种复杂形状的控件、窗口经常要依靠CRgn类的强大功能来实现。如果你想在界面设计这个环节更进一步的话，建议你抽点时间仔细研究一下Msdn中关于CRgn类的使用说明。如果你有什么好的使用经验和心得，不防把相关资料发到我的邮箱。以后有机会的话我会专门写一篇文章探讨一下CRgn类的使用技巧的。 <br />
http://www.vckbase.com/document/viewdoc/?id=561
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 20:31 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CMemu菜单类详解</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330326.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 11:59:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330326.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330326.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330326.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><span style="font-size: 10pt">在VC 5的MFC中，管理菜单的类叫CMenu。下面我向大家介绍建立一个弹出式菜单的基本方法。 <br />
一、在资源编辑器中建立一个菜单资源 <br />
<br />
<br />
<br />
　　 新建一个菜单资源，比如把菜单的ID号为IDC_POPMENU。此菜单有一项两层，即有一个可弹出的菜单项，而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。如右图，&#8220;可弹出项&#8221;下的菜单即为将要建立的弹出式菜单的内容。实际上，&#8220;可弹出项&#8221;这个名称在以后的操作中不会被用到，但VC 5不允许直接建立弹出式菜单，所以采用先建立&#8220;可弹出项&#8221;的方法。 <br />
<br />
至于每一个菜单项的消息映射，与一般的菜单相同。 <br />
<br />
二、使用CMenu类对象 <br />
<br />
　　 CMenu类的成员函数较多，但建立弹出式菜单只需用到其中几个成员函数。 <br />
<br />
1、LoadMenu函数 <br />
<br />
　　 原型：BOOL LoadMenu( UINT nIDResource ); <br />
　　 其中nIDResource是菜单资源的ID号，这里用的是刚建立的IDC_POPMENU。 <br />
2、GetSubMenu函数 <br />
<br />
　　 原型：CMenu* GetSubMenu( int nPos ) const; <br />
<br />
　　 此函数用于得到子菜单的指针。nPos为层数，0为第一层子菜单&#8230;&#8230;以此类推。 <br />
<br />
由于我们需要的是&#8220;可弹出项&#8221;的第一层子菜单，因此用GetSubMenu(0)来得到第一层子菜单的类指针。 <br />
3、TrackPopupMenu函数 <br />
<br />
　　 原型：BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL ); <br />
<br />
　　 其中： <br />
<br />
nFlags为屏幕坐标属性和鼠标坐标属性 <br />
<br />
屏幕坐标属性： <br />
<br />
TPM_CENTERALIGN 横向将菜单以x居中 <br />
<br />
TPM_LEFTALIGN 横向将菜单以x左对齐 <br />
<br />
TPM_RIGHTALIGN 横向将菜单以x右对齐 <br />
<br />
鼠标按键属性（只在响应WM_CONTEXTMENU消息时有效）： <br />
<br />
TPM_LEFTBUTTON 连续按? 右键不会连续弹出菜单，鼠标右键不可用于选定菜单项 <br />
<br />
TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单，鼠标右键可用于选定菜单项 <br />
<br />
x，y均为屏幕坐标 <br />
<br />
lpRect 菜单所占的区域。如果为NULL，当用户在菜单以外的区域按鼠标键时，菜单会消失 <br />
<br />
三、实例 <br />
<br />
1、当鼠标右键单击程序窗口的客户区时，程序会收到一条WM_CONTEXTMENU消息，此时是弹出菜单的最好时机 <br />
<br />
　　 用ClassWizard中的&#8220;Add Windows Message Handler&#8221;功能添加对WM_CONTEXT消息的响应函数，函数中代码如下： <br />
<br />
void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point) <br />
<br />
{ <br />
<br />
CMenu menu; //定义CMenu类对象 <br />
menu.LoadMenu(IDC_POPMENU); //装入刚建立的菜单IDC_POPMENU menu.GetSubMenu(0)-&gt;TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd); <br />
/*GetSubMenu(0)得到IDC_POPMENU的第一层子菜单，TrackPopupMenu将菜单弹出到（x,y）处。由于设置为TPM_LEFTALIGN，所以菜单以（x,y）为左上角。*/ <br />
<br />
} <br />
<br />
2、在其他时候弹出菜单也可以，比如，可以响应WM_LBUTTONDOWN消息。这样，在鼠标左键单击时也能弹出菜单 <br />
<br />
　　 用ClassWizard中的&#8220;Add Windows Message Handler&#8221;功能添加对WM_LBUTTONDOWN消息的响应函数，函数中代码如下： <br />
void CMfc5Dlg::OnLButtonDown(UINT nFlags, CPoint point) <br />
<br />
{ <br />
<br />
　　 CMenu menu; //定义CMenu类对象 menu.LoadMenu(IDC_POPMENU); //装入刚建立的菜单IDC_POPMENU ClientToScreen(&amp;point); menu.GetSubMenu(0)-&gt;TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); <br />
/*GetSubMenu(0)得到IDC_POPMENU的第一层子菜单，TrackPopupMenu将菜单弹出到（x,y）处。由于设置为TPM_LEFTALIGN，所以菜单以（x,y）为左上角。*/ <br />
<br />
ScreenToClient(&amp;point); <br />
CDialog::OnLButtonDown(nFlags, point); <br />
<br />
} <br />
<br />
　　 注意：在WM_LBUTTONDOWN消息中得到的point对象所存的坐标是相对于窗口客户区的，而TrackPopupMenu中的x,y需要是相对于屏幕的，所以需用ClientToScreen函数进行转换，但此消息响应函数要调用CDialog::OnLButtonDown(nFlags, point)，故应该用ScreenToClient函数将point所存的坐标还原为相对于窗口客户区的。 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">上一篇： 制作 MSN、QQ 的消息提示窗口<br />
下一篇： 在单文档中添加系统菜单项</span></span></p>
<script type="text/javascript"><!-- google_ad_client="pub-7345584400661736" ;
/* 728x15, 创建于 08-4-7一起美容（文字链接） */ google_ad_slot="6959625474" ; google_ad_width="728;
google_ad_height" = 15;
//-->
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script><ins style="border-bottom: medium none; position: relative; border-left: medium none; padding-bottom: 0px; margin: 0px; padding-left: 0px; width: 728px; padding-right: 0px; display: inline-table; height: 15px; visibility: visible; border-top: medium none; border-right: medium none; padding-top: 0px"><ins style="border-bottom: medium none; position: relative; border-left: medium none; padding-bottom: 0px; margin: 0px; padding-left: 0px; width: 728px; padding-right: 0px; display: block; height: 15px; visibility: visible; border-top: medium none; border-right: medium none; padding-top: 0px" id="google_ads_frame3_anchor"><iframe style="position: absolute; top: 0px; left: 0px" id="google_ads_frame3" height="15" marginheight="0" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-7345584400661736&amp;output=html&amp;h=15&amp;slotname=6959625474&amp;w=728&amp;lmt=1283169158&amp;flash=10.0.45.2&amp;url=http%3A%2F%2Fblog.chinaunix.net%2Fu2%2F67530%2Fshowart_602938.html&amp;dt=1283169158373&amp;shv=r20100818&amp;jsv=r20100825&amp;prev_slotnames=3544090275%2C6079382880&amp;correlator=1283169158263&amp;frm=0&amp;adk=709646363&amp;ga_vid=767138876.1283169158&amp;ga_sid=1283169158&amp;ga_hid=1051967237&amp;ga_fc=0&amp;u_tz=480&amp;u_his=0&amp;u_java=1&amp;u_h=1024&amp;u_w=1280&amp;u_ah=971&amp;u_aw=1280&amp;u_cd=32&amp;u_nplug=0&amp;u_nmime=0&amp;biw=1260&amp;bih=823&amp;ref=http%3A%2F%2Fwww.google.com.hk%2Fsearch%3Fhl%3Dzh-CN%26lr%3Dlang_zh-CN%26newwindow%3D1%26safe%3Dstrict%26tbs%3Dlr%253Alang_1zh-CN%26q%3DVC%2B.GetSubMenu%2528%26aq%3Df%26aqi%3D%26aql%3D%26oq%3D%26gs_rfai%3D&amp;fu=0&amp;ifi=3&amp;dtd=0&amp;xpc=wMQaNttK6J&amp;p=http%3A//blog.chinaunix.net" frameborder="0" width="728" allowTransparency name="google_ads_frame" marginwidth="0" scrolling="no"></iframe><span style="font-size: 12pt"></span></ins></ins><span style="font-size: 12pt">弹出式菜单（PopMenu）大家都熟悉，在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单。通常情况下，弹出式菜单在鼠标右键单击时弹出，当然，也可以根据需要随时弹出。 在VC 5的MFC中，管理菜单的类叫CMenu。下面我向大家介绍建立一个弹出式菜单的基本方法。 <br />
一、在资源编辑器中建立一个菜单资源 <br />
<br />
<br />
<br />
　　 新建一个菜单资源，比如把菜单的ID号为IDC_POPMENU。此菜单有一项两层，即有一个可弹出的菜单项，而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。如右图，&#8220;可弹出项&#8221;下的菜单即为将要建立的弹出式菜单的内容。实际上，&#8220;可弹出项&#8221;这个名称在以后的操作中不会被用到，但VC 5不允许直接建立弹出式菜单，所以采用先建立&#8220;可弹出项&#8221;的方法。 <br />
<br />
至于每一个菜单项的消息映射，与一般的菜单相同。 <br />
<br />
二、使用CMenu类对象 <br />
<br />
　　 CMenu类的成员函数较多，但建立弹出式菜单只需用到其中几个成员函数。 <br />
<br />
1、LoadMenu函数 <br />
<br />
　　 原型：BOOL LoadMenu( UINT nIDResource ); <br />
　　 其中nIDResource是菜单资源的ID号，这里用的是刚建立的IDC_POPMENU。 <br />
2、GetSubMenu函数 <br />
<br />
　　 原型：CMenu* GetSubMenu( int nPos ) const; <br />
<br />
　　 此函数用于得到子菜单的指针。nPos为层数，0为第一层子菜单&#8230;&#8230;以此类推。 <br />
<br />
由于我们需要的是&#8220;可弹出项&#8221;的第一层子菜单，因此用GetSubMenu(0)来得到第一层子菜单的类指针。 <br />
3、TrackPopupMenu函数 <br />
<br />
　　 原型：BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL ); <br />
<br />
　　 其中： <br />
<br />
nFlags为屏幕坐标属性和鼠标坐标属性 <br />
<br />
屏幕坐标属性： <br />
<br />
TPM_CENTERALIGN 横向将菜单以x居中 <br />
<br />
TPM_LEFTALIGN 横向将菜单以x左对齐 <br />
<br />
TPM_RIGHTALIGN 横向将菜单以x右对齐 <br />
<br />
鼠标按键属性（只在响应WM_CONTEXTMENU消息时有效）： <br />
<br />
TPM_LEFTBUTTON 连续按? 右键不会连续弹出菜单，鼠标右键不可用于选定菜单项 <br />
<br />
TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单，鼠标右键可用于选定菜单项 <br />
<br />
x，y均为屏幕坐标 <br />
<br />
lpRect 菜单所占的区域。如果为NULL，当用户在菜单以外的区域按鼠标键时，菜单会消失 <br />
<br />
三、实例 <br />
<br />
1、当鼠标右键单击程序窗口的客户区时，程序会收到一条WM_CONTEXTMENU消息，此时是弹出菜单的最好时机 <br />
<br />
　　 用ClassWizard中的&#8220;Add Windows Message Handler&#8221;功能添加对WM_CONTEXT消息的响应函数，函数中代码如下： <br />
<br />
void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point) <br />
<br />
{ <br />
<br />
CMenu menu; //定义CMenu类对象 <br />
menu.LoadMenu(IDC_POPMENU); //装入刚建立的菜单IDC_POPMENU menu.GetSubMenu(0)-&gt;TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd); <br />
/*GetSubMenu(0)得到IDC_POPMENU的第一层子菜单，TrackPopupMenu将菜单弹出到（x,y）处。由于设置为TPM_LEFTALIGN，所以菜单以（x,y）为左上角。*/ <br />
<br />
} <br />
<br />
2、在其他时候弹出菜单也可以，比如，可以响应WM_LBUTTONDOWN消息。这样，在鼠标左键单击时也能弹出菜单 <br />
<br />
　　 用ClassWizard中的&#8220;Add Windows Message Handler&#8221;功能添加对WM_LBUTTONDOWN消息的响应函数，函数中代码如下： <br />
void CMfc5Dlg::OnLButtonDown(UINT nFlags, CPoint point) <br />
<br />
{ <br />
<br />
　　 CMenu menu; //定义CMenu类对象 menu.LoadMenu(IDC_POPMENU); //装入刚建立的菜单IDC_POPMENU ClientToScreen(&amp;point); menu.GetSubMenu(0)-&gt;TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this); <br />
/*GetSubMenu(0)得到IDC_POPMENU的第一层子菜单，TrackPopupMenu将菜单弹出到（x,y）处。由于设置为TPM_LEFTALIGN，所以菜单以（x,y）为左上角。*/ <br />
<br />
ScreenToClient(&amp;point); <br />
CDialog::OnLButtonDown(nFlags, point); <br />
<br />
} <br />
<br />
　　 注意：在WM_LBUTTONDOWN消息中得到的point对象所存的坐标是相对于窗口客户区的，而TrackPopupMenu中的x,y需要是相对于屏幕的，所以需用ClientToScreen函数进行转换，但此消息响应函数要调用CDialog::OnLButtonDown(nFlags, point)，故应该用ScreenToClient函数将point所存的坐标还原为相对于窗口客户区的。<br />
http://blog.chinaunix.net/u2/67530/showart_602938.html</span>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 19:59 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图像列表控制（CImageList）</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330323.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330323.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330323.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330323.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><span style="color: red"><br />
图像列表控制（<font face="Times New Roman">CImageList</font>）是相同大小图像的一个集合，每个集合中均以<font face="Times New Roman">0</font>为图像的索引序号基数，图像列表通常由大图标或位图构成，其中包含透明位图模式。</span>可以利用<font face="Times New Roman">WINDOWS32</font>位应用程序接口函数<font face="Times New Roman">API</font>来绘制、建立和删除图像，并能实现增加、删除、替换和拖动图像等操作。图像列表控制提供了控制图像列表的基本方法，这些方法在<font face="Times New Roman">WINDOWS95</font>及以后版本才能实现。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">一、图像控制的对象结构</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">1 </font>图像控制的数据成员</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"><font face="Times New Roman">m_hImageList </font>连接图像对象的控制句柄</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">2 </font>图像控制的建立方法</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"><font face="Times New Roman">CimageList</font>＆<font face="Times New Roman">imageList</font>建立图像控制对象结构</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"><font face="Times New Roman">Create </font>初始化图像列表并绑定对象</p>
<p style="margin: 0cm 0cm 0pt">图像控制的建立方法如下：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREF crMask );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">BOOL Create( CImageList&amp; imagelist1, int nImage1, CImageList&amp; imagelist2,int nImage2,int dx, int dy );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">其中各项参数的含义为：<font face="Times New Roman">cx</font>定义图像的宽度，单位为象素；<font face="Times New Roman">cy</font>定义图象的高度，单位为象素；<font face="Times New Roman">nFlags</font>确定建立图像列表的类型，可以是以下值的组合：<font face="Times New Roman"> ILC_COLOR</font>、<font face="Times New Roman">ILC_COLOR4</font>、<font face="Times New Roman">ILC_COLOR8</font>、<font face="Times New Roman">ILC_COLOR16</font>、<font face="Times New Roman">ILC_COLOR24</font>、<font face="Times New Roman">ILC_COLOR32</font>、<font face="Times New Roman"> ILC_COLORDDB</font>和<font face="Times New Roman">ILC_MASK</font>；<font face="Times New Roman">nInitial</font>用来确定图像列表包含的图像数量；<font face="Times New Roman">nGrow</font>用来确定图像列表可控制的图像数量。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">NbitmapID </font>用来确定图像列表联系的位图标志值；<font face="Times New Roman">crMask</font>表示颜色屏蔽位；</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">LpszBitmapID </font>用来确定包含位图资源的标识串；</p>
<p style="margin: 0cm 0cm 0pt 21pt"><font face="Times New Roman">imagelist1 </font>指向图像列表控制对象的一个指针；<font face="Times New Roman">nImage1</font>图像列表<font face="Times New Roman">1</font>中包含的图像数量；<font face="Times New Roman">imagelist2</font>指向图像列表控制对象的一个指针；<font face="Times New Roman">nImage2</font>图像列表<font face="Times New Roman">2</font>中包含的图像数量；<font face="Times New Roman">dx</font>表示以象素为单位的图像宽度；<font face="Times New Roman">dy</font>表示以象素为单位的图像高度。</p>
<p style="margin: 0cm 0cm 0pt">同样，图像控制的建立也包括两个步骤，首先建立图像列表结构，然后建立图像列表控制。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">3 </font>图像控制的属性类</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">图像控制的属性类包括返回<font face="Times New Roman">m_hImageList.</font>控制句柄<font face="Times New Roman">GetSafeHandle</font>、取得图像列表中的图像数量<font face="Times New Roman">GetImageCount</font>、设置图像列表的背景颜色<font face="Times New Roman">SetBkColor</font>、取得图像列表的背景颜色<font face="Times New Roman">SetBkColor</font>和取得图像的有关信息<font face="Times New Roman">SetBkColor</font>。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">4 </font>图像控制的操作方法</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">图像控制的操作方法包括将一个图像列表绑定到一个对象上<font face="Times New Roman">Attach</font>、将对象上的图像列表解除绑定并返回句柄<font face="Times New Roman">Detach</font>、删除一个图像列表<font face="Times New Roman">DeleteImageList</font>、将一个图像增加到图像列表中<font face="Times New Roman">Add</font>和将一个图像从图像列表中删除<font face="Times New Roman">Remove</font>等。</p>
<p style="margin: 0cm 0cm 0pt">二、图像控制的应用技巧</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">对于图像控制，同样不能单独使用，必须与列表控制、树控制和标签控制相互结合应用，下面分别介绍其具体应用技巧。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">1 </font>图像控制在列表控制中的应用技巧</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">1.1 </font>设置图像控制<font face="Times New Roman">CListCtrl::SetImageList</font>的调用格式如下：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList* SetImageList( CImageList* pImageList, int nImageList );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">其返回值是指向前一个图像列表控制的一个指针，如果不存在前一个图像列表则为<font face="Times New Roman">NULL</font>；其中参数<font face="Times New Roman">pImageList</font>是指向图像列表的标识，<font face="Times New Roman">nImageList</font>是图像列表的类型，可以是如下值：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">LVSIL_NORMAL </font>用大图标方式进行图像列表；</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">LVSIL_SMALL </font>用小图标方式进行图像列表；</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">LVSIL_STATE </font>以图像状态进行图像列表；</p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman">1.2 </font>取得图像控制<font face="Times New Roman">CListCtrl::GetImageList</font>的调用格式如下：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList* GetImageList( int nImageList ) const;</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">其返回值为指向图像列表控制的指针，其中<font face="Times New Roman">nImageList</font>用来确定取得返回值的图像列表的值，其取值与设置图像列表函数相同。</p>
<p style="margin: 0cm 0cm 0pt">③图像控制在列表控制中的应用示例</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList Cil1,Cil2; //</font>定义大小图标像列表</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CVCLISTApp *pApp=(CVCLISTApp *)AfxGetApp();//</font>取得列表控制程序</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil1.Create(32,32,TRUE,2,2);//</font>建立<font face="Times New Roman">32</font>位图像控制</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil1.Add(pApp-&gt;LoadIcon(IDI_GJ));//</font>增加选中状态图像</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil1.Add(pApp-&gt;LoadIcon(IDI_XS));//</font>增加非选中状态图像</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil2.Create(16,16,TRUE,2,2); //</font>建立<font face="Times New Roman">16</font>位图像控制</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil2.Add(pApp-&gt;LoadIcon(IDI_GJ));//</font>增加选中状态图像</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil2.Add(pApp-&gt;LoadIcon(IDI_XS));//</font>增加非选中状态图像</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">m_ListCtrl.SetImageList(&amp;Cil1,LVSIL_NORMAL);//</font>设置大图标控制</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">m_ListCtrl.SetImageList(&amp;Cil2,LVSIL_SMALL);//</font>设置小图标控制</p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman">2 </font>图像控制在树控制中的应用技巧</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">2.1 </font>设置图像控制<font face="Times New Roman">CTreeCtrl::SetImageList</font>的调用格式如下：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList* SetImageList( CImageList * pImageList, int nImageListType );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">其返回值为指向前前一个图像列表的指针，否则为<font face="Times New Roman">NULL</font>；参数<font face="Times New Roman">pImageList</font>为指向图像列表的标识，如果<font face="Times New Roman">pImageList</font>为<font face="Times New Roman">NULL</font>则所有的图像都将从树控制中被清除；<font face="Times New Roman">nImageListType</font>为图像列表设置的类型，可以是如下值之一：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">TVSIL_NORMAL </font>设置正常图像列表，其中包括选中和非选中两种图标；</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">TVSIL_STATE </font>设置图像列表状态，指用户自定义状态；</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">2.2 </font>取得图像控制<font face="Times New Roman">CTreeCtrl::GetImageList</font>的调用格式如下：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList* GetImageList( UINT nImage );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">如果调用成功则返回图像列表控制指针，否则为<font face="Times New Roman">NULL</font>；<font face="Times New Roman">nImage</font>为取得返回值的图像列表类型，其取值和取得图像列表控制完全相同。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">2.3 </font>图像控制在树控制中的应用示例</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList Cil1,Cil2;//</font>定义大小图标像列表</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//</font>获取应用程序指针</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil1.Create(16,16,ILC_COLOR,2,2);//</font>建立图像控制</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil1.Add(pApp-&gt;LoadIcon(IDI_PM));//</font>增加选中状态图像</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">Cil1.Add(pApp-&gt;LoadIcon(IDI_CJ));//</font>增加非选中状态图像</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">m_TreeCtrl.SetImageList(&amp;Cil1,TVSIL_NORMAL);//</font>设置图像控制列表</p>
<p style="margin: 0cm 0cm 0pt">然后在树控制的结构定义中进行如下设置：</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">TCItem.item.iImage=0; //</font>设置未选中图像索引号</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">TCItem.item.iSelectedImage=1;//</font>设置选中时图像引号</p>
<p style="margin: 0cm 0cm 0pt"><font face="Times New Roman">3 </font>图像控制在控制中的应用技巧</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">1.</font>设置图像控制<font face="Times New Roman">CTabCtrl::SetImageList</font>的调用格式</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">CImageList * SetImageList( CImageList * pImageList );</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">其返回值为指向前一个图像列表的指针，如果不存在前一个图像列表则为<font face="Times New Roman">NULL</font>；<font face="Times New Roman">pImageList</font>为标识<font face="Times New Roman">TAB</font>控制的图像列表指针。</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">2 </font>取得图像控制<font face="Times New Roman">CTabCtrl::GetImageList</font>的调用格式</p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt"><font face="Times New Roman">HIMAGELIST GetImageList() const;</font></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 0pt">其返回值为指向<font face="Times New Roman">TAB</font>控制的图像列表指针，如果调用不成功则为<font face="Times New Roman">NULL</font>。<br />
<span style="color: red"><a href="http://www.cnblogs.com/sherlockhua/archive/2008/02/11/1067013.html">http://www.cnblogs.com/sherlockhua/archive/2008/02/11/1067013.html</a><br />
</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 19:19 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MM--Mapping Modes ---SetScrollSizes(MM_TEXT, sizeTotal);</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330321.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330321.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330321.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330321.html</trackback:ping><description><![CDATA[<p>http://study.qqcf.com/web/189/21186.htm<br />
映射模式 </p>
<p>　　 在此篇之前我们已经学会了在窗口显示图形，更准确的说是在窗口指定位置显示图形或文字，我们使用的坐标单位是象素，称之为设备坐标。看下面语句： </p>
<p>pDC-&gt;Rectangle(CRect(0,0,200,200)); </p>
<p>　　 画一个高和宽均为200个象素的方块，因为采用的是默认的MM_TEXT映射模式，所以在设备环境不一样时，画的方块大小也不一样，在1024*768的显示器上看到的方块会比640*480的显示器上的小（在不同分辨率下的屏幕象素，在WINDOWS程序设计一书中有示例程序可以获得，或者可以用GetClientRect函数获得客户区的矩形大小。在这里就不说了，大家只要知道就行了），在输出到打印机时也会有类似的情况发生。如何做才能保证在不同设备上得到大小一致的方块或者图形、文字呢？就需要我们进行选择模式映射，来转换设备坐标和逻辑坐标。 </p>
<p>Windows提供了以下几种映射模式： </p>
<p>MM_TEXT <br />
MM_LOENGLISH <br />
MM_HIENGLISH <br />
MM_LOMETRIC <br />
MM_HIMETRIC <br />
MM_TWIPS <br />
MM_ISOTROPIC <br />
MM_ANISOTROPIC </p>
<p>下面分别讲讲这几种映射模式： </p>
<p>MM_TEXT： </p>
<p>　　 默认的映射模式，把设备坐标被映射到象素。x值向右方向递增；y值向下方向递增。坐标原点是屏幕左上角（0，0）。但我们可以通过调用CDC的SetViewprotOrg和SetWindowOrg函数来改变坐标原点的位置看下面两个例子： </p>
<p>//************************************************ <br />
// 例子6-1 <br />
void CMyView::OnDraw(CDC * pDC) <br />
{ <br />
pDC-&gt;Rectangle(CRect(0,0,200,200));//全部采用默认画一个宽和高为200象素的方块 <br />
} </p>
<p>//************************************************** <br />
// 例子6-2 <br />
void CMyView::OnDraw(CDC * pDC) <br />
{ <br />
pDC-&gt;SetMapMode(MM_TEXT);//设定映射模式为MM_TEXT <br />
pDC-&gt;SetWindowOrg(CPoint(100,100));//设定逻辑坐标原点为（100，100） <br />
pDC-&gt;Rectangle(CRect(100,100,300,300));//画一个宽和高为200象素的方块 <br />
} </p>
<p>　　 这两个例子显示出来的图形是一样的，都是从屏幕左上角开始的宽和高为200象素的方块，可以看出例子2将逻辑坐标（100，100）映射到了设备坐标（0，0）处，这样做有什么用？滚动窗口使用的就是这种变换。 </p>
<p>固定比例映射模式： </p>
<p>MM_LOENGLISH、MM_HIENGLISH、MM_LOMETRIC、MM_HIMETRIC、MM_TWIPS这一组是Windows提供的重要的固定比例映射模式。 </p>
<p>它们都是x值向右方向递增，y值向下递减，并且无法改变。它们之间的区别在于比例因子见下：（我想书上P53页肯定是印错了，因为通过程序实验x值向右方向也是递增的） </p>
<p>MM_LOENGLISH 0.01英寸 <br />
MM_HIENGLISH 0.001英寸 <br />
MM_LOMETRIC 0.1mm <br />
MM_HIMETRIC 0.01mm <br />
MM_TWIPS 1/1440英寸 //应用于打印机，一个twip相当于1/20磅，一磅又相当于1/72英寸。 </p>
<p>看例3 </p>
<p>//************************************************** <br />
// 例子6-3 <br />
void CMyView::OnDraw(CDC * pDC) <br />
{ <br />
pDC-&gt;SetMapMode(MM_HIMETRIC);//设定映射模式为MM_HIMETRIC <br />
pDC-&gt;Rectangle(CRect(0,0,4000,-4000));//画一个宽和高为4厘米的方块 <br />
} </p>
<p>　　 还有一种是可变比例映射模式，MM_ISOTROPIC、MM_ANISOTROPIC。用这种映射模式可以做到当窗口大小发生变化时图形的大小也会相应的发生改变，同样当翻转某个轴的伸展方向时图象也会以另外一个轴为轴心进行翻转，并且我们还可以定义任意的比例因子，怎么样很有用吧。 <br />
MM_ISOTROPIC、MM_ANISOTROPIC两种映射模式的区别在于MM_ISOTROPIC模式下无论比例因子如何变化纵横比是1：1而M_ANISOTROPIC模式则可以纵横比独立变化。 </p>
<p>让我们看例子4 </p>
<p>//************************************************** <br />
// 例子6-4 <br />
void CMy002View::OnDraw(CDC* pDC) <br />
{ <br />
CRect rectClient; // <br />
GetClientRect(rectClient);//返回客户区矩形的大小 <br />
pDC-&gt;SetMapMode(MM_ANISOTROPIC);//设定映射模式为MM_ANISOTROPIC <br />
pDC-&gt;SetWindowExt(1000,1000); <br />
pDC-&gt;SetViewportExt (rectClient.right ,-rectClient.bottom ); <br />
//用SetWindowExt和SetViewportExt函数设定窗口为1000逻辑单位高和1000逻辑单位宽 <br />
pDC-&gt;SetViewportOrg(rectClient.right/2,rectClient.bottom/2 );//设定逻辑坐标原点为窗口中心 <br />
pDC-&gt;Ellipse(CRect(-500,-500,500,500));//画一个撑满窗口的椭圆。 <br />
// TODO: add draw code for native data here <br />
} </p>
<p>怎么样，屏幕上有一个能跟随窗口大小改变而改变的椭圆。把 pDC-&gt;SetMapMode(MM_ANISOTROPIC)；这句改为pDC-&gt;SetMapMode(MM_ISOTROPIC)会怎样？大家可以试试。那还有一个问题就是上例的比例因子是多少呢？看下面公式（注意是以例子4为例的） </p>
<p>x比例因子=rectClient.right/1000 //视窗的宽除以窗口范围 <br />
y比例因子=-rectClient.bottom/1000 //视窗的高除以窗口范围 </p>
<p>　　 从Windows的鼠标消息可以获得鼠标指针的当前坐标值（point.x和point.y）此坐标值是设备坐标。 </p>
<p>很多MFC库函数尤其是CRect的成员函数只能工作在设备坐标下。 <br />
还有我们有时需要利用物理坐标，物理坐标的概念就是现实世界的实际尺寸。 <br />
设备坐标-逻辑坐标-物理坐标之间如何进行转换便成为我们要考虑的一个问题，物理坐标和逻辑坐标是完全要我们自己来做的，但WINDOWS提供了函数来帮助我们转换逻辑坐标和设备坐标。 </p>
<p>CDC的LPtoDP函数可以将逻辑坐标转换成设备坐标 <br />
CDC的DPtoLP函数可以将设备坐标转换成逻辑坐标 </p>
<p>下面列出我们应该在什么时候使用什么样的坐标系一定要记住： </p>
<p>◎CDC的所有成员函数都以逻辑坐标为参数 <br />
◎CWnd的所有成员函数都以设备坐标为参数 <br />
◎区域的定义采用设备坐标 <br />
◎所有的选中测试操作应考虑使用设备坐标。 <br />
◎需要长时间使用的值用逻辑坐标或物理坐标来保存。因设备坐标会因窗口的滚动变化而改变。 <br />
用书上的例子作为以前几篇的复习，如果你能够独立完成它说明前面的内容已经掌握。另外有些东西是新的，我会比较详细的做出说明，例如客户区、滚动窗口等。 </p>
<p>下面我们来一步步完成例子6-5： </p>
<p>■第一步：用AppWizard创建MyApp6。除了Setp 1 选择单文档视图和Setp 6 选择基类为CScrollView外其余均为确省。 </p>
<p>■第二步：在CMyApp6View类中增加m_rectEllipse和m_nColor两个私有数据成员。你可以手工在myapp6View.h添加，不过雷神建议这样做，在ClassView中选中CMyApp6View类，击右键选择Add Member Variable插入它们。 </p>
<p>//************************** <br />
// myapp6View.h <br />
private: <br />
int m_nColor; //存放椭圆颜色值 <br />
CRect m_rectEllipse; //存放椭圆外接矩形 </p>
<p>//*************************************************** </p>
<p>问题1： CRect是什么？ <br />
CRect是类，是从RECT结构派生的，和它类似的还有从POINT结构派生的CPoint、从SIZE派生的CSize。因此它们继承了结构中定义的公有整数数据成员，并且由于三个类的一些操作符被重载所以可以直接在三个类之间进行类的运算。 <br />
//重载operator + <br />
CRect operator +( POINT point ) const; <br />
CRect operator +( LPCRECT lpRect ) const; <br />
CRect operator +( SIZE size ) const; <br />
//重载operator - <br />
CRect operator -( POINT point ) const; <br />
CRect operator -( SIZE size ) const; <br />
CRect operator -( LPCRECT lpRect ) const; <br />
...... <br />
更多的请在MSDN中查看 </p>
<p>■第三步：修改由AppWizard生成的OnIntitalUpdate函数 </p>
<p>void CMyApp6View::OnInitialUpdate() <br />
{ <br />
CScrollView::OnInitialUpdate(); <br />
CSize sizeTotal(20000,30000); <br />
CSize sizePage(sizeTotal.cx /2,sizeTotal.cy /2); <br />
CSize sizeLine(sizeTotal.cx /50,sizeTotal.cy/50); <br />
SetScrollSizes(MM_HIMETRIC,sizeTotal,sizePage,sizeLine);//设置滚动视图的逻辑尺寸和映射模式 <br />
} </p>
<p>问题2： 关于void CMyApp6View::OnInitialUpdate() </p>
<p>函数OnInitialUpdate()是一个非常重要的虚函数，在视图窗口完全建立后框架用的第一个函数，框架在第一次调用OnDraw前会调用它。因此这个函数是设置滚动视图的逻辑尺寸和映射模式的最佳地点。 </p>
<p>■第四步：编辑CMyApp6View构造函数和OnDraw函数 </p>
<p>//********************************************* <br />
// CMyApp6View构造函数 <br />
// <br />
CMyApp6View::CMyApp6View():m_rectEllipse(0,0,4000,-4000)//椭圆矩形为4*4厘米。 <br />
{ <br />
m_nColor=GRAY_BRUSH;//设定刷子颜色 <br />
} </p>
<p>//************ <br />
本文来自: 站长(http://www.qqcf.com) 详细出处参考：http://study.qqcf.com/web/189/21186.htm</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 18:53 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CRect类详解</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330318.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330318.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330318.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330318.html</trackback:ping><description><![CDATA[http://www.vcshare.net/jichu/jichu_212.htm<br />
我用金山快译查了一下没有rect这个单词，估计是rectangle的简写，rectangle是长方形、矩形的意思。<br />
默认坐标系：原点为左上角，右边为x轴正方向，下边为y轴正方向。<br />
<br />
<span style="color: #339966"><span style="color: #008000"><strong style="color: #333399">构造函数(CRect)有五个原型，第二个原型和第三个原型是拷贝构造函数。现在我用其它三个构造函数构造一个左上角坐标为(10,20)，x方向边长为100，y方向边<br />
<br />
长有200的矩形。<br />
原型一：<br />
CRect r1(10,20,110,220);</strong></span><br />
</span>原型四：<br />
POINT pt = {10,20};<br />
SIZE size = {100,200};<br />
CRect r2(pt,size);<br />
原型五：<br />
POINT topLeft = {10,20};<br />
POINT bottomRight = {110,220} ;<br />
CRect r3(topLeft,bottomRight); <br />
<br />
下面的代码可以查一个矩形的大小，新建一个单文档工程Sdi，修改OnDraw函数：<br />
void CSdiView::OnDraw(CDC* pDC)<br />
{<br />
CSdiDoc* pDoc = GetDocument();<br />
ASSERT_VALID(pDoc);<br />
<br />
CRect r1(10,20,110,220); <br />
pDC-&gt;Rectangle(&amp;r1);<br />
}<br />
<br />
int Width( ) const;<br />
取得宽度，int iWidth = r1.Width();iWidth的会上为100。<br />
<br />
int Height( ) const;<br />
取得高度，int iHeight = r1.Height();iHeight的结果是200。<br />
<br />
CSize Size( ) const;<br />
取得宽和高，CSize size = r1.Size();size.cx为100，size.cy为200。<br />
<br />
CPoint&amp; TopLeft( );<br />
取得左上角的坐标，由于返回值是引用，所以可以通过此函数的返回值，修改左上角。<br />
CRect r1(10,20,110,220);<br />
r1.TopLeft().x = 0;<br />
r1.TopLeft().y = 0 ;<br />
r1的左上角坐标变为(0,0)，也可以通过此函数取得左上角的坐标。<br />
CRect r1(10,20,110,220);<br />
CPoint TopLeft = r1.TopLeft();<br />
TopLeft.x的值为10，TopLeft.y的值为20。<br />
<br />
BottomRight取得右下角坐标<br />
<br />
CPoint CenterPoint( ) const;取得中心得的坐标，CPoint pt = r1.CenterPoint();pt为(60,120)。<br />
<br />
BOOL IsRectEmpty( ) const;如果长席或宽度为0或非法，返回真；否则返回假。<br />
CRect r1(210,20,110,220);<br />
bool bEmpty = r1.IsRectEmpty();<br />
结果为真，因为左边比右边还大。<br />
<br />
CRect::IsRectNull，四个边的坐标都为0，结果为真，否则为假。<br />
<br />
BOOL PtInRect( POINT point ) const;查看一个点是否在矩形内。<br />
CRect r1(10,20,110,220);<br />
POINT pt1={10,10};<br />
POINT pt2={10,30};<br />
bool bIn1 = r1.PtInRect(pt1);<br />
bool bIn2 = r1.PtInRect(pt2);<br />
bIn1为假，bIn2为真。<br />
<br />
CRect::SetRect，设置四个边的值，用法类似于构造函数的原型一。<br />
<br />
CRect::SetRectEmpty，将四个边的坐标设置为0。<br />
<br />
void CopyRect( LPCRECT lpSrcRect );复制。<br />
CRect r2;<br />
r2.CopyRect(&amp;r1);<br />
r2的值和r1的值相同。<br />
<br />
CRect::EqualRect，两个矩形是不是相同，四边坐标必须相同。<br />
CRect r1(10,20,110,220); <br />
CRect r2(110,220,10,20); <br />
bool bEqual = r1.EqualRect(r2);<br />
bEqual的值为假，因为他们的上下左右边不同，是反过来的。<br />
CRect r1(110,220,10,20); <br />
CRect r2(110,220,10,20); <br />
bool bEqual = r1.EqualRect(r2);<br />
bEqual为真，因为四边相同。<br />
<br />
CRect::InflateRect，增加宽和高。<br />
CRect r(0,0,0,0);<br />
r.InflateRect(2,3);//结果为(-2,-3,2,3);<br />
SIZE size = {3,2};<br />
r.InflateRect(size);//结果为(-5,-5,5,5);<br />
CRect r1(-5,-5,-5,-5);<br />
r.InflateRect(&amp;r1);//结果为(0,0,0,0);<br />
//左边左移-1(右移1)，上边上移-1，右边右移2，下边下移2<br />
r.InflateRect(-1,-1,2,2);//结果为(1,1,2,2);<br />
<br />
CRect::DeflateRect，减少宽和高，方法与InflateRect类似。<br />
<br />
CRect::NormalizeRect，标准化，调整上下边和左右边，使得符合人类逻辑。<br />
CRect r(10,10,0,0);<br />
r.NormalizeRect();<br />
结果为(0,0,10,10)<br />
<br />
CRect::OffsetRect，移动整个矩形。<br />
CRect r(0,0,10,10);<br />
r.OffsetRect(1,1);//右移1，下移1<br />
POINT point = {1,1};<br />
r.OffsetRect(point);//再右移1,再下移1<br />
SIZE size = {-2,-2};<br />
r.OffsetRect(size);//右移-2，下移-2<br />
<br />
CRect::SubtractRect，lpRectSrc1减去lpRectSrc2，注意不是减号。过程不好表达，运行下面的代码就可以看到效果了。<br />
void CSdiView::OnDraw(CDC* pDC)<br />
{<br />
pDC-&gt;SelectStockObject(NULL_BRUSH);<br />
CRect r1(10,10, 100,100);<br />
CRect r2(50,10, 150,150);//和CRect r2(50,50, 150,150);结果不一样<br />
pDC-&gt;Rectangle(r1);<br />
pDC-&gt;Rectangle(r2);<br />
<br />
{//红色区域是SubtractRect的结果<br />
CRect r ;<br />
r.SubtractRect(r1,r2);<br />
CBrush brush(RGB(255,0,0));<br />
pDC-&gt;SelectObject(&amp;brush);<br />
pDC-&gt;Rectangle(&amp;r);<br />
} <br />
}<br />
<br />
CRect::IntersectRect，求交集<br />
void CSdiView::OnDraw(CDC* pDC)<br />
{<br />
pDC-&gt;SelectStockObject(NULL_BRUSH);<br />
CRect r1(10,10, 100,100);<br />
CRect r2(50,10, 150,150);//和CRect r2(50,50, 150,150);结果不一样<br />
pDC-&gt;Rectangle(r1);<br />
pDC-&gt;Rectangle(r2);<br />
<br />
{//绿色区域是IntersectRect的结果 <br />
CRect r ;<br />
r.IntersectRect(r1,r2);<br />
CBrush brush(RGB(0,255,0));<br />
pDC-&gt;SelectObject(&amp;brush);<br />
pDC-&gt;Rectangle(&amp;r);<br />
}<br />
}<br />
<br />
CRect::UnionRect，求并集<br />
void CSdiView::OnDraw(CDC* pDC)<br />
{<br />
pDC-&gt;SelectStockObject(NULL_BRUSH);<br />
CRect r1(10,10, 100,100);<br />
CRect r2(50,50, 150,150);//和CRect r2(50,50, 150,150);结果不一样<br />
pDC-&gt;Rectangle(r1);<br />
pDC-&gt;Rectangle(r2);<br />
<br />
{//蓝色边框是UnionRect的结果 <br />
CRect r ;<br />
r.UnionRect(r1,r2);<br />
CPen pen(PS_DOT,1,RGB(0,0,255));<br />
pDC-&gt;SelectObject(&amp;pen);<br />
pDC-&gt;Rectangle(&amp;r);<br />
}<br />
}<br />
<br />
CRect::operator LPCRECT ，转化成LPCRECT类型。<br />
CRect::operator LPRECT ，转化成LPRECT<br />
CRect r(0,0,100,100);<br />
LPCRECT pCRect = r;<br />
LPRECT pRect = r;<br />
第二行会调用LPCRECT操作符，第三行调用LPRECT操作符。<br />
typedef const RECT* LPCRECT; // pointer to read/only RECT<br />
typedef struct tagRECT<br />
{<br />
LONG left;<br />
LONG top;<br />
LONG right;<br />
LONG bottom;<br />
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;<br />
<br />
CRect::operator = ，重载&#8220;=&#8221;运算符，实际调用CopyRect。<br />
CRect::operator ==，重载&#8220;==&#8221;运算符，实际调用EqualRect。<br />
operator !=，重载&#8220;!=&#8221;运算符，实际调用EqualRect。<br />
CRect::operator += ，重载&#8220;+=&#8221;运算符，第一个原型和第二个原型调用OffsetRect，第三个原型调用InflateRect。<br />
CRect::operator -=，重载&#8220;-=&#8221;运算符，第一个原型和第二个原型调用OffsetRect，第三个原型调用InflateRect。<br />
CRect::operator &amp;=,重载&#8220;&amp;=&#8221;运算符，实际调用IntersectRect。<br />
CRect::operator |= 重载&#8220;|=&#8221;运算符，实际调用UnionRect。<br />
+、-、&amp;、|和上面的类似，就不再详细讲解了。<br />
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 17:43 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetWindowOrg和SetViewportOrg这两个函数到底应该如何理解</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330296.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330296.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330296.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330296.html</trackback:ping><description><![CDATA[<p>http://xqscorpion.bokee.com/5172295.html<br />
最近突然又很有激情的开始看Jeff Prosise的那本"Programming Windows with MFC, 2 ed."。尽管是英文版的，但是感觉这本书上手比喉结的那本所谓的 深入浅出MFC 要容易理解的多。候同学给人一种故弄玄虚故作深沉的感觉，而Jeff Prosise的这本书才真正的称得上是深入浅出。</p>
<p>尽管如此，其中有关GDI绘图中的坐标映射部分还是有一个问题没有搞清楚，那就是http://xqscorpion.bokee.com/5172295.html。潘爱民翻译的那本VC内幕没有讲清楚；Jeff Prosise的这本书没有讲清楚；MSDN上的东西看的也是一头雾水；Charles Petzold的那本书还没有来得及看。因为这个问题，昨天晚上是带着遗憾的困惑入睡的。</p>
<p>总的来说，我对这两个函数的理解导致的结果是与实际程序运行的结果截然相反。依据MSDN上的解释，有一个很严重的问题没有阐述清楚，那就是：所谓的SetWindowOrg(x, y)函数，到底是表示set window origin to (x, y)还是set window origin as (x, y)；to和as在执行的时候，其操作的效果是截然相反的。</p>
<p>set window origin to (x, y)表示将坐标原点设置到(x, y)；即以(x, y)作为坐标原点，此时原点坐标不再为(0, 0)；<br />
set window origin as (x, y)表示将原来的原点(0, 0)的坐标改为(x, y)；即将所有点的坐标增加(+x, +y)；</p>
<p>现在我的理解是：应该是 set window origin to (x, y)。这种理解基于以下几个前提：<br />
1. 所有绘图语句中给出的坐标，全部是逻辑坐标，即在 window 中的坐标(相对于viewport所表示的设备坐标而言);<br />
2. 所有用户能看到的点，其设备坐标一定是位于(0, 0)和(1024, 768)范围内；(假设显示器为输出设备，采用MM_TEXT映射方式，且屏幕分辨率为1024*768);<br />
3. 所谓&#8220;(0,0)就原点，原点的坐标一定就是(0,0)&#8221;这种理解，是错误的；<br />
4. Viewport中的坐标表示设备坐标；Window中的坐标表示逻辑坐标；<br />
5. 当在逻辑坐标中指定新的原点后，在执行映射时，设备坐标的原点一定要与逻辑坐标的新原点重合；反过来也是一样，即两个坐标系的原点一定要重合。</p>
<p>下面举例说明：(MM_TEXT映射模式)</p>
<p><br />
(1)<br />
CRect rect(0, 0, 200, 200);<br />
dc.rectangle(rect);<br />
上面的语句在屏幕的最左上角绘制一个正方形;(因为此时逻辑坐标与设备坐标没有偏移)</p>
<p>(2)<br />
dc.SetViewportOrg(100, 100);<br />
CRect rect(0, 0, 200, 200);<br />
dc.rectangle(rect);<br />
将设备坐标的原点设置到(100, 100)；即设备坐标的原点不在(0, 0)处，而是在(100, 100)处；此时若执行映射的话，逻辑坐标的原点(0, 0)需要与设备坐标的原点(100, 100)重合(参考前提5)；那么此时绘制的矩形(0, 0, 200, 200)的坐标(为逻辑坐标，参考前提1)在设备坐标中就会映射为(100, 100, 300, 300)，最终我们在显示器上看到的会是一个向右下方偏移(100, 100)的一个边长为200的正方形(用户看到的点是在设备坐标中的，参考前提2)</p>
<p>(3)<br />
dc.SetWindowOrg(100, 100);<br />
CRect rect(0, 0, 200, 200);<br />
dc.rectangle(rect);<br />
将逻辑坐标的原点设置到(100, 100)；即逻辑坐标的原点不在(0, 0)处，而是在(100, 100)处；此时若执行映射的话，设备坐标的原点(0, 0)需要与逻辑坐标的原点(100, 100)重合(参考前提5)；那么此时绘制的矩形(0, 0, 200, 200)的坐标(为逻辑坐标，参考前提1)在设备坐标中就会映射为(-100, -100, 100, 100)，最终我们在显示器上看到的会是一个只有1/4个大小的矩形的一部分(事实上相当于向左上方偏移(100, 100)的一个边长为200的正方形。注意：用户看到的点是在设备坐标中的，参考前提2)</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 15:47 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CDC及其派生类CClientDC,CPaintDC,CWindowDC</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330294.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330294.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330294.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330294.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt">http://www.cppblog.com/Sandywin/archive/2007/11/16/36764.html<br />
1．首先介绍一下什么是DC（设备描述表）</span>
<p>Windows应用程序通过为指定设备（屏幕，打印机等）创建一个设备描述表（Device Context, DC）<span style="color: red">在DC表示的逻辑意义的&#8220;画布&#8221;上进行图形的绘制</span>。DC是一种包含设备信息的数据结构，它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC，并在不继续使用时释放掉。</p>
<p>2．CDC及其派生类</p>
<p>CDC及其派生类的继承视图:<br />
CObject<br />
public |------CDC<br />
public |------CClientDC<br />
public |------CPaintDC<br />
public |------CWindowDC<br />
public |------CMetaFileDC <br />
(注意: 除CMetaFileDC以外的三个派生类用于图形绘制.)<br />
[以下几段是翻译MSDN中资料]<br />
CDC类定义了一个设备描述表相关的类，其对象提供成员函数操作设备描述表进行工作，如显示器，打印机，以及显示器描述表相关的窗口客户区域。</p>
<p>通过CDC的成员函数可进行一切绘图操作。CDC提供成员函数进行设备描述表的基本操作，使用绘图工具， 选择类型安全的图形设备结构（GDI），以及色彩，调色板。除此之外还提供成员函数获取和设置绘图属性，映射，控制视口，窗体范围，转换坐标，区域操作，裁减，划线以及绘制简单图形（椭圆，多边形等）。成员函数也提供绘制文本，设置字体，打印机换码，滚动， 处理元文件。</p>
<p>&nbsp;</p>
<p><span style="color: red">通过CDC的成员函数可进行一切绘图操作</span>。CDC提供成员函数进行设备描述表的基本操作，使用绘图工具， 选择类型安全的图形设备结构（GDI），以及色彩，调色板。除此之外还提供成员函数获取和设置绘图属性，映射，控制视口，窗体范围，转换坐标，区域操作，裁减，划线以及绘制简单图形（椭圆，多边形等）。成员函数也提供绘制文本，设置字体，打印机换码，滚动， 处理元文件。</p>
<p>其派生类:<br />
PaintDC: 封装BeginPaint和EndPaint两个API的调用。<br />
CClientDC: 处理显示器描述表的相关的窗体客户区域。<br />
CWindowDC: 处理显示器描述表相关的整个窗体区域，包括了框架和控 件（子窗体）。<br />
CMetaFileDC: 与元文件相关的设备描述表关联。 </p>
<p>CDC提供两个函数，GetLayout和SetLayout用于反转设备描述表的布局。用于方便阿拉伯，希伯来的书写文化习惯的设计，以及非欧洲表中的字体布局。</p>
<p>CDC包含两个设备描述表，m_hDC和m_hAttribDC对应于相同的设备，CDC为m_hDC指定所有的输出GDI调用，大多数的GDI属性调用由m_hAttribDC控制。（如,GetTextColor是属性调用，而SetTextColor是一种输出调用。）</p>
<p>&nbsp;</p>
<p>例子：框架使用这两个设备描述表，一个对象从物理设备中读取属性输出到元文件。打印机预览在框架中被执行时也是相同的形式。你也可以编写代码使用这两个设备描述表在你的应用程序中进行类似的操作。</p>
<p>&nbsp;</p>
<p>3．使用方法</p>
<p>创建一个UseDC的MFC单文档程序，定制7个按钮用来选择使用的DC，每个按钮由一个成员变量标识控制[互斥]，分别是</p>
<p>bool m_bHDCDisplay ---- 使用整个屏幕的HDC；<br />
bool m_bHDC ---- 使用当前视图的对应的DC；<br />
bool m_bCDC ---- 使用CDC类[当前视图窗体]；<br />
bool m_bCClientDC ---- 使用CClientDC类[视图客户区域DC]；<br />
bool m_bCPaintDC ---- 使用CPaintDC[视图窗体]；<br />
bool m_bCWindowDC ---- 使用CWindowDC[整个视图窗体]；<br />
bool m_bCMetaFileDC ---- 使用CMetaFileDC</p>
<p>添加7个按钮的响应函数以控制这些bool变量.（这里比较简单我就不提供代码了）</p>
<p>视图类构造函数：</p>
<p>CUseDCView::CUseDCView()</p>
<p>{</p>
<p>this-&gt;m_bHDCDisplay = false;<br />
this-&gt;m_bHDC = false; <br />
this-&gt;m_bCDC = false; <br />
this-&gt;m_bCClientDC = false; <br />
this-&gt;m_bCPaintDC = false;<br />
this-&gt;m_bCWindowDC = false; <br />
this-&gt;m_bCMetaFileDC = false;<br />
m_hMetaFile = NULL;</p>
<p>}</p>
<p>视图类OnDraw函数</p>
<p>void CUseDCView::OnDraw(CDC* pDC)</p>
<p>{</p>
<p>CUseDCDoc* pDoc = GetDocument();<br />
ASSERT_VALID(pDoc);</p>
<p>//窗体在OnDraw中会自动传入关联当前视图窗体客户矩形区域的CPaintDC<br />
//才能获取相应的设备描述表</p>
<p>HDC HDCDisplay = NULL; //屏幕DC的句柄 对应m_bHDCDisplay<br />
HDC hDC = NULL; //普通DC的句柄 对应m_bHDC;<br />
CDC * pCDC = NULL; //对应m_bCDC<br />
CClientDC * pClientDC = NULL; //对应m_bCClientDC<br />
CPaintDC * pPaintDC = NULL; //对应m_bCPaintDC <br />
CWindowDC * pWindowDC = NULL; //对应m_bCWindowDC <br />
CMetaFileDC * pMetaFileDC = NULL; //对应m_bMetaFileDC</p>
<p>HMETAFILE hMetaFile = NULL;<br />
&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
&lt;!--[endif]--&gt;</p>
<p>RECT rect; //定义一个设备左上角的矩形区域<br />
rect.left = 0;<br />
rect.top = 0;<br />
rect.right = 200;<br />
rect.bottom = 30;</p>
<p>//注意: HDCDisplay和hDC的::Release()中第一个参数HWND<br />
//与GetDC()的第一个参数必须对应。<br />
if(m_bHDCDisplay)<br />
{<br />
HDCDisplay = ::GetDC(NULL); //获得整个显示器区域的DC<br />
::DrawText(HDCDisplay, "HDC of Display", 14, &amp;rect, DT_LEFT|DT_TOP);<br />
::ReleaseDC(NULL, HDCDisplay);<br />
HDCDisplay = NULL;<br />
}<br />
if(m_bHDC) //绘制在客户区域<br />
{<br />
hDC = ::GetDC(this-&gt;m_hWnd); //本窗体的DC<br />
::DrawText(hDC, "HDC", 3, &amp;rect, DT_LEFT|DT_TOP);<br />
::ReleaseDC(this-&gt;m_hWnd, hDC);<br />
hDC = NULL;<br />
}<br />
else if(m_bCDC){<br />
//必须释放由程序框架传入的pDC才能获取当前客户区域设备描述表<br />
pCDC = this-&gt;GetDC(); //当前窗体(视图)的设备描述表<br />
pCDC-&gt;DrawText("Use class CDC", 13, &amp;rect, DT_LEFT|DT_TOP);<br />
this-&gt;ReleaseDC(pCDC);<br />
pCDC = NULL;<br />
}<br />
else if(m_bCClientDC){<br />
pClientDC = new CClientDC(this); //获取本窗体客户区域的DC<br />
pClientDC-&gt;DrawText("Use class CClientDC", &amp;rect, DT_LEFT|DT_TOP);<br />
delete pClientDC;<br />
pClientDC = NULL;<br />
}<br />
else if(m_bCPaintDC) { //测试当前传入的CDC是不是CPaintDC<br />
pPaintDC = (CPaintDC*)pDC;<br />
pPaintDC-&gt;DrawText("Use class CPaintDC", &amp;rect, DT_LEFT|DT_TOP);<br />
}<br />
else if(m_bCWindowDC){<br />
pWindowDC = new CWindowDC(this); //获取本窗体框架和客户区域的DC<br />
//注意：绘制字符串的矩形区域空白部分覆盖了视图子窗体的边缘．<br />
pWindowDC-&gt;DrawText("Use class CWindowDC", &amp;rect, DT_LEFT|DT_TOP);<br />
delete pWindowDC;<br />
pWindowDC = NULL;<br />
}<br />
else if(m_bCMetaFileDC){<br />
//传入pDC-&gt;m_hDC使用pDC绘制,图形在视图窗体左上角<br />
pMetaFileDC = new CMetaFileDC();<br />
pMetaFileDC-&gt;m_hDC = pDC-&gt;m_hDC;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
delete pMetaFileDC;<br />
pDC-&gt;PlayMetaFile(m_hMetaFile);<br />
}</p>
<p>}</p>
<p>MFC程序中使用CPaintDC在视图窗口中绘制图象时要注意，应该在OnPaint()编写关于CPaintDC相关的代码，而不是在OnDraw()中.但是请注意，如果使用OnPaint()函数响应WM_PAINT事件，OnDraw函数将会被屏蔽；</p>
<p>可以使用以下代码测试：</p>
<p>在CUseDCView.h，CUseDCView的类定义中语句DECLARE_MESSAGE_MAP()之前加上afx_msg void OnPaint()，在CUseDCView.cpp中BEGIN_MESSAGE_MAP (CUseDCView, CView)和END_MESSAGE_MAP()之间加上ON_WM_PAINT()。</p>
<p>void CUseDCView::OnPaint() </p>
<p>{<br />
CPaintDC dc(this); <br />
RECT rect; <br />
rect.left = 0;<br />
rect.top = 0;<br />
rect.right = 200;<br />
rect.bottom = 30;<br />
dc.Draw3dRect(&amp;rect, (COLORREF)0xff0000, (COLORREF)0x0000ff);<br />
}</p>
<p>使用CMetaFileDC</p>
<p>有兴趣可以在以下语句中可以尝试以下几种情况：</p>
<p>else if(m_bCMetaFileDC){</p>
<p>...<br />
...</p>
<p>}</p>
<p>情况1：（与上面的OnDraw函数中相同）<br />
//传入pDC-&gt;m_hDC使用pDC绘制,图形在视图窗体左上角<br />
pMetaFileDC = new CMetaFileDC();<br />
pMetaFileDC-&gt;m_hDC = pDC-&gt;m_hDC;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close();<br />
delete pMetaFileDC;<br />
pDC-&gt;PlayMetaFile(m_hMetaFile); </p>
<p>情况2：</p>
<p>//传入pDC-&gt;m_hDC使用屏幕DC绘制,图形在视图窗体左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = ::GetDC(NULL);<br />
pMetaFileDC-&gt;m_hDC = pDC-&gt;m_hDC;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
delete pMetaFileDC;<br />
::PlayMetaFile(hdc, m_hMetaFile);<br />
::ReleaseDC(NULL, hdc);</p>
<p>情况3：</p>
<p>//传入屏幕DC,使用屏幕DC绘制,图像在屏幕左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = ::GetDC(NULL);<br />
pMetaFileDC-&gt;m_hDC = hdc;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
delete pMetaFileDC;<br />
::PlayMetaFile(hdc, m_hMetaFile);<br />
::ReleaseDC(NULL, hdc);</p>
<p>情况4：</p>
<p>//传入屏幕DC,使用pDC绘制, 图像在屏幕左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = ::GetDC(NULL);<br />
pMetaFileDC-&gt;m_hDC = hdc;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
delete pMetaFileDC;<br />
pDC-&gt;PlayMetaFile(m_hMetaFile);<br />
::ReleaseDC(NULL, hdc);</p>
<p>情况5：</p>
<p>//传入屏幕DC,使用pDC绘制,但是绘制前释放屏幕DC,<br />
//没有出错,而且图像绘制在屏幕左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = ::GetDC(NULL);<br />
pMetaFileDC-&gt;m_hDC = hdc;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
delete pMetaFileDC;<br />
::ReleaseDC(NULL, hdc); <br />
pDC-&gt;PlayMetaFile(m_hMetaFile);</p>
<p>情况6：</p>
<p>//传入屏幕pDC-&gt;hDC,使用CMetaFileDC绘制，图像在视图窗体左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = pDC-&gt;m_hDC;<br />
pMetaFileDC-&gt;m_hDC = hdc;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
pMetaFileDC-&gt;PlayMetaFile(m_hMetaFile);<br />
delete pMetaFileDC;<br />
::ReleaseDC(NULL, hdc);</p>
<p>情况7：</p>
<p>//传入屏幕DC,使用CMetaFileDC绘制，图像在屏幕左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = ::GetDC(NULL);<br />
pMetaFileDC-&gt;m_hDC = hdc;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
pMetaFileDC-&gt;PlayMetaFile(m_hMetaFile);<br />
delete pMetaFileDC;<br />
::ReleaseDC(NULL, hdc);</p>
<p>情况8：</p>
<p>//传入屏幕DC,使用CMetaFileDC绘制，绘图前释放hdc<br />
//仍然没有出错,图像在屏幕左上角<br />
HDC hdc;<br />
pMetaFileDC = new CMetaFileDC();<br />
hdc = ::GetDC(NULL);<br />
pMetaFileDC-&gt;m_hDC = hdc;<br />
pMetaFileDC-&gt;DrawText("Use class CMetaFileDC", &amp;rect, DT_LEFT|DT_TOP);<br />
pMetaFileDC-&gt;Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);<br />
m_hMetaFile = pMetaFileDC-&gt;Close(); <br />
::ReleaseDC(NULL, hdc);<br />
pMetaFileDC-&gt;PlayMetaFile(m_hMetaFile);<br />
delete pMetaFileDC;</p>
<p>由上面代码可见绘图的位置与传入CMetaFileDC::m_hDC的值有关。</p>
<p>使用CMetaFileDC需要注意：</p>
<p>使用CMetaFileDC对象调用一系列你想重复的CDC的GDI命令，只能使用CDC类中GDI输出命令。CDC的PlayMetaFile可以使用图元文件句柄来执行图元文件中的命令，图元文件也能使用CopyMetaFile使其存储在磁盘上。当不再需要图元文件时，调用DeleteMetaFile从内存中删除它。</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 15:40 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Map的详细使用</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330281.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Mon, 30 Aug 2010 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330281.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330281.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330281.html</trackback:ping><description><![CDATA[<p>http://www.800l.com/stl-map.html<br />
Map是STL的一个关联容器，它提供一对一（其中第一个可以称为关键字，每个关键字只能在map中出现一次，第二个可能称为该关键字的值）的数据处理能力，由于这个特性，它完成有可能在我们处理一对一数据的时候，在编程上提供快速通道。这里说下map内部数据的组织，map内部自建一颗红黑树(一种非严格意义上的平衡二叉树)，这颗树具有对数据自动排序的功能，所以在map内部所有的数据都是有序的，后边我们会见识到有序的好处。<br />
下面举例说明什么是一对一的数据映射。比如一个班级中，每个学生的学号跟他的姓名就存在着一一映射的关系，这个模型用map可能轻易描述，很明显学号用int描述，姓名用字符串描述(本篇文章中不用char *来描述字符串，而是采用STL中string来描述),下面给出map描述代码：<br />
<code><br />
map&lt;int,string&gt; mapStudent;<br />
</code><br />
<br />
1.map的构造函数<br />
map共提供了6个构造函数，这块涉及到内存分配器这些东西，略过不表，在下面我们将接触到一些map的构造方法，这里要说下的就是，我们通常用如下方法构造一个map：<br />
<code><br />
map&lt;int,string&gt; mapStudent;<br />
</code><br />
2.数据的插入<br />
在构造map容器后，我们就可以往里面插入数据了。这里讲三种插入数据的方法：</p>
<p>第一种：用insert函数插入pair数据，下面举例说明(以下代码虽然是随手写的，应该可以在VC和GCC下编译通过，大家可以运行下看什么效果，在VC下请加入这条语句，屏蔽4786警告&nbsp; ＃pragma warning (disable:4786) )<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(1,"student_one"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(2,"student_two"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(3,"student_three"));<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first&lt;&lt;' '&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
第二种：用insert函数插入value_type数据，下面举例说明<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent.insert(map&lt;int,string&gt;::value_type(1,"student_one"));<br />
&nbsp;mapStudent.insert(map&lt;int,string&gt;::value_type(2,"student_two"));<br />
&nbsp;mapStudent.insert(map&lt;int,string&gt;::value_type(3,"student_three"));<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first&lt;&lt;' '&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
第三种：用数组方式插入数据，下面举例说明<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent[1]="student_one";<br />
&nbsp;mapStudent[2]="student_two";<br />
&nbsp;mapStudent[3]="student_three";<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first&lt;&lt;' '&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
以上三种用法，虽然都可以实现数据的插入，但是它们是有区别的，当然了第一种和第二种在效果上是完成一样的，用insert函数插入数据，在数据的插入上涉及到集合的唯一性这个概念，即当map中有这个关键字时，insert操作是插入数据不了的，但是用数组方式就不同了，它可以覆盖以前该关键字对应的值，用程序说明<br />
<code><br />
mapStudent.insert(map&lt;int,string&gt;::value_type(1,"student_one"));<br />
mapStudent.insert(map&lt;int,string&gt;::value_type(1,"student_two"));<br />
</code><br />
上面这两条语句执行后，map中1这个关键字对应的值是&#8220;student_one&#8221;，第二条语句并没有生效，那么这就涉及到我们怎么知道insert语句是否插入成功的问题了，可以用pair来获得是否插入成功，程序如下<br />
<code><br />
pair&lt;map&lt;int,string&gt;::iterator,bool&gt; Insert_Pair;<br />
Insert_Pair=mapStudent.insert(map&lt;int,string&gt;::value_type(1,"student_one"));<br />
</code><br />
我们通过pair的第二个变量来知道是否插入成功，它的第一个变量返回的是一个map的迭代器，如果插入成功的话Insert_Pair.second应该是true的，否则为false。</p>
<p>下面给出完成代码，演示插入成功与否问题<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;pair&lt;map&lt;int,string&gt;::iterator,bool&gt; Insert_Pair;<br />
&nbsp;Insert_Pair＝mapStudent.insert(pair&lt;int,string&gt;(1,"student_one"));<br />
&nbsp;if(Insert_Pair.second==true)<br />
&nbsp;&nbsp;cout&lt;&lt;"Insert Successfully!"&lt;&lt;endl;<br />
&nbsp;else<br />
&nbsp;&nbsp;cout&lt;&lt;"Insert Failure."&lt;&lt;endl;<br />
&nbsp;Insert_Pair＝mapStudent.insert(pair&lt;int,string&gt;(1,"student_two"));<br />
&nbsp;if(Insert_Pair.second==true)<br />
&nbsp;&nbsp;cout&lt;&lt;"Insert Successfully!"&lt;&lt;endl;<br />
&nbsp;else<br />
&nbsp;&nbsp;cout&lt;&lt;"Insert Failure."&lt;&lt;endl;<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first&lt;&lt;' '&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
大家可以用如下程序，看下用数组插入在数据覆盖上的效果<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent[1]="student_one";<br />
&nbsp;mapStudent[1]="student_two";<br />
&nbsp;mapStudent[2]="student_three";<br />
&nbsp;map&lt;int,string&gt;::iterator&nbsp; iter;<br />
&nbsp;for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first&lt;&lt;' '&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
3.map的大小</p>
<p>在往map里面插入了数据，我们怎么知道当前已经插入了多少数据呢，可以用size函数，用法如下：<br />
<code><br />
int nSize=mapStudent.size();<br />
</code><br />
4.数据的遍历</p>
<p>这里也提供三种方法，对map进行遍历</p>
<p>第一种：应用前向迭代器，上面举例程序中到处都是了，略过不表</p>
<p>第二种：应用反相迭代器，下面举例说明，要体会效果，请自个动手运行程序<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(1,"student_one"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(2,"student_two"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(3,"student_three"));<br />
&nbsp;map&lt;int,string&gt;::reverse_iterator iter;<br />
&nbsp;for(iter=mapStudent.rbegin();iter!=mapStudent.rend();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first&lt;&lt;' '&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
第三种：用数组方式，程序说明如下<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int, string&gt; mapStudent;<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(1,"student_one"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(2,"student_two"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(3,"student_three"));<br />
&nbsp;int nSize=mapStudent.size();<br />
&nbsp;for(int nIndex=1;nIndex&lt;=nSize;nIndex++)<br />
&nbsp;&nbsp;cout&lt;&lt;mapStudent[nIndex]&lt;&lt;endl;<br />
}<br />
</code><br />
5.数据的查找（包括判定这个关键字是否在map中出现）</p>
<p>在这里我们将体会，map在数据插入时保证有序的好处。<br />
要判定一个数据（关键字）是否在map中出现的方法比较多，这里标题虽然是数据的查找，在这里将穿插着大量的map基本用法。</p>
<p>这里给出三种数据查找方法</p>
<p>第一种：用count函数来判定关键字是否出现，其缺点是无法定位数据出现位置,由于map的特性，一对一的映射关系，就决定了count函数的返回值只有两个，要么是0，要么是1，出现的情况，当然是返回1了</p>
<p>第二种：用find函数来定位数据出现位置，它返回的一个迭代器，当数据出现时，它返回数据所在位置的迭代器，如果map中没有要查找的数据，它返回的迭代器等于end函数返回的迭代器，程序说明<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(1,"student_one"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(2,"student_two"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(3,"student_three"));<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;iter=mapStudent.find(1);<br />
&nbsp;if(iter!=mapStudent.end())<br />
&nbsp;&nbsp;cout&lt;&lt;"Find,the value is "&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
&nbsp;else<br />
&nbsp;&nbsp;cout&lt;&lt;"Do not Find."&lt;&lt;endl;<br />
}<br />
</code><br />
第三种：这个方法用来判定数据是否出现，是显得笨了点，但是，我打算在这里讲解</p>
<p>Lower_bound函数用法，这个函数用来返回要查找关键字的下界(是一个迭代器)<br />
Upper_bound函数用法，这个函数用来返回要查找关键字的上界(是一个迭代器)<br />
例如：map中已经插入了1，2，3，4的话，如果lower_bound(2)的话，返回的2，而upper-bound（2）的话，返回的就是3<br />
Equal_range函数返回一个pair，pair里面第一个变量是Lower_bound返回的迭代器，pair里面第二个迭代器是Upper_bound返回的迭代器，如果这两个迭代器相等的话，则说明map中不出现这个关键字，程序说明<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent[1]="student_one";<br />
&nbsp;mapStudent[3]="student_three";<br />
&nbsp;mapStudent[5]="student_five";<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;iter=mapStudent.lower_bound(2);<br />
&nbsp;cout&lt;&lt;iter-&gt;second&lt;&lt;endl;//返回的是下界3的迭代器<br />
&nbsp;iter=mapStudent.lower_bound(3);<br />
&nbsp;cout&lt;&lt;iter-&gt;second&lt;&lt;endl;//返回的是下界3的迭代器<br />
&nbsp;iter=mapStudent.upper_bound(2);<br />
&nbsp;cout&lt;&lt;iter-&gt;second&lt;&lt;endl;//返回的是上界3的迭代器<br />
&nbsp;iter=mapStudent.upper_bound(3);<br />
&nbsp;cout&lt;&lt;iter-&gt;second&lt;&lt;endl;//返回的是上界5的迭代器<br />
&nbsp;pair&lt;map&lt;int,string&gt;::iterator,map&lt;int,string&gt;::iterator&gt; mapPair;<br />
&nbsp;mapPair=mapStudent.equal_range(2);<br />
&nbsp;if(mapPair.first==mapPair.second)<br />
&nbsp;&nbsp;cout&lt;&lt;"Do not Find."&lt;&lt;endl;<br />
&nbsp;else<br />
&nbsp;&nbsp;cout&lt;&lt;"Find."&lt;&lt;endl;<br />
&nbsp;mapPair=mapStudent.equal_range(3);<br />
&nbsp;if(mapPair.first==mapPair.second)<br />
&nbsp;&nbsp;cout&lt;&lt;"Do not Find."&lt;&lt;endl;<br />
&nbsp;else<br />
&nbsp;&nbsp;cout&lt;&lt;"Find."&lt;&lt;endl;<br />
}<br />
</code><br />
6.数据的清空与判空</p>
<p>清空map中的数据可以用clear()函数，判定map中是否有数据可以用empty()函数，它返回true则说明是空map。</p>
<p>7.数据的删除</p>
<p>这里要用到erase函数，它有三个重载了的函数，下面在例子中详细说明它们的用法<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main()<br />
{<br />
&nbsp;map&lt;int,string&gt; mapStudent;<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(1,"student_one"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(2,"student_two"));<br />
&nbsp;mapStudent.insert(pair&lt;int,string&gt;(3,"student_three"));<br />
&nbsp;//如果你要演示输出效果，请选择以下的一种，你看到的效果会比较好<br />
&nbsp;//如果要删除1,用迭代器删除<br />
&nbsp;map&lt;int,string&gt;::iterator iter;<br />
&nbsp;iter=mapStudent.find(1);<br />
&nbsp;mapStudent.erase(iter);</code><br />
8.其他一些函数用法</p>
<p>&nbsp;//如果要删除1，用关键字删除<br />
&nbsp;int n=mapStudent.erase(1);//如果删除了会返回1，否则返回0</p>
<p><span style="color: red">&nbsp;//用迭代器，成片的删除<br />
&nbsp;//一下代码把整个map清空<br />
&nbsp;mapStudent.earse(mapStudent.begin(),mapStudent.end());</span></p>
<p>&nbsp;//成片删除要注意的是，也是STL的特性，删除区间是一个前闭后开的集合<br />
&nbsp;//自个加上遍历代码，打印输出吧<br />
}</p>
<p>这里有swap,key_comp,value_comp,get_allocator等函数，感觉到这些函数在编程用的不是很多，略过不表，有兴趣的话可以自个研究。</p>
<p>9.排序</p>
<p>这里要讲的是一点比较高深的用法了,排序问题，STL中默认是采用小于号来排序的，以上代码在排序上是不存在任何问题的，因为上面的关键字是int型，它本身支持小于号运算，在一些特殊情况，比如关键字是一个结构体，涉及到排序就会出现问题，因为它没有小于号操作，insert等函数在编译的时候过不去，下面给出两个方法解决这个问题</p>
<p>第一种：小于号重载，程序举例<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
using namespace std;<br />
typedef struct tagStudentInfo<br />
{<br />
&nbsp;int nID;<br />
&nbsp;string strName;<br />
}StudentInfo,*PStudentInfo;//学生信息<br />
int main()<br />
{<br />
&nbsp;int nSize;<br />
&nbsp;//用学生信息映射分数<br />
&nbsp;map&lt;StudentInfo,int&gt;mapStudent;<br />
&nbsp;map&lt;StudentInfo,int&gt;::iterator iter;<br />
&nbsp;StudentInfo studentInfo;<br />
&nbsp;studentInfo.nID=1;<br />
&nbsp;studentInfo.strName="student_one";<br />
&nbsp;mapStudent.insert(pair&lt;StudentInfo,int&gt;(studentInfo,90));<br />
&nbsp;studentInfo.nID=2;<br />
&nbsp;studentInfo.strName="student_two";<br />
&nbsp;mapStudent.insert(pair&lt;StudentInfo,int&gt;(studentInfo,80));<br />
&nbsp;for(iter=mapStudent.begin();iter!=mapStudent.end();iter++)<br />
&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first.nID&lt;&lt;endl&lt;&lt;iter-&gt;first.strName&lt;&lt;endl&lt;&lt;iter-&gt;second&lt;&lt;endl;<br />
}<br />
</code><br />
以上程序是无法编译通过的，只要重载小于号，就OK了，如下：<br />
<code><br />
typedef struct tagStudentInfo<br />
{<br />
&nbsp;int nID;<br />
&nbsp;string strName;<br />
&nbsp;bool operator&lt;(tagStudentInfo const&amp; _A) const<br />
&nbsp;{<br />
&nbsp;&nbsp;//这个函数指定排序策略，按nID排序，如果nID相等的话，按strName排序<br />
&nbsp;&nbsp;if(nID&lt;_A.nID)<br />
&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;if(nID==_A.nID)<br />
&nbsp;&nbsp;&nbsp;return strName.compare(_A.strName)&lt;0;<br />
&nbsp;&nbsp;return false;<br />
&nbsp;}<br />
}StudentInfo,*PStudentInfo;&nbsp; //学生信息<br />
</code><br />
第二种：仿函数的应用，这个时候结构体中没有直接的小于号重载，程序说明<br />
<code><br />
#include &lt;map&gt;<br />
#include &lt;string&gt;<br />
using namespace std;<br />
typedef struct tagStudentInfo<br />
{<br />
&nbsp;Int nID;<br />
&nbsp;String strName;<br />
}StudentInfo,*PStudentInfo;&nbsp; //学生信息<br />
class sort<br />
{<br />
Public:<br />
&nbsp;bool operator()(StudentInfo const &amp;_A,StudentInfo const &amp;_B) const<br />
&nbsp;{<br />
&nbsp;&nbsp;if(_A.nID&lt;_B.nID)<br />
&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;if(_A.nID==_B.nID)<br />
&nbsp;&nbsp;&nbsp;return _A.strName.compare(_B.strName)&lt;0;<br />
&nbsp;&nbsp;return false;<br />
&nbsp;}<br />
};<br />
int main()<br />
{<br />
&nbsp;//用学生信息映射分数<br />
&nbsp;map&lt;StudentInfo,int,sort&gt;mapStudent;<br />
&nbsp;StudentInfo studentInfo;<br />
&nbsp;studentInfo.nID = 1;<br />
&nbsp;studentInfo.strName ="student_one";<br />
&nbsp;mapStudent.insert(pair&lt;StudentInfo,int&gt;(studentInfo,90));<br />
&nbsp;studentInfo.nID=2;<br />
&nbsp;studentInfo.strName="student_two";<br />
&nbsp;mapStudent.insert(pair&lt;StudentInfo,int&gt;(studentInfo,80));<br />
}<br />
</code><br />
10.&nbsp;&nbsp; 另外</p>
<p>由于STL是一个统一的整体，map的很多用法都和STL中其它的东西结合在一起，比如在排序上，这里默认用的是小于号，即less&lt;&gt;，如果要从大到小排序呢，这里涉及到的东西很多，在此无法一一加以说明。</p>
<p>还要说明的是，map中由于它内部有序，由红黑树保证，因此很多函数执行的时间复杂度都是log2N的，如果用map函数可以实现的功能，而STL&nbsp; Algorithm也可以完成该功能，建议用map自带函数，效率高一些。</p>
<p>下面说下，map在空间上的特性，否则，估计你用起来会有时候表现的比较郁闷，由于map的每个数据对应红黑树上的一个节点，这个节点在不保存你的数据时，是占用16个字节的，一个父节点指针，左右孩子指针，还有一个枚举值（标示红黑的，相当于平衡二叉树中的平衡因子），我想大家应该知道，这些地方很费内存了吧，不说了&#8230;&#8230;</p>
<p>（本文为转载，作者佚名，留作存档，以便自己查找）</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-30 14:36 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/30/330281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Frame窗口类型</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330127.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 28 Aug 2010 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330127.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330127.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330127.html</trackback:ping><description><![CDATA[<p><span style="font-size: 9pt"><font color="#3973de" face="宋体, MS Song">http://xz7.2000y.net/mb/2/ReadNews.asp?NewsID=443411<br />
3.5.1&nbsp; 框架窗口</font></span></p>
<p><span style="font-size: 9pt">　　框架窗口为应用程序的用户界面提供结构框架，它是应用程序的主窗口，负责管理其包容的窗口，一个应用程序的最顶层的框架窗口是应用程序启动时创建的第一个窗口。<br />
　　MFC提供三种类型的框架窗口：单文档窗口，多文档窗口（MDI），对话框。在AppWizard的第一个对话框中，就提供了选项，让用户选择应用程序是基于单文档、多文档还是对话框的。MFC单文档窗口一次只能打开一个文档框架窗口，而MDI应用程序运行时，在应用程序的一个实例中打开多个文档框架窗口，这些窗口称作子窗口（Child Window）。这些文档可以是同一类型的，也可以是不同类型的。如Visual Studio就可以打开资源文件窗口和源程序窗口等不同类型的窗口。此时，激活不同类型的MDI子窗口，菜单也将相应变化。<br />
　　MFC提供了三个类CFrameWnd、CMDIFrameWnd、CMDIChildWnd和CDialog 分别用于支持单文档窗口、多文档窗口和对话框。</span></p>
<p><span style="font-size: 9pt">CFrameWnd<br />
　　用于SDI框架窗口，形成单个文档及其视的边框。框架窗口既是应用程序的主框架窗口，也是当前文档对应的视图的边框。</span></p>
<p><span style="font-size: 9pt">CMDIFrameWnd<br />
　　用于MDI应用程序的主框架窗口。主框架窗口是所有MDI文档窗口的容器，并与它们共享菜单条。MDI框架窗口是出现在桌面中的顶层窗口。</span></p>
<p><span style="font-size: 9pt">CMDIChildWnd<br />
　　用于在MDI主框架窗口中显示打开的各个文档。每个文档及其视都有一个MDI子框架窗口，子框架窗口包含在MDI主框架窗口中。子框架窗口看起来类似一般的框架边框窗口，但它是包含在主框架窗口中，而不是位于桌面的，并且为主窗口所裁剪。而且MDI子窗口没有自己的菜单，它与主MDI框架窗口共享菜单。</span></p>
<p><span style="font-size: 9pt">CDialog<br />
　　对话框是一种特殊类型的窗口，它的边框一般不可以调整，而且内部包含一些控件窗口。有关对话框作为主窗口的技术可以参见下一章。</span></p>
<p><span style="font-size: 9pt">　　要生成一个单文档窗口，主窗口就必须从CFrameWnd派生；要生成一个多文档窗口，主窗口就必须从CMDIFrameWnd派生，而且其中的子窗口必须从CMDIChildWnd派生出来；而基于对话框的窗口程序就要从CDialog派生出主窗口类。</span></p>
<p><span style="font-size: 9pt"><strong>子窗口<br />
　　子窗口就是具有WS_CHILD风格的窗口，且一定有一个父窗口。所有的控件都是子窗口。子窗口可以没有边框。子窗口被完全限制在父窗口内部。</strong></span></p>
<p><span style="font-size: 9pt"><strong>父窗口</strong><br />
<strong>　　父窗口就是拥有子窗口的窗口。</strong></span><span style="font-size: 9pt"><strong>弹出式窗口</strong><br />
<strong>　　具有WS_POPUP风格，它可以没有父窗口。这种窗口几乎什么都没有，可看作一个矩形区域。</strong></span><span style="font-size: 9pt"><strong>3.5.2窗口的创建</strong></span></p>
<p><span style="font-size: 9pt">窗口的创建分为两步：第一步是用new创建一个C++的窗口对象，但是此时只是初始化窗口的数据成员，并没有真正创建窗口（这一点与一般的对象有所不同）。</span></p>
<p><span style="font-size: 9pt">//第一步：创建一个C++对象，其中CMainFrame是从CFrameWnd派生的对象。</span></p>
<p><span style="font-size: 9pt">CMainFrame* pMyFrame=new CMainFrame();//用new操作符创建窗口对象</span></p>
<p><span style="font-size: 9pt">或</span></p>
<p><span style="font-size: 9pt">CMainFrame MyFrame;//定义一个窗口对象，自动调用其构造函数</span></p>
<p><span style="font-size: 9pt">第二步是创建窗口。CFrameWnd的Create成员函数把窗口给做出来，并将其HWND保存在C++对象的公共数据成员m_hWnd中。</span></p>
<p><span style="font-size: 9pt">//第二步：创建窗口</span></p>
<p><span style="font-size: 9pt">pMyFrame-&gt;Create(NULL,&#8220;My Frame Window&#8221;);</span></p>
<p><span style="font-size: 9pt">或</span></p>
<p><span style="font-size: 9pt">MyFrame.Create(NULL,&#8220;My Frame Window&#8221;);</span></p>
<p><span style="font-size: 9pt">Create函数的原形如下：</span></p>
<blockquote>
<blockquote>
<p><span style="font-size: 9pt"><strong>BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT&amp; rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0, CCreateContext* pContext = NULL );</strong></span></p>
</blockquote></blockquote>
<p><span style="font-size: 9pt">　　Create函数第一个参数为窗口注册类名，它指定了窗口的图标和类风格。这里我们使用NULL做为其值，表明使用缺省属性。第二个参数为窗口标题。其余几个参数指定了窗口的风格、大小、父窗口、菜单名等。</span></p>
<p><span style="font-size: 9pt">　　这个函数看起来比较复杂，对于CFrameWnd派生出来的窗口，我们可以使用LoadFrame从资源文件中创建窗口，它只需要一个参数。</span></p>
<p><span style="font-size: 9pt">pMyFrame-&gt;LoadFrame(IDR_FRAME)；</span></p>
<p align="justify"><span style="font-size: 9pt">LoadFrame使用该参数从资源中获取许多默认值，包括主边框窗口的标题、图标、菜单、加速键等。但是，在使用LoadFrame时，必须确保标题字符串、图标、菜单、加速键等资源使用同一个ID标识符（在本例中，我们使用IDR_FRAME）。</span></p>
<p><span style="font-size: 9pt"><strong>提示：在Hello程序的InitInstance中我们看不到创建窗口的过程。实际上，在</strong></span></p>
<p><span style="font-size: 9pt">pDocTemplate = new CSingleDocTemplate(</span></p>
<p><span style="font-size: 9pt">IDR_MAINFRAME,</span></p>
<p><span style="font-size: 9pt">RUNTIME_CLASS(CHelloDoc),</span></p>
<p><span style="font-size: 9pt">RUNTIME_CLASS(CMainFrame), // main SDI frame window</span></p>
<p><span style="font-size: 9pt">RUNTIME_CLASS(CHelloView));</span></p>
<p align="justify"><span style="font-size: 9pt">　　AddDocTemplate(pDocTemplate); 程序片段中，我们看到，CSingleDocTemplate构造函数的第二个参数就是IDR_MAINFRAME。在构造函数内部，已经通过调用m_pMainWnd-&gt;LoadFrame(IDR_MAINFRAME)，完成了应用程序主窗口的创建过程。<br />
　　在InitInstance中，创建完窗口后，窗口调用ShowWindow成员函数来显示窗口。ShowWindow带一个参数，指示窗口以何种方式显示（最大化、最小化或一般）。缺省方式为SW_SHOW，但实际上我们经常希望应用程序启动时窗口最大化，此时可以将该参数该为SW_SHOWMAXMIZED，即调用</span></p>
<p align="justify"><span style="font-size: 9pt">m_pMainWnd-&gt;ShowWindow(SW_SHOWMAXIMIZED)；</span></p>
<p align="justify"><span style="font-size: 9pt">　　在MainFrm.cpp中，我们还看到CMainFrame类有一个OnCreate方法。OnCreate成员函数定义如清单3.3。当调用Create或CreateEx时，操作系统会向窗口发送一条WM_CREATE消息。这一函数就是用来响应WM_CREATE消息的。</span><strong></p>
<p><span style="font-size: 9pt">清单3.3 OnCreate成员函数定义</span></strong></p>
<p><span style="font-size: 9pt">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</span></p>
<p><span style="font-size: 9pt">return -1;</span></p>
<p><span style="font-size: 9pt">　</span></p>
<p><span style="font-size: 9pt">if (!m_wndToolBar.Create(this) ||</span></p>
<p><span style="font-size: 9pt">!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">TRACE0("Failed to create toolbar\n");</span></p>
<p><span style="font-size: 9pt">return -1; // fail to create</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">if (!m_wndStatusBar.Create(this) ||</span></p>
<p><span style="font-size: 9pt">!m_wndStatusBar.SetIndicators(indicators,</span></p>
<p><span style="font-size: 9pt">sizeof(indicators)/sizeof(UINT)))</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">TRACE0("Failed to create status bar\n");</span></p>
<p><span style="font-size: 9pt">return -1; // fail to create</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">// TODO: Remove this if you don't want tool tips or a resizeable toolbar</span></p>
<p><span style="font-size: 9pt">m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |</span></p>
<p><span style="font-size: 9pt">CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</span></p>
<p><span style="font-size: 9pt">// TODO: Delete these three lines if you don't want the toolbar to</span></p>
<p><span style="font-size: 9pt">// be dockable</span></p>
<p><span style="font-size: 9pt">m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</span></p>
<p><span style="font-size: 9pt">EnableDocking(CBRS_ALIGN_ANY);</span></p>
<p><span style="font-size: 9pt">DockControlBar(&amp;m_wndToolBar);</span></p>
<p><span style="font-size: 9pt">return 0;</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span>　　在OnCreate函数中，首先调用CFrameWnd的缺省处理方法OnCreate完成窗口创建工作。后面是应用程序主窗口的特定工作，在上面程序中，创建了工具条和状态栏（有关工具条和状态栏编程参见下一章有关内容）。可以在此处加入一些初始化工作，如从INI文件中载入设置，显示Splash Window(启动画面)等。 </span></p>
<p><span><font color="#3973de"><strong>3.5.3 注册窗口</strong></font></span></p>
<p><span style="font-size: 9pt">　　在传统的Windows C程序中，送给一个窗口的所有消息是在它的窗口函数中处理的。把一个窗口同它的窗口函数联系起来的过程称为注册窗口类。注册窗口包括对窗口指定一个窗口函数（给出窗口函数的指针）以及设定窗口的光标、背景刷子等内容。一个注册窗口类可以被多个窗口共享。注册窗口通过调用API函数RegisterClass来完成。<br />
　　在MFC下，框架提供了缺省的自动窗口注册过程。框架仍然使用传统的注册类，而且提供了几个标准的注册类，它们在标准的应用程序初始化函数中注册。调用AfxRegisterWndClass全局函数就可以注册附加的窗口类，然后把已经注册的类传给CWnd的Create成员函数。用户可以定制自己的注册过程，以提供一些附加的特性。比如设置窗口的图标、背景、光标等。下面是注册窗口的例子。</span></p>
<p><span style="font-size: 9pt">BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp; cs)</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">// TODO: Modify the Window class or styles here by modifying</span></p>
<p><span style="font-size: 9pt">// the CREATESTRUCT cs</span></p>
<p><span style="font-size: 9pt">UINT ClassStyle=CS_VREDRAW|CS_HREDRAW;</span></p>
<p><span style="font-size: 9pt">cs.style=cs.style&amp;(~FWS_ADDTOTITLE);</span></p>
<p><span style="font-size: 9pt">cs.lpszClass = AfxRegisterWndClass(ClassStyle,</span></p>
<p><span style="font-size: 9pt">AfxGetApp()-&gt;LoadStandardCursor(IDC_ARROW), </span></p>
<p><span style="font-size: 9pt">(HBRUSH)(COLOR_WINDOW+1),//for brush</span></p>
<p><span style="font-size: 9pt">AfxGetApp()-&gt;LoadIcon(IDR_MAINFRAME));</span></p>
<p><span style="font-size: 9pt">return TRUE;</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p align="justify"><span style="font-size: 9pt">　　注册窗口在CFrameWnd的PreCreateWnd方法中完成。从成员函数名字PreCreateWindow中就可以看出来，注册窗口的工作必须在调用Create函数创建窗口之前完成。其中cs.style=cs.style&amp;(~FWS_ADDTOTITLE)指定窗口标题风格，关闭自动添加文档标题的功能。AfxRegisterWndClass指定窗口使用箭头光标、背景刷子使用比窗口颜色标号大一的颜色、图标使用IDR_MAINFRAME标识符指定的图标（当然也可以使用其它图标）。用上面的程序段替换Hello程序MainFrm.cpp中的PreCreateWindow成员函数定义，并重新编译和运行程序。此时，窗口标题变成了Hello，原来令人讨厌的&#8220;Untitled-&#8221;没有了，因为窗口风格中关闭自动添加当前文件名的风格。</span></p>
<p><span style="font-size: 9pt"><font color="#3973de"><strong>3.5.4 关闭和销毁窗口</strong></font></span></p>
<p><span style="font-size: 9pt">　　框架窗口不仅维护窗口的创建，还管理着窗口的关闭和销毁过程。关闭窗口时，操作系统依次向被关闭的窗口发送WM_CLOSE和WM_DESTROY消息。WM_CLOSE消息的缺省处理函数OnClose将调用DestroyWindow，来销毁窗口；最后，框架调用窗口的析构函数作清理工作并删除C++窗口对象。<br />
　　不要使用C++的delete操作符来销毁框架窗口，而应当采用CWnd的DestroyWindow成员函数来销毁。DestroyWindow首先删除子窗口，再删除窗口本身。若窗口以变量方式产生（即在堆栈上分配内存），该窗口对象会被自动清除。若对象是用new操作符创建的（也就是在堆上分配内存的），则需要用户自己处理。有关DestroyWindow问题在第五章对话框技术中还要作进一步解释。</span></p>
<p><span style="font-size: 9pt">OnClose()常用功能：保存窗口的一些状态、工具条状态，提示保存未保存的数据等等。</span></p>
<p><span style="font-size: 9pt">void CMainFrame::OnClose()</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">SaveBarState( "MyDockState" );//保存工具条状态</span></p>
<p><span style="font-size: 9pt">CFrameWnd::OnClose();</span></p>
<p><span>}<font color="#3973de"><strong>3.5.5 窗口激活</strong></font></span></p>
<p><span style="font-size: 9pt">　　活动窗口必定是一个没有父窗口的顶层窗口，包括框架窗口和对话框。当顶层窗口被激活时，Windows向窗口发送WM_ACTIVATE消息，对此消息的缺省处理是将活动窗口设为有输入焦点。<br />
　　输入焦点用于表示哪个窗口有资格接收键盘输入消息。带有输入焦点的窗口或是一个活动窗口，或者是该活动窗口的子窗口。当一个顶层窗口获得输入焦点时，Windows向该窗口发送WM_SETFOCUS消息，此窗口可将输入焦点重定位到它的子窗口上。子窗口不会自动获得输入焦点。失去输入焦点的窗口会收到WM_KILLFOCUS消息。当子窗口拥有输入焦点时，父窗口就不会处理键盘输入了。</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-28 20:24 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Frame常用函数--如OnCreateClient</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330126.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 28 Aug 2010 12:15:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330126.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330126.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330126.html</trackback:ping><description><![CDATA[http://www.anqn.com/dev/vc/2009-06-15/a09111492-1.shtml<br />
CMDIFrameWnd类用于MDI应用程序的主框架窗口，主框架窗口是所有MDI文档子窗口的容器，并与子窗口共享菜单；CMDIFrameWnd类相较CFrameWnd类增加的重要函数有：MDIActivate（激活另一个MDI子窗口）、MDIGetActive（得到目前的活动子窗口）、MDIMaximize（最大化一个子窗口）、MDINext（激活目前活动子窗口的下一子窗口并将当前活动子窗口排入所有子窗口末尾）、MDIRestore（还原MDI子窗口）、MDISetMenu（设置MDI子窗口对应的菜单）、MDITile（平铺子窗口）、MDICascade（重叠子窗口）。<br />
<br />
　　Visual C++开发环境是典型的MDI程序，其执行MDI Cascade的效果如图5.3。<br />
<br />
<table border="0" width="90%" align="center">
    <tbody>
        <tr>
            <td>
            <div align="center"><img border="0" src="http://www.anqn.com/pic/3/a2009-6-15-621h1h.jpg"  alt="" /><br />
            图5.3 MDI Cascade的效果</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　而执行MDI Tile的效果则如图5.4。<br />
<br />
<table border="0" width="90%" align="center">
    <tbody>
        <tr>
            <td>
            <div align="center"><img border="0" src="http://www.anqn.com/pic/3/a2009-6-15-360ma8.jpg"  alt="" /><br />
            图5.4 MDI Tile的效果</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　MDISetMenu函数的重要意义体现在一个MDI程序可以为不同类型的文档（与文档模板关联）显示不同的菜单，例如下面的这个函数Load一个菜单，并将目前主窗口的菜单替换为该菜单：<br />
<br />
<table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center">
    <tbody>
        <tr>
            <td style="width: 826px; height: 308px">void CMdiView::OnReplaceMenu() <br />
            {<br />
            　// Load a new menu resource named IDR_SHORT_MENU<br />
            　CMdiDoc* pdoc = GetDocument();<br />
            　pdoc-&gt;m_DefaultMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_SHORT_MENU));<br />
            　if (pdoc-&gt;m_DefaultMenu == NULL)<br />
            　　return;<br />
            <br />
            　// Get the parent window of this view window. The parent window is<br />
            　// a CMDIChildWnd-derived class. We can then obtain the MDI parent <br />
            　// frame window using the CMDIChildWnd*. Then, replace the current <br />
            　// menu bar with the new loaded menu resource.<br />
            　CMDIFrameWnd* frame = ((CMDIChildWnd *) GetParent())-&gt;GetMDIFrame();<br />
            　frame-&gt;MDISetMenu(CMenu::FromHandle(pdoc-&gt;m_DefaultMenu), NULL);<br />
            　frame-&gt;DrawMenuBar();<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　CMDIFrameWnd类另一个不讲"不足以服众"的函数是OnCreateClient，它是子框架窗口的创造者，其实现如下：<br />
<br />
<table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center">
    <tbody>
        <tr>
            <td>BOOL CMDIFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*)<br />
            {<br />
            　CMenu* pMenu = NULL;<br />
            　if (m_hMenuDefault == NULL)<br />
            　{<br />
            　　// default implementation for MFC V1 backward compatibility<br />
            　　pMenu = GetMenu();<br />
            　　ASSERT(pMenu != NULL);<br />
            　　// This is attempting to guess which sub-menu is the Window menu.<br />
            　　// The Windows user interface guidelines say that the right-most<br />
            　　// menu on the menu bar should be Help and Window should be one<br />
            　　// to the left of that.<br />
            　　int iMenu = pMenu-&gt;GetMenuItemCount() - 2;<br />
            <br />
            　　// If this assertion fails, your menu bar does not follow the guidelines<br />
            　　// so you will have to override this function and call CreateClient<br />
            　　// appropriately or use the MFC V2 MDI functionality.<br />
            　　ASSERT(iMenu &gt;= 0);<br />
            　　pMenu = pMenu-&gt;GetSubMenu(iMenu);<br />
            　　ASSERT(pMenu != NULL);<br />
            　}<br />
            　return CreateClient(lpcs, pMenu);<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　从CMDIFrameWnd::OnCreateClient的源代码可以看出，其中真正起核心作用的是对函数CreateClient的调用：<br />
<br />
<table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center">
    <tbody>
        <tr>
            <td>BOOL CMDIFrameWnd::CreateClient(LPCREATESTRUCT lpCreateStruct,<br />
            CMenu* pWindowMenu)<br />
            {<br />
            　ASSERT(m_hWnd != NULL);<br />
            　ASSERT(m_hWndMDIClient == NULL);<br />
            　DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |<br />
            MDIS_ALLCHILDSTYLES; // allow children to be created invisible<br />
            　DWORD dwExStyle = 0;<br />
            　// will be inset by the frame<br />
            <br />
            　if (afxData.bWin4)<br />
            　{<br />
            　　// special styles for 3d effect on Win4<br />
            　　dwStyle &amp;= ~WS_BORDER;<br />
            　　dwExStyle = WS_EX_CLIENTEDGE;<br />
            　}<br />
            <br />
            　CLIENTCREATESTRUCT ccs;<br />
            　ccs.hWindowMenu = pWindowMenu-&gt;GetSafeHmenu();<br />
            　// set hWindowMenu for MFC V1 backward compatibility<br />
            　// for MFC V2, window menu will be set in OnMDIActivate<br />
            　ccs.idFirstChild = AFX_IDM_FIRST_MDICHILD;<br />
            <br />
            　if (lpCreateStruct-&gt;style &amp; (WS_HSCROLL|WS_VSCROLL))<br />
            　{<br />
            　　// parent MDIFrame's scroll styles move to the MDICLIENT<br />
            　　dwStyle |= (lpCreateStruct-&gt;style &amp; (WS_HSCROLL|WS_VSCROLL));<br />
            <br />
            　　// fast way to turn off the scrollbar bits (without a resize)<br />
            　　ModifyStyle(WS_HSCROLL|WS_VSCROLL, 0, SWP_NOREDRAW|SWP_FRAMECHANGED);<br />
            　}<br />
            <br />
            　// Create MDICLIENT control with special IDC<br />
            　if ((m_hWndMDIClient = ::CreateWindowEx(dwExStyle, _T("mdiclient"), NULL,<br />
            dwStyle, 0, 0, 0, 0, m_hWnd, (HMENU)AFX_IDW_PANE_FIRST,<br />
            AfxGetInstanceHandle(), (LPVOID)&amp;ccs)) == NULL)<br />
            　{<br />
            　　TRACE(_T("Warning: CMDIFrameWnd::OnCreateClient: failed to create MDICLIENT.")<br />
            _T(" GetLastError returns 0x%8.8X\n"), ::GetLastError());<br />
            　　return FALSE;<br />
            　}<br />
            　// Move it to the top of z-order<br />
            　::BringWindowToTop(m_hWndMDIClient);<br />
            <br />
            　return TRUE;<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　（3）CMDIChildWnd类用于在MDI主框架窗口中显示打开的文档。每个视图都有一个对应的子框架窗口，子框架窗口包含在主框架窗口中，并使用主框架窗口的菜单。<br />
<br />
　　CMDIChildWnd类的一个重要函数GetMDIFrame()返回目前MDI客户窗口的父窗口，其实现如下：<br />
<br />
<table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center">
    <tbody>
        <tr>
            <td>CMDIFrameWnd *CMDIChildWnd::GetMDIFrame()<br />
            {<br />
            　HWND hWndMDIClient = ::GetParent(m_hWnd);<br />
            　CMDIFrameWnd *pMDIFrame;<br />
            　pMDIFrame = (CMDIFrameWnd*)CWnd::FromHandle(::GetParent(hWndMDIClient));<br />
            　return pMDIFrame;<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　利用AppWizard生成的名为"example"的MDI工程包含如图5.5所示的类。<br />
<br />
<table border="0" width="90%" align="center">
    <tbody>
        <tr>
            <td>
            <div align="center"><img border="0" src="http://www.anqn.com/pic/3/a2009-6-15-371n10.jpg"  alt="" /><br />
            图5.5 一个MDI工程包含的类</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　其中的CMainFrame继承自CMDIFrameWnd，CChildFrame类继承自CMDIChildWnd类，CExampleView视图类则负责在CMDIChildWnd类对应的子框架窗口中显示文档的数据。 <br />
<br />
　　文中只是对CMDIFrameWnd的CreateClient成员函数进行了介绍，实际上，CFrameWnd、CMDIChildWnd均包含CreateClient成员函数。我们经常通过重载CFrameWnd:: CreateClient、CMDIChildWnd:: CreateClient函数的方法来实现"窗口分割"，例如：<br />
<br />
<table border="1" bordercolor="#cccccc" width="90%" bgcolor="#e3e3e3" align="center">
    <tbody>
        <tr>
            <td>BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, <br />
            CCreateContext *pContext)<br />
            {<br />
            　&#8230;<br />
            　if (!m_wndSplitter.Create(this, 2, 2, // 分割的行、列数<br />
            　　　CSize(10, 10), // 最小化尺寸<br />
            　　　pContext))<br />
            　{<br />
            　　TRACE0("创建分割失败");<br />
            　　return FALSE; <br />
            　}<br />
            　&#8230;<br />
            　return TRUE;<br />
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-28 20:15 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>frame view 理解</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330125.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 28 Aug 2010 11:58:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330125.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330125.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330125.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.cppblog.com/andxie99/archive/2006/05/31/7972.aspx1.1 MFC 文档视图结构程序结构总揽 当我们使用 MFC AppWizard 生成一个 MFC 程序，选用所有默认的设置（当然也是 Multiple Documents ，本文讨论主要基于 Multiple Documents ，对于 Single Document ...&nbsp;&nbsp;<a href='http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330125.html'>阅读全文</a><img src ="http://www.blogjava.net/jasmine214--love/aggbug/330125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-28 19:58 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> CsplitterWnd--拆分窗口</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330123.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 28 Aug 2010 11:06:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330123.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330123.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330123.html</trackback:ping><description><![CDATA[<h4>http://www.cnblogs.com/feisky/archive/2010/03/07/1680222.html</h4>
<h4>MFC支持两<a name="baidusnap4"></a>种类型的拆分窗口：静态的和动态的。</h4>
<p>静态拆分窗口的行列数在拆分窗口被创建时就设置好了，用户不能更改。但是用户可以缩放各行各列。一个静态拆分窗口最多可以包含16行16列。</p>
<p>要找一个使用了静态拆分窗口的应用程序，只要看一下windows管理器即可。 </p>
<p>动态拆分窗口最多可以有两行两列，但它们可以相互拆分和合并。Vc就使用了动态拆分窗口使得可以<a name="baidusnap2"></a>同时编辑源程序文件的两个以上不同的部分。 </p>
<p>选择静态或动态拆分的一个准则是是否希望用户能够交互地修改拆分窗口的行列配置。另一个决定因素是计划在拆分窗口中使用的视图种类。</p>
<p>在静态拆分窗口中很容易使用两个以上不同种类的视图，因为您可以在每个窗格中指定所用的视图类型。但是在动态拆分窗口中，MFC管理着视图，</p>
<p>除非从 CsplitterWnd派生一个新类并修改拆分窗口的默认操作性能，否则拆分窗口中的所有视图使用的都是相同的视图类。 </p>
<p>静态拆分窗口是用CsplitterWnd::CreateStatic而不是CsplitterWnd::Create创建，并且由于MFC不会自动创建静态拆分窗口中显示的视图，</p>
<p>所以您要亲自在CreateStatic返回之后创建视图。CsplitterWnd为此提供了名为 CreateView的函数。 </p>
<p>你应按如下步骤创建一个CSplitterWnd对象： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 在父框架中嵌入一个CSplitterWnd成员变量。 </p>
<p>　　2. 重载父框架的CFrameWnd::OnCreateClient成员函数。 </p>
<p>　　3. 从重载的OnCreateClient函数中调用类CSplitterWnd的Create或CreateStatic成员函数，并调用CreateView来创建视图。 </p>
<p>&nbsp;</p>
<p>使用静态拆分窗口的一个优点是由于您自己给窗格添加视图，所以可以控制放入视图的种类。 </p>
<h4>关键函数</h4>
<pre>   BOOL CreateStatic( CWnd* pParentWnd, <span style="color: #0000ff">int</span> nRows, <span style="color: #0000ff">int</span> nCols, DWORD dwStyle =
　　WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );
　　函数有5个参数，意义如下:
　　● pParentWnd:切分窗口的父窗口指针
　　● nRows:水平方向分隔窗口的数目
　　● nCols:垂直方向分隔窗口的数目
　　● dwStyle:切分窗口的风格
　　● nID:子窗口的ID值，默认为系统定义的AFX_IDW_PANE_FIRST
　　返回值:如果创建成功，返回非零值(TRUE)，否则返回0(FALSE)。
　　m_wndSplitter.CreateStatic(<span style="color: #0000ff">this</span>, 2,1); <span style="color: #008000">// 切分为2行1列</span>
　　</pre>
<pre>　　<span style="color: #0000ff">virtual</span> BOOL CreateView( <span style="color: #0000ff">int</span> row, <span style="color: #0000ff">int</span> col, CRuntimeClass* pViewClass,</pre>
<pre> SIZE sizeInit, CCreateContext* pContext );
　　函数有5个参数，意义如下:
　　● row:窗格的行标，从0开始
　　● col:窗格的列标，从0开始
　　● pViewClass:视图的执行期类CRuntimeClass指针，可以用宏RUNTIME_CLASS获得
　　● sizeInit:一个SIZE(或者CSize)类型的数据，指定窗格的初始大小
　　● pContext:一般是由父窗口传递过来，包含窗口的创建信息
　　返回值:如果创建成功，返回非零值(TRUE)，否则返回0(FALSE)。</pre>
<pre>   m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTest),CSize(190,100),pContext)</pre>
<p>&nbsp;</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/feisky/WindowsLiveWriter/deaf5d3e4aae_9A6D/image_2.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/feisky/WindowsLiveWriter/deaf5d3e4aae_9A6D/image_thumb.png" width="508" height="337" /></a>&nbsp;</p>
<h4>实现的关键代码</h4>
<pre>BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
<span style="color: #008000">// TODO: Add your specialized code here and/or call the base class</span>
<span style="color: #0000ff">if</span>(!m_wndSplitter.CreateStatic(<span style="color: #0000ff">this</span>,1,2))
{
<span style="color: #0000ff">return</span> FALSE;
}
CRect rect;
GetClientRect(&amp;rect);
<span style="color: #0000ff">if</span>(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTest),</pre>
<pre>                 CSize(rect.Width()/4,rect.Height()),pContext)||
!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CSplitterSDIView), </pre>
<pre>                    CSize(rect.Width()/4*3,rect.Height()),pContext))
{
<span style="color: #0000ff">return</span> FALSE;
}
<span style="color: #0000ff">return</span> TRUE;
}
</pre>
<pre>重载该函数之前需要做的步骤：</pre>
<pre>1. 在CMainFrame类中添加protected成员CSplitterWnd m_wndSplitter;</pre>
<pre>2. 建立对话框资源（IDD_FORMVIEW），并以CFormView类为基类建立相应的视类；</pre>
<pre>3. 重载OnCreateClient函数（如上述代码）。</pre>
<pre>4. 如果需要更多的划分，则再添加其他的CSplitterWnd成员变量，但在m_wndSplitter2.CreateStatic（）</pre>
<pre>   函数里的第一个参数则采用需要划分的那个子视图，如<strong>m_wndSplitter2.CreateStatic(&amp;m_wndSplitter1,</strong></pre>
<pre><strong>   1, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)) )，</strong>当然也需要自己创建需要的所</pre>
<pre>   有视图。</pre>
<h4>多视类之间的交互</h4>
<p>在MFC程序中，各个视类之间进行数据交互是通过Doc类来完成的，由CDocument类来处理文档，</p>
<p>而由CView类来显示。即将数据存储到CDocument类中，而用到数据的时候再从该类中读取。</p>
<pre><span style="color: #0000ff">处理按钮事件：</span></pre>
<pre><span style="color: #0000ff">void</span> CTest::OnShowInt()
{
<span style="color: #008000">// TODO: Add your control notification handler code here</span>
<span style="color: #ff0000">CSplitterSDIDoc* pDoc =(CSplitterSDIDoc*) GetDocument();
UpdateData(TRUE);
pDoc-&gt;x=m_int;
pDoc-&gt;UpdateAllViews(NULL);</span>
}</pre>
<pre><span style="color: #0000ff">在CSplitterSDIView中显示：</span></pre>
<pre><span style="color: #0000ff">void</span> CSplitterSDIView::OnDraw(CDC* pDC)
{
CSplitterSDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
<span style="color: #008000">// TODO: add draw code for native data here</span>
<span style="color: #ff0000">CString str;
str.Format("<span style="color: #8b0000">%d</span>", pDoc-&gt;x);
pDC-&gt;TextOut(0,0,str);</span>
}</pre>
<pre>&nbsp;</pre>
<h4>CSplitterWnd类的其他成员信息</h4>
<p>有关该类的其他成员函数，可以参考MSDN。</p>
<p><span style="font-size: medium"><strong>其他信息</strong></span></p>
<div class="tableSection"><strong>锁定切分条</strong><br />
当用户创建好分割窗口后，有时并不希望通过拖动切分条来调节窗口的大小。这时就必须锁定切分条。锁定切分条的最简单的</div>
<div class="tableSection">方法莫过于不让CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息，而是将这些消</div>
<div class="tableSection">息交给CWnd窗口进行处理，从而屏蔽掉这些消息。拿WM_LBUTTONDOWN处理过程来说。修改为如下： <br />
</div>
<div class="tableSection">
<pre>void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point) <br />
{         CWnd::OnLButtonDown(nFlags,point);} </pre>
</div>
<div class="tableSection">其余的处理方法类似。 <br />
<strong>切分条的定制</strong>&nbsp;<br />
由Window自己生成的切分条总是固定的，没有任何的变化，我们在使用一些软件比如ACDSee的时候却能发现它们的切分条</div>
<div class="tableSection">却是和自动生成的切分条不一样的。那么如何定制自己的切分条呢？通过重载CSplitterWnd的虚方法OnDrawSplitter和</div>
<div class="tableSection">OnInvertTracker可以达到这样的目的。下面的代码生成的效果是分割窗口的边界颜色为红色，分割条的颜色为绿色.代码如下：<br />
</div>
<div class="tableSection">
<pre>void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &amp;rectArg){ </pre>
<pre>                 if(pDC==NULL)</pre>
<pre>                   {</pre>
<pre>                   RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);</pre>
<pre>                  return;</pre>
<pre>                  } </pre>
<pre>                  ASSERT_VALID(pDC); </pre>
<pre>                 CRect rc=rectArg; </pre>
<pre>                 switch(nType)</pre>
<pre>                   { </pre>
<pre>                  case splitBorder: </pre>
<pre>                 //重画分割窗口边界,使之为红色 </pre>
<pre>                          pDC-&gt;Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));  </pre>
<pre>                        rc.InflateRect(-CX_BORDER,-CY_BORDER); </pre>
<pre>                          pDC-&gt;Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0)); </pre>
<pre>                                    return;</pre>
<pre>                   case splitBox:  </pre>
<pre>                        pDC-&gt;Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));</pre>
<pre>                          rc.InflateRect(-CX_BORDER,-CY_BORDER); </pre>
<pre>                          pDC-&gt;Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0)); </pre>
<pre>                         rc.InflateRect(-CX_BORDER,-CY_BORDER);</pre>
<pre>                          pDC-&gt;FillSolidRect(rc,RGB(0,0,0)); </pre>
<pre>                          pDC-&gt;Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));</pre>
<pre>                          return; </pre>
<pre>                  case splitBar:  </pre>
<pre>                 //重画分割条，使之为绿色  </pre>
<pre>                         pDC-&gt;FillSolidRect(rc,RGB(255,255,255));</pre>
<pre>                          rc.InflateRect(-5,-5); </pre>
<pre>                          pDC-&gt;Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0)); </pre>
<pre>                                    return;  </pre>
<pre>                 default:</pre>
<pre>                           ASSERT(FALSE);</pre>
<pre>                   } </pre>
<pre>                  pDC-&gt;FillSolidRect(rc,RGB(0,0,255));</pre>
<pre>}</pre>
<pre> void CSplitterWndEx::OnInvertTracker(CRect &amp;rect) </pre>
<pre>{                   ASSERT_VALID(this); </pre>
<pre>                 ASSERT(!rect.IsRectEmpty()); </pre>
<pre>                  ASSERT((GetStyle()&amp;WS_CLIPCHILDREN)==0);</pre>
<pre>                  CRect rc=rect;  </pre>
<pre>                 rc.InflateRect(2,2);</pre>
<pre>                  CDC* pDC=GetDC(); </pre>
<pre>                  CBrush* pBrush=CDC::GetHalftoneBrush(); </pre>
<pre>                 HBRUSH hOldBrush=NULL; </pre>
<pre>                 if(pBrush!=NULL) hOldBrush=(HBRUSH)SelectObject(pDC-&gt;m_hDC,pBrush-&gt;m_hObject);</pre>
<pre>                  pDC-&gt;PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS);  </pre>
<pre>                           if(hOldBrush!=NULL)</pre>
<pre>                   SelectObject(pDC-&gt;m_hDC,hOldBrush);</pre>
<pre>                  ReleaseDC(pDC); </pre>
<pre>} </pre>
</div>
<div class="tableSection">同样我们只要继承CSplitterWnd中的其余的一些虚拟方法就可以生成具有自己个性的分割窗口了。</div>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-28 19:06 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetClientRect(rect)与  GetClientRect(&amp;rect);  参数的理解</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330121.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 28 Aug 2010 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330121.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330121.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330121.html</trackback:ping><description><![CDATA[<p>1)CRect&nbsp;&nbsp; rect;&nbsp;&nbsp; </p>
<p>&nbsp;GetClientRect(rect);&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp; <br />
2)CRect&nbsp;&nbsp; rect;&nbsp;&nbsp; </p>
<p>&nbsp; GetClientRect(&amp;rect);&nbsp;&nbsp; </p>
<p>&nbsp; ....&nbsp;&nbsp; </p>
<p>&nbsp; 为什么这两段代码的效果一样？？ </p>
<p>&nbsp; </p>
<p>1.因为 CRect 重载了到 LPRECT 的操作：&nbsp;&nbsp;&nbsp; </p>
<p>CRect::operator&nbsp;&nbsp; LPRECT(&nbsp;&nbsp; ); GetClientRect(rect); 隐含的调用了该操作。 </p>
<p>摘自 : http://topic.csdn.net/t/20020816/13/946020.html </p>
<p>&nbsp; </p>
<p>2.首先要知道 GetClientRect 函数的原型，如下：&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp; void&nbsp;&nbsp; GetClientRect(&nbsp;&nbsp; LPRECT&nbsp;&nbsp; lpRect&nbsp;&nbsp; )&nbsp;&nbsp; const;&nbsp;&nbsp; </p>
<p>&nbsp; 说明这个函数的参数是 LPRECT, 而并非 CRect 或是 CRect* ，那为什么你所说的两种情况都正确呢！&nbsp;&nbsp;&nbsp; </p>
<p>http://msnpiki.msnfanatic.com/index.php/Main_Page--&gt; </p>
<p>s New Roman;"&gt;&nbsp; 1 ）、对于 GetClientRect(rc) ，这里的参数是 CRect ，因为 CRect 类里有个 LPRECT 运算符重载（ operator&nbsp;&nbsp; LPRECT() ），所以当传一个 CRect 变量给这个函数的时候，这个变量会自动转换成 LPRECT.&nbsp;&nbsp; </p>
<p>&nbsp; 2) 、对于 GetClientRect(&amp;rc) 那就更好理解了，因为还有一点， CRect 是从 RECT 继承的，所以你传一个 CRect* 给这个函数的时候，它会自动转换成其基类形式（ RECT ）的地址 , 所以也是对的！</p>
<p>文章出处：飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20100630/288201.html</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-28 18:39 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetClientRect(&amp;rect); </title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330119.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 28 Aug 2010 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330119.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/330119.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/330119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/330119.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/mydriverc/archive/2007/09/03/1770552.aspx">http://blog.csdn.net/mydriverc/archive/2007/09/03/1770552.aspx</a><br />
CRect rect;&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; //创建一个矩形区域 </p>
<p>&nbsp;GetClientRect(&amp;rect);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指定窗口的用户区域矩形，得到RECT（即以所在窗口左上角为原点，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仅仅是个大小，返回值的左上角永远为0，0）</p>
<p><br />
&nbsp;ClientToScreen(&amp;rect);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把用户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标<br />
&nbsp;</p>
<p>ClipCursor(&amp;rect);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将鼠标锁定在用户区域</p>
<p>GetClientRect()返回一CRect类型，它包含了指定窗口的用户区域矩形。它保存的是参数的地址&amp;rect，该地址指向CRect的位置。CRect类型是在MFC中定义的。用它处理矩形是非常方便的。</p>
<p>如果做完图，想把鼠标移出用户区域，通过ClipCursor(NULL);即可实现。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/mydriverc/archive/2007/09/03/1770552.aspx</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/330119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-28 18:36 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/28/330119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetBuffer与ReleaseBuffer</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/25/329874.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Wed, 25 Aug 2010 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/25/329874.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/329874.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/25/329874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/329874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/329874.html</trackback:ping><description><![CDATA[GetBuffer()主要作用是将字符串的缓冲区长度锁定，releaseBuffer则是解除锁定，使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。 <br />
<br />
是否需要在GetBufer后面调用ReleaseBuffer()，是根据你的后面的程序是否需要继续使用该字符串变量，并且是否动态改变其长度而定的。不是什么好地编程习惯，之类的原因。 <br />
如果你GetBuffer以后程序自函数就退出，局部变量都不存在了，调用不掉用ReleaseBuffer没什么意义了。 <br />
<br />
但如果你出现例如下面的代码 <br />
CString &nbsp; m_strA; <br />
m_strA=_T( "123456 "); <br />
m_strA.GetBuffer(6); <br />
m_strA+=_T( "789 ");//此时就会出错了，因为需要动态加长字符串长度
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/329874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-25 11:51 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/25/329874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN---回退功能</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329095.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 17 Aug 2010 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329095.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/329095.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/329095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/329095.html</trackback:ping><description><![CDATA[&nbsp;
<p>前几天，自己在合并代码的时候，合的有问题。发现后就想回退到以前的版本，但是呢在合并完和想回滚这段时间里又有人提交了，而我有不想回退这部分代码。</p>
<p>找了一会后，发现有两个选项可以貌似可以帮助我<span lang="EN-US">Revert to this revision </span>和<span lang="EN-US"> Revert changes from this revision<br />
</span>但我不清楚这两个的区别，故<span lang="EN-US">google</span>了一把<span lang="EN-US">,</span>得到以下信息</p>
<p>譬如有个文件，有十个版本，假定版本号是<span lang="EN-US">1</span>，<span lang="EN-US">2</span>，<span lang="EN-US">3</span>，<span lang="EN-US">4</span>，<span lang="EN-US">5</span>，<span lang="EN-US">6</span>，<span lang="EN-US">7</span>，<span lang="EN-US">8</span>，<span lang="EN-US">9</span>，<span lang="EN-US">10</span>。</p>
<p><span style="color: #00b050" lang="EN-US">Revert to this revision</span>： 如果是在版本<span lang="EN-US">6</span>这里点击<span lang="EN-US">&#8220;Revert to this revision&#8221;</span>，表示<span lang="EN-US">7</span>～<span lang="EN-US">10</span>的修改全部作废，历史倒退到了版本<span lang="EN-US">6</span>那个年代。</p>
<p><span style="color: #00b050" lang="EN-US">Revert changes from this revision</span><span style="color: #00b050">：</span>如果是在版本<span lang="EN-US">6</span>这里点击<span lang="EN-US">&#8220;Revert changes from this revision&#8221;</span>，表示版本<span lang="EN-US">6</span>这个历史事件被抹杀了，只剩下除版本<span lang="EN-US">6</span>外的<span lang="EN-US">9</span>个历史事件了。</p>
<p>如果是同时选择了<span lang="EN-US">6</span>，<span lang="EN-US">7</span>，<span lang="EN-US">8</span>三个历史时期并点击<span lang="EN-US">&#8220;Revert changes from this revision&#8221;</span>，表示抹杀<span lang="EN-US">6~8</span>这仨历史时期。</p>
<p>同理，如果同时选择<span lang="EN-US">7</span>～<span lang="EN-US">10</span>，然后点击<span lang="EN-US">&#8220;Revert changes from this revision&#8221;</span>，则效果跟在版本<span lang="EN-US">6</span>这里点击<span lang="EN-US">&#8220;Revert to this revision&#8221;</span>是一样的。</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/329095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-17 13:31 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329094.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Tue, 17 Aug 2010 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329094.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/329094.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/329094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/329094.html</trackback:ping><description><![CDATA[&nbsp;
<p>原文：http://dev.firnow.com/course/3_program/c++/cppjs/20090403/163954.html&nbsp;<br />
LPTSTR<span style="font-family: 宋体">、</span>LPCSTR<span style="font-family: 宋体">、</span>LPCTSTR<span style="font-family: 宋体">、</span>LPSTR<span style="font-family: 宋体">的来源及意义</span></p>
<p>UNICODE<span style="font-family: 宋体">：它是用两个字节表示一个字符的方法。比如字符</span>'A'<span style="font-family: 宋体">在</span>ASCII<span style="font-family: 宋体">下面是一个字符，可</span>'A'<span style="font-family: 宋体">在</span>UNICODE<span style="font-family: 宋体">下面是两个字符</span>,<span style="font-family: 宋体">高字符用</span>0<span style="font-family: 宋体">填充，而且汉字</span>'<span style="font-family: 宋体">程</span>'<span style="font-family: 宋体">在</span>ASCII<span style="font-family: 宋体">下面是两个字节，而在</span>UNICODE<span style="font-family: 宋体">下仍旧是两个字节</span></p>
<p><span style="font-family: 宋体">。</span>UNICODE<span style="font-family: 宋体">的用处就是定长表示世界文字，据统计，用两个字节可以编码现存的所有文字而没有二义。</span></p>
<p>MBCS<span style="font-family: 宋体">，它是多字节字符集，它是不定长表示世界文字的编码。</span>MBCS<span style="font-family: 宋体">表示英文字母时就和</span>ASCII<span style="font-family: 宋体">一样（这也是我们容易把</span>MBCS<span style="font-family: 宋体">和</span>ASCII<span style="font-family: 宋体">搞混的原因），但表示其他文字时就需要用多字节。</span>&nbsp;</p>
<p>WINDOWS<span style="font-family: 宋体">下面的程序设计可以支持</span>MBCS<span style="font-family: 宋体">和</span>UNICODE<span style="font-family: 宋体">两种编码的字符串，具体用那种就看你定义了</span>MBCS<span style="font-family: 宋体">宏还是</span>UNICODE<span style="font-family: 宋体">宏。</span>MBCS<span style="font-family: 宋体">宏对应的字符串指针是</span>char*<span style="font-family: 宋体">也就是</span>LPSTR<span style="font-family: 宋体">，</span>UNICODE<span style="font-family: 宋体">对应的指针是</span>unsigned&nbsp;&nbsp; short*<span style="font-family: 宋体">也就是</span>LPWSTR<span style="font-family: 宋体">，为了写程序方便微软定义了类型</span>LPTSTR<span style="font-family: 宋体">，在</span>MBCS<span style="font-family: 宋体">下他就是</span>char*,&nbsp;&nbsp; <span style="font-family: 宋体">在</span>UNICODE<span style="font-family: 宋体">下它是</span>unsigned&nbsp;&nbsp; char*,<span style="font-family: 宋体">这样你就可以重定义一个宏进行不同字符集的转换了。</span></p>
<p>LPTSTR<span style="font-family: 宋体">、</span>LPCSTR<span style="font-family: 宋体">、</span>LPCTSTR<span style="font-family: 宋体">、</span>LPSTR<span style="font-family: 宋体">的意义：</span></p>
<p>LPSTR<span style="font-family: 宋体">：</span>32bit<span style="font-family: 宋体">指针</span> <span style="font-family: 宋体">指向一个字符串，每个字符占</span>1<span style="font-family: 宋体">字节</span></p>
<p>LPCSTR:32-bit<span style="font-family: 宋体">指针</span> <span style="font-family: 宋体">指向一个常字符串，每个字符占</span>1<span style="font-family: 宋体">字节</span></p>
<p>LPCTSTR:32-bit<span style="font-family: 宋体">指针</span> <span style="font-family: 宋体">指向一个常字符串</span>,<span style="font-family: 宋体">每字符可能占</span>1<span style="font-family: 宋体">字节或</span>2<span style="font-family: 宋体">字节，取决于</span>Unicode<span style="font-family: 宋体">是否定义</span></p>
<p>LPTSTR:32-bit<span style="font-family: 宋体">指针</span> <span style="font-family: 宋体">每字符可能占</span>1<span style="font-family: 宋体">字节或</span>2<span style="font-family: 宋体">字节，取决于</span>Unicode<span style="font-family: 宋体">是否定义</span></p>
<p>Windows<span style="font-family: 宋体">使用两种字符集</span>ANSI<span style="font-family: 宋体">和</span>UNICODE<span style="font-family: 宋体">，前者就是通常使用的单字节方式，但这种方式处理象中文这样的双字节字符不方便，容易出现半个汉字的情况。而后者是双字节方式，方便处理双字节字符。</span></p>
<p>WindowsNT<span style="font-family: 宋体">的所有与字符有关的函数都提供两种方式的版本，而</span>Windows9x<span style="font-family: 宋体">只支持</span>ANSI<span style="font-family: 宋体">方式。</span>_T<span style="font-family: 宋体">一般同字常数相关，如</span>_T("Hello"<span style="font-family: 宋体">。如果你编译一个程序为</span>ANSI<span style="font-family: 宋体">方式，</span>_T<span style="font-family: 宋体">实际不起任何作用。而如果编译一个程序为</span>UNICODE<span style="font-family: 宋体">方式，则编译器会把</span>"Hello"<span style="font-family: 宋体">字符串以</span>UNICODE<span style="font-family: 宋体">方式保存。</span>_T<span style="font-family: 宋体">和</span>_L<span style="font-family: 宋体">的区别在于，</span>_L<span style="font-family: 宋体">不管你是以什么方式编译，一律</span>UNICODE<span style="font-family: 宋体">方式保存</span>.</p>
<p>Windows<span style="font-family: 宋体">核心编程的第一章。</span></p>
<p>L<span style="font-family: 宋体">是表示字符串资源为</span>Unicode<span style="font-family: 宋体">的。</span></p>
<p><span style="font-family: 宋体">比如</span></p>
<p>wchar_t Str[] = L"Hello World!";</p>
<p><span style="font-family: 宋体">这个就是双子节存储字符了。</span></p>
<p>_T<span style="font-family: 宋体">是一个适配的宏～</span></p>
<p><span style="font-family: 宋体">当</span></p>
<p>#ifdef _UNICODE<span style="font-family: 宋体">的时候</span></p>
<p>_T<span style="font-family: 宋体">就是</span>L</p>
<p><span style="font-family: 宋体">没有</span>#ifdef _UNICODE<span style="font-family: 宋体">的时候</span></p>
<p>_T<span style="font-family: 宋体">就是</span>ANSI<span style="font-family: 宋体">的。</span></p>
<p><span style="font-family: 宋体">比如</span></p>
<p>LPTSTR lpStr = new TCHAR[32];</p>
<p>TCHAR* szBuf = _T("Hello");</p>
<p><span style="font-family: 宋体">以上两句使得无论是在</span>UNICODE<span style="font-family: 宋体">编译条件下都是正确编译的。</span></p>
<p><span style="font-family: 宋体">而且</span>MS<span style="font-family: 宋体">推荐你使用相匹配的字符串函数。</span></p>
<p><span style="font-family: 宋体">比如处理</span>LPTSTR<span style="font-family: 宋体">或者</span>LPCTSTR <span style="font-family: 宋体">的时候，不要用</span>strlen ,<span style="font-family: 宋体">而是要用</span>_tcslen</p>
<p><span style="font-family: 宋体">否则在</span>UNICODE<span style="font-family: 宋体">的编译条件下，</span>strlen<span style="font-family: 宋体">不能处理</span> wchar_t*<span style="font-family: 宋体">的字符串。</span></p>
<p>T<span style="font-family: 宋体">是非常有意思的一个符号（</span>TCHAR<span style="font-family: 宋体">、</span>LPCTSTR<span style="font-family: 宋体">、</span>LPTSTR<span style="font-family: 宋体">、</span>_T()<span style="font-family: 宋体">、</span>_TEXT()...<span style="font-family: 宋体">），它表示使用一种中间类型，既不明确表示使用</span> MBCS<span style="font-family: 宋体">，也不明确表示使用</span> UNICODE<span style="font-family: 宋体">。那到底使用哪种字符集</span>?<span style="font-family: 宋体">编译的时候才决定</span></p>
<p><span style="font-family: 宋体">在</span>vc++<span style="font-family: 宋体">中有着各种字符串的表示法，如您所说。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><span style="font-family: 宋体">首先</span>char*&nbsp;&nbsp; <span style="font-family: 宋体">是指向</span>ANSI<span style="font-family: 宋体">字符数组的指针，其中每个字符占据</span>8<span style="font-family: 宋体">位（有效数据是除掉最高位的其他</span>7<span style="font-family: 宋体">位），这里保持了与传统的</span>C,C++<span style="font-family: 宋体">的兼容。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;LP<span style="font-family: 宋体">的含义是长指针</span>(long&nbsp;&nbsp; pointer)<span style="font-family: 宋体">。</span></p>
<p>LPSTR<span style="font-family: 宋体">是一个指向以&#8216;</span>"0<span style="font-family: 宋体">&#8217;结尾的</span>ANSI<span style="font-family: 宋体">字符数组的指针，与</span>char*<span style="font-family: 宋体">可以互换使用，在</span>win32<span style="font-family: 宋体">中较多地使用</span>LPSTR<span style="font-family: 宋体">。而</span>LPCSTR<span style="font-family: 宋体">中增加的&#8216;</span>C<span style="font-family: 宋体">&#8217;的含义是&#8220;</span>CONSTANT<span style="font-family: 宋体">&#8221;（常量），表明这种数据类型的实例不能被使用它的</span>API<span style="font-family: 宋体">函数改变，除此之外，它与</span>LPSTR<span style="font-family: 宋体">是等同的。</span>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp; &nbsp;<span style="font-family: 宋体">为了满足程序代码国际化的需要，业界推出了</span>Unicode<span style="font-family: 宋体">标准，它提供了一种简单和一致的表达字符串的方法，所有字符中的字节都是</span>16<span style="font-family: 宋体">位的值，其数量也可以满足差不多世界上所有书面语言字符的编码需求，开发程序时使用</span>Unicode<span style="font-family: 宋体">（类型为</span>wchar_t)<span style="font-family: 宋体">是一种被鼓励的做法。</span>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; LPWSTR<span style="font-family: 宋体">与</span>LPCWSTR<span style="font-family: 宋体">由此产生，它们的含义类似于</span>LPSTR<span style="font-family: 宋体">与</span>LPCSTR<span style="font-family: 宋体">，只是字符数据是</span>16<span style="font-family: 宋体">位的</span>wchar_t<span style="font-family: 宋体">而不是</span>char<span style="font-family: 宋体">。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;<span style="font-family: 宋体">然后为了实现两种编码的通用，提出了</span>TCHAR<span style="font-family: 宋体">的定义：</span>&nbsp;&nbsp;&nbsp; </p>
<p><span style="font-family: 宋体">如果定义</span>_UNICODE<span style="font-family: 宋体">，声明如下：</span>&nbsp;&nbsp;&nbsp;&nbsp; typedef&nbsp;&nbsp; wchar_t&nbsp;&nbsp; TCHAR;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><span style="font-family: 宋体">如果没有定义</span>_UNICODE<span style="font-family: 宋体">，则声明如下：</span>&nbsp;&nbsp;&nbsp;&nbsp; typedef&nbsp;&nbsp; char&nbsp;&nbsp; TCHAR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>LPTSTR<span style="font-family: 宋体">和</span>LPCTSTR<span style="font-family: 宋体">中的含义就是每个字符是这样的</span>TCHAR<span style="font-family: 宋体">。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>CString<span style="font-family: 宋体">类中的字符就是被声明为</span>TCHAR<span style="font-family: 宋体">类型的，它提供了一个封装好的类供用户方便地使用。</span></p>
<p><span style="font-family: 宋体">如果您还需要进一步的信息，请参看</span>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_data_type_mappings.asp<span style="font-family: 宋体">等其他有关信息。</span></p>
<p>LPTSTR<span style="font-family: 宋体">、</span>LPCSTR<span style="font-family: 宋体">、</span>LPCTSTR<span style="font-family: 宋体">、</span>LPSTR<span style="font-family: 宋体">之间的转换：</span></p>
<p><span style="font-family: 宋体">如何理解</span>LPCTSTR<span style="font-family: 宋体">类型？</span></p>
<p>2007-11-10 21:43 </p>
<p>L<span style="font-family: 宋体">表示</span>long<span style="font-family: 宋体">指针</span></p>
<p><span style="font-family: 宋体">这是为了兼容</span>Windows 3.1<span style="font-family: 宋体">等</span>16<span style="font-family: 宋体">位操作系统遗留下来的，在</span>win32<span style="font-family: 宋体">中以及其他的</span>32<span style="font-family: 宋体">为操作系统中，</span> long<span style="font-family: 宋体">指针和</span>near<span style="font-family: 宋体">指针及</span>far<span style="font-family: 宋体">修饰符都是为了兼容的作用。没有实际意义。</span></p>
<p><span style="color: #00b050">P</span><span style="font-family: 宋体; color: #00b050">表示这是一个指针</span></p>
<p><span style="color: #00b050">C</span><span style="font-family: 宋体; color: #00b050">表示是一个常量</span></p>
<p><span style="color: #00b050">T</span><span style="font-family: 宋体; color: #00b050">表示在</span><span style="color: #00b050">Win32</span><span style="font-family: 宋体; color: #00b050">环境中，</span><span style="font-family: 宋体; color: #00b050">有一个</span><span style="color: #00b050">_T</span><span style="font-family: 宋体; color: #00b050">宏</span></p>
<p><span style="font-family: 宋体">这个宏用来表示你的字符是否使用</span>UNICODE, <span style="font-family: 宋体">如果你的程序定义了</span>UNICODE<span style="font-family: 宋体">或者其他相关的宏，那么这个字符或者字符串将被作为</span>UNICODE<span style="font-family: 宋体">字符串，否则就是标准的</span>ANSI<span style="font-family: 宋体">字符串。</span></p>
<p><span style="color: #00b050">STR</span><span style="font-family: 宋体; color: #00b050">表示这个变量是一个字符串</span></p>
<p><span style="font-family: 宋体; color: #00b050">所以</span><span style="color: #00b050">LPCTSTR</span><span style="font-family: 宋体; color: #00b050">就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。</span></p>
<p><span style="font-family: 宋体; color: #00b050">同样，</span><span style="color: #00b050"> LPCSTR</span><span style="font-family: 宋体; color: #00b050">就只能是一个</span><span style="color: #00b050">ANSI</span><span style="font-family: 宋体; color: #00b050">字符串，在程序中我们大部分时间要使用带</span><span style="color: #00b050">T</span><span style="font-family: 宋体; color: #00b050">的类型定义。</span></p>
<p>LPCTSTR == const TCHAR *</p>
<p>CString <span style="font-family: 宋体">和</span> LPCTSTR <span style="font-family: 宋体">可以说通用。</span> <span style="font-family: 宋体">原因在于</span>CString<span style="font-family: 宋体">定义的自动类型转换，没什么奇特的，最简单的</span>C++<span style="font-family: 宋体">操作符重载而已。</span></p>
<p><span style="font-family: 宋体">常量字符串</span>ansi<span style="font-family: 宋体">和</span>unicode<span style="font-family: 宋体">的区分是由宏</span>_T<span style="font-family: 宋体">来决定的。但是用</span>_T("abcd")<span style="font-family: 宋体">时，</span> <span style="font-family: 宋体">字符串</span>"abcd"<span style="font-family: 宋体">就会根据编译时的是否定一</span>_UNICODE<span style="font-family: 宋体">来决定是</span>char* <span style="font-family: 宋体">还是</span> w_char*<span style="font-family: 宋体">。</span> <span style="font-family: 宋体">同样，</span>TCHAR <span style="font-family: 宋体">也是相同目的字符宏。</span> <span style="font-family: 宋体">看看定义就明白了。简单起见，下面只介绍</span> ansi <span style="font-family: 宋体">的情况，</span>unicode <span style="font-family: 宋体">可以类推。</span></p>
<p>ansi<span style="font-family: 宋体">情况下，</span>LPCTSTR <span style="font-family: 宋体">就是</span> const char*, <span style="font-family: 宋体">是常量字符串（不能修改的）。</span></p>
<p><span style="font-family: 宋体">而</span>LPTSTR <span style="font-family: 宋体">就是</span> char*, <span style="font-family: 宋体">即普通字符串（非常量，可修改的）。</span></p>
<p><span style="font-family: 宋体">这两种都是基本类型，</span> <span style="font-family: 宋体">而</span>CString <span style="font-family: 宋体">是</span> C++<span style="font-family: 宋体">类，</span> <span style="font-family: 宋体">兼容这两种基本类型是最起码的任务了。</span></p>
<p><span style="font-family: 宋体">由于</span>const char* <span style="font-family: 宋体">最简单（常量，不涉及内存变更，操作迅速），</span> CString <span style="font-family: 宋体">直接定义了一个类型转换函数</span></p>
<p>operator LPCTSTR() {......}<span style="font-family: 宋体">，</span> <span style="font-family: 宋体">直接返回他所维护的字符串。</span></p>
<p><span style="font-family: 宋体">当你需要一个</span>const char* <span style="font-family: 宋体">而传入了</span>CString<span style="font-family: 宋体">时，</span> C++<span style="font-family: 宋体">编译器自动调用</span> CString<span style="font-family: 宋体">重载的操作符</span> LPCTSTR()<span style="font-family: 宋体">来进行隐式的类型转换。</span></p>
<p><span style="font-family: 宋体">当需要</span>CString , <span style="font-family: 宋体">而传入了</span> const char* <span style="font-family: 宋体">时（其实</span> char* <span style="font-family: 宋体">也可以），</span>C++<span style="font-family: 宋体">编译器则自动调用</span>CString<span style="font-family: 宋体">的构造函数来构造临时的</span> CString<span style="font-family: 宋体">对象。</span></p>
<p><span style="font-family: 宋体">因此</span>CString <span style="font-family: 宋体">和</span> LPCTSTR <span style="font-family: 宋体">基本可以通用。</span></p>
<p><span style="font-family: 宋体">但是</span> LPTSTR<span style="font-family: 宋体">又不同了，他是</span> char*<span style="font-family: 宋体">，</span> <span style="font-family: 宋体">意味着你随时可能修改里面的数据，这就需要内存管理了</span>(<span style="font-family: 宋体">如字符串变长，原来的存贮空间就不够了，则需要重新调整分配内存</span>)<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">所以</span> <span style="font-family: 宋体">不能随便的将</span> const char* <span style="font-family: 宋体">强制转换成</span> char* <span style="font-family: 宋体">使用。</span></p>
<p><span style="font-family: 宋体">楼主举的例子</span></p>
<p>LPSTR lpstr = (LPSTR)(LPCTSTR)string; </p>
<p><span style="font-family: 宋体">就是这种不安全的使用方法。</span></p>
<p><span style="font-family: 宋体">这个地方使用的是强制类型转换，你都强制转换了，</span>C++<span style="font-family: 宋体">编译器当然不会拒绝你，但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。</span></p>
<p><span style="font-family: 宋体">强制的任意类型转换是</span>C(++)<span style="font-family: 宋体">的一项强大之处，但也是一大弊端。这一问题在</span> vc6 <span style="font-family: 宋体">以后的版本</span>(<span style="font-family: 宋体">仅针对</span>vc<span style="font-family: 宋体">而言</span>)<span style="font-family: 宋体">中得到逐步的改进</span>(<span style="font-family: 宋体">你需要更明确的类型转换声明</span>)<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">其实在很多地方都可以看到类似</span></p>
<p>LPSTR lpstr = (LPSTR)(LPCTSTR)string; </p>
<p><span style="font-family: 宋体">地用法，这种情况一般是函数的约束定义不够完善的原因，</span> <span style="font-family: 宋体">比如一个函数接受一个字符串参数的输入，里面对该字符串又没有任何的修改，那么该参数就应该定义成</span> const char*<span style="font-family: 宋体">，</span> <span style="font-family: 宋体">但是很多初学者弄不清</span>const<span style="font-family: 宋体">地用法，或者是懒，</span> <span style="font-family: 宋体">总之就是随意写成了</span> char* <span style="font-family: 宋体">。</span> <span style="font-family: 宋体">这样子传入</span>CString<span style="font-family: 宋体">时就需要强制的转换一下。</span></p>
<p><span style="font-family: 宋体">这种做法是不安全的，也是不被建议的用法，你必须完全明白、确认该字符串没有被修改。</span></p>
<p>CString <span style="font-family: 宋体">转换到</span> LPTSTR (char*), <span style="font-family: 宋体">预定的做法是调用</span>CString<span style="font-family: 宋体">的</span>GetBuffer<span style="font-family: 宋体">函数，使用完毕之后一般都要再调用</span>ReleaseBuffer<span style="font-family: 宋体">函数来确认修改</span> (<span style="font-family: 宋体">某些情况下也有不调用</span>ReleaseBuffer<span style="font-family: 宋体">的，同样你需要非常明确为什么这么做时才能这样子处理，一般应用环境可以不考虑这种情况</span>)<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">同时需要注意的是，</span> <span style="font-family: 宋体">在</span>GetBuffer <span style="font-family: 宋体">和</span> ReleaseBuffer<span style="font-family: 宋体">之间，</span>CString<span style="font-family: 宋体">分配了内存交由你来处理，因此不能再调用其他的</span>CString<span style="font-family: 宋体">函数。</span></p>
<p>CString <span style="font-family: 宋体">转</span>LPCTSTR:</p>
<p>CString cStr;</p>
<p>const char *lpctStr=(LPCTSTR)cStr;</p>
<p>LPCTSTR<span style="font-family: 宋体">转</span>CString:</p>
<p>LPCTSTR lpctStr;</p>
<p>CString cStr=lpctStr;</p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/329094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-17 13:14 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/17/329094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> memset,memcpy,strcpy 的区别</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328854.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 14 Aug 2010 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328854.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328854.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328854.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left; line-height: 200%; background: white" class="MsoNormal" align="left">原文：<a href="http://www.cnblogs.com/sophia0405/archive/2008/10/23/1293189.html">http://www.cnblogs.com/sophia0405/archive/2008/10/23/1293189.html</a><br />
&nbsp;<strong><span style="line-height: 200%; font-family: 新宋体; color: blue; font-size: 14pt">memset,memcpy,strcpy </span></strong><strong><span style="line-height: 200%; font-family: 新宋体; color: blue; font-size: 14pt">的区别 </span></strong></p>
<p style="text-align: left; line-height: 200%; background: white" class="MsoNormal" align="left"><strong><span style="line-height: 200%; font-family: 新宋体; font-size: 12pt">一.函数原型</span></strong><span style="line-height: 200%; font-family: 新宋体; font-size: 12pt"><br clear="all" />
&nbsp;&nbsp; strcpy<br clear="all" />
&nbsp;&nbsp; extern char *strcpy(char *dest,char *src);<br clear="all" />
&nbsp;&nbsp; #include &lt;string.h&gt;<br clear="all" />
&nbsp;&nbsp; </span><span style="line-height: 200%; font-family: 新宋体; font-size: 12pt">功能：把src所指由NULL结束的字符串复制到dest所指的数组中<br clear="all" />
&nbsp;&nbsp; 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br clear="all" />
&nbsp;&nbsp; 返回指向dest的指针<br clear="all" />
<br clear="all" />
memcpy<br clear="all" />
extern void *memcpy(void *dest,void *src,unsigned int count);<br clear="all" />
#include &lt;string.h&gt;<br clear="all" />
&nbsp;&nbsp; 功能<strong><span style="color: #00b050">：由src所指内存区域复制count个字符串到dest所指内存区域.<br clear="all" />
</span></strong>&nbsp;&nbsp; 说明：src和dest所指内存区域不能重叠，函数返回指向dest的指针.<br clear="all" />
&nbsp;&nbsp; <br clear="all" />
&nbsp;&nbsp; memset<br clear="all" />
&nbsp;&nbsp; extern void *memset(void *buffer,int c,int count);<br clear="all" />
&nbsp;&nbsp; #include &lt;string.h&gt;<br clear="all" />
&nbsp;&nbsp; 功能：把buffer所指内存区域的前count个字节设置成字符c<br clear="all" />
&nbsp;&nbsp; 说明：返回指向buffer的指针.</span></p>
<p style="text-align: left; line-height: 200%; background: white" class="MsoNormal" align="left"><strong><span style="line-height: 200%; font-family: 新宋体; font-size: 12pt"><br clear="all" />
</span></strong><strong>&nbsp;</strong></p>
<p style="text-align: left; line-height: 200%; margin: 3pt 0cm; background: white" class="MsoNormal" align="left"><span style="line-height: 200%; font-family: 新宋体; color: red; font-size: 12pt">二.区别</span><span style="line-height: 200%; font-family: 新宋体; font-size: 12pt"><br clear="all" />
&nbsp;&nbsp;&nbsp; memset </span><span style="line-height: 200%; font-family: 新宋体; font-size: 12pt">用来对一段内存空间全部设置为某个字符，一般用于在对定义的字符串初始化为' '或者'"0';<br clear="all" />
&nbsp;&nbsp;&nbsp; 例: char a[100];<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(a,'"0',sizeof(a));<br clear="all" />
&nbsp;&nbsp;&nbsp; <br clear="all" />
&nbsp;&nbsp; memcpy 是用来做内存拷贝，可以用来拷贝任何数据类型的对象，可以指定拷贝的数据长度；<br clear="all" />
&nbsp;&nbsp; 例:<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char a[100],b[50];<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(b,a,sizeof(b));&nbsp;&nbsp; //注意：如果使用sizeof(a),会造成内存溢出<br clear="all" />
&nbsp;&nbsp; mem是一段内存，他的长度，必须自己记住.memcpy是见着什么拷贝什么。<br clear="all" />
&nbsp;&nbsp;&nbsp; <br clear="all" />
&nbsp;&nbsp;&nbsp; strcpy 就只能拷贝字符串，它遇到'"0'就结束拷贝；<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例：char a[100],b[50];<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(a,b);<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如用strcpy(b,a)要注意a中的字符串长度(第一个'"0'之前) 是否超过50,如果超过，则会造成b的<br clear="all" />
内存溢出.它是不会拷贝'"0'的，所以一般还有加一个语句:<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *a='"0';<br clear="all" />
&nbsp;&nbsp; <br clear="all" />
<span style="color: red">三.使用技巧<br clear="all" />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset 可以方便的清空一个数据结构的变量或数组.<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如:<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct sample_struct<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char csName[16];<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iSeq;<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iType;<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于变量<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct sample_struct stTest;<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般情况下，初始化stTest的方法:<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stTest.csName[0]='"0';<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stTest.iSeq=0;<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stTest.iType=0;<br clear="all" />
&nbsp;&nbsp;&nbsp; 而用memset:<br clear="all" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(&amp;stTest,0,sizeof(struct sample_struct));<br clear="all" />
&nbsp;&nbsp;&nbsp; 如果是数组:<br clear="all" />
&nbsp;&nbsp;&nbsp; struct sample_struct TEST[100];<br clear="all" />
&nbsp;&nbsp;&nbsp; memset(TEST,0,sizeof(struct sample_struct)*100);</span></p>
<p style="text-align: left; line-height: 200%; background: white" class="MsoNormal" align="left"><span style="line-height: 200%; font-family: 新宋体; font-size: 14pt">strcpy</span><span style="line-height: 200%; font-family: 新宋体; font-size: 14pt">是拷贝字符串，以"0为标志结束（即一旦遇到数据值为0的内存地址拷贝过程即停止） <br clear="all" />
strcpy的原型为 <br clear="all" />
char *strcpy(char *dest, const char *src) <br clear="all" />
而memcpy是给定来源和目标后，拷贝指定大小n的内存数据，而不管拷贝的内容是什么（不仅限于字符） <br clear="all" />
memcpy的原型为 <br clear="all" />
void *memcpy(void *dest, const void *src, size_t n);</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-14 18:23 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memset用法详解</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328853.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 14 Aug 2010 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328853.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328853.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328853.html</trackback:ping><description><![CDATA[<div style="font-size: 12pt" class="cnt">原文：<strong><a href="http://blog.ednchina.com/fpga2006/16745/message.aspx">http://blog.ednchina.com/fpga2006/16745/message.aspx</a><br />
memest原型</strong>&nbsp;<strong>(please&nbsp;type&nbsp;"man&nbsp;memset"&nbsp;in&nbsp;your&nbsp;shell)&nbsp;</strong>
<p><strong>&nbsp;void&nbsp;*memset(void&nbsp;*s,&nbsp;&nbsp;int&nbsp;c,&nbsp;size_t&nbsp;n);</strong>&nbsp;</p>
<p><span class="tpc" _content>memset:作用是在一段内存块中填充某个给定的值，它对较大的结构体或数组进行清零操作的一种最快方法。</span></p>
<p><span class="tpc" _content><strong>常见的三种错误</strong></span></p>
<span class="tpc" _content>
<p><strong>第一:&nbsp;搞反了c&nbsp;和&nbsp;n的位置.</strong>&nbsp;</p>
<p>一定要记住&nbsp;如果要把一个char&nbsp;a[20]清零,&nbsp;一定是&nbsp;memset(a,&nbsp;0,&nbsp;20)&nbsp;<br />
而不是&nbsp;memset(a,&nbsp;20,&nbsp;&nbsp;0)&nbsp;</p>
</span><span class="tpc" _content>
<p><strong>第二:&nbsp;过度使用memset,&nbsp;我想这些程序员可能有某种心理阴影,&nbsp;他们惧怕未经初始化的内存,&nbsp;所以他们会写出这样的代码:</strong>&nbsp;</p>
<p>char&nbsp;buffer[20];&nbsp;</p>
<p>memset(buffer,&nbsp;0,&nbsp;sizeof((char)*20));&nbsp;<br />
strcpy(buffer,&nbsp;"123");&nbsp;</p>
<p>这里的memset是多余的.&nbsp;因为这块内存马上就被覆盖了,&nbsp;清零没有意义.&nbsp;</p>
<p><strong>第三:&nbsp;其实这个错误严格来讲不能算用错memset,&nbsp;但是它经常在使用memset的场合出现</strong>&nbsp;</p>
<p>int&nbsp;some_func(struct&nbsp;something&nbsp;*a){&nbsp;<br />
&nbsp;&#8230;&nbsp;<br />
&nbsp;&#8230;&nbsp;<br />
&nbsp;memset(a,&nbsp;0,&nbsp;sizeof(a));&nbsp;<br />
&nbsp;&#8230;&nbsp;<br />
}&nbsp;</p>
<p><strong>问</strong>:<strong>为何要用memset置零?</strong>memset(&nbsp;&amp;Address,&nbsp;0,&nbsp;sizeof(Address))；经常看到这样的用法，其实不用的话，分配数据的时候，剩余的空间也会置零的。</p>
<p><strong>答:</strong><strong>1.</strong>如果不清空，可能会在测试当中出现野值。&nbsp;你做下面的试验看看结果()&nbsp;</p>
<p>char&nbsp;buf[5]；&nbsp;</p>
<p>CString&nbsp;str,str1；&nbsp;//memset(buf,0,sizeof(buf))；&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0；i&lt;5；i++)&nbsp;{&nbsp;str.Format(&#8220;%d&nbsp;&#8220;,buf[i])；&nbsp;str1&nbsp;+=str&nbsp;；&nbsp;}&nbsp;TRACE(&#8220;%s\r\n&#8220;,str1)</p>
<p><strong>2</strong>.其实不然！特别是对于<span style="color: red">字符指针类型的，剩余的部分通常是不会为0的</span>，不妨作一个试验，定义一个字符数组，并输入一串字符，如果不用memset实现清零，使用MessageBox显示出来就会有乱码（0表示NULL，如果有，就默认字符结束，不会输出后面的乱码）</p>
<p><strong>问:</strong></p>
<p><strong>如下demo是可以的，能把数组中的元素值都设置成字符1</strong>，<br />
#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;cstring&gt;<br />
using&nbsp;namespace&nbsp;std;<br />
int&nbsp;main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;a[5];<br />
&nbsp;&nbsp;&nbsp;&nbsp;memset(a,'1',5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;i&nbsp;&lt;&nbsp;5;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;a[i]&lt;&lt;"&nbsp;&nbsp;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;system("pause");<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />
}<br />
<strong>而，如下程序想吧数组中的元素值设置成1，却是不可行的<br />
</strong>#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;cstring&gt;<br />
using&nbsp;namespace&nbsp;std;<br />
int&nbsp;main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a[5];<br />
&nbsp;&nbsp;&nbsp;&nbsp;memset(a,1,5);//这里改成memset(a,1,5&nbsp;*sizeof(int))也是不可以的<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;i&nbsp;&lt;&nbsp;5;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;a[i]&lt;&lt;"&nbsp;&nbsp;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;system("pause");<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />
}<br />
<strong>问题是：</strong></p>
<p><strong>1，第一个程序为什么可以，而第二个不行，<br />
2，不想要用for，或是while循环来初始化int&nbsp;a[5];能做到吗？（有没有一个像memset（）这样的函数初始化）<br />
</strong></p>
<p><strong>答:</strong></p>
<p>1.因为第一个程序的数组a是字符型的，字符型占据内存大小是1Byte，而memset函数也是以字节为单位进行赋值的，所以你输出没有问题。而第二个程序a是整型的，使用memset还是按字节赋值，这样赋值完以后，每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样？&nbsp;</p>
<p>2.如果用memset(a,1,20);<br />
就是对a指向的内存的20个字节进行赋值，每个都用ASCII为1的字符去填充，转为二进制后，1就是00000001,占一个字节。一个INT元素是4字节，合一起就是1000000010000000100000001，就等于16843009，就完成了对一个INT元素的赋值了。</p>
</span></div>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-14 18:03 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC--ini文件-配置信息--函数用法</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328850.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 14 Aug 2010 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328850.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328850.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328850.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;</span></span></span><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><br />
<span style="font-size: 12pt"><span style="font-size: 10pt">http://blog.pfan.cn/sword2008/31089.html<br />
&nbsp; </span></span>
<p style="text-align: left; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">配置文件中经常用到<span lang="EN-US">ini</span>文件，在<span lang="EN-US">VC</span>中其函数分别为：<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">写入<span lang="EN-US">.ini</span>文件：<span lang="EN-US">bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);<o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">读取<span lang="EN-US">.ini</span>文件：<span lang="EN-US">DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);<o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">读取整形值：<span lang="EN-US">UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);<o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">其中个参数的意思：<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">LPCTSTR lpAppName ------- INI</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">文件中的一个字段名<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">LPCTSTR lpKeyName -------- lpAppName </span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">下的一个键名，也就是里面具体的变量名<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">LPCTSTR lpString ---------</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">是键值，也就是变量的值， 必须为<span lang="EN-US">LPCTSTR</span>或<span lang="EN-US">CString</span>类型<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">LPCTSTR lpFileName --------</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">完整的<span lang="EN-US">INI</span>文件路径名<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">LPCTSTR lpDefaut ----------</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">如果没有其前两个参数值，则将此值赋给变量<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">LPSTR lpReturnedString --------</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">接收<span lang="EN-US">INI</span>文件中的值的<span lang="EN-US">CString</span>对象，即接收缓冲区<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">DWORD nSize ------</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">接收缓冲区的大小<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">例子：<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">CString StrName,Strtemp;<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">int nAge;<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">StrName = "jacky";<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">nAge = 13;<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">结果：（<span lang="EN-US">INI</span>文件中显示如下：）<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">[Student]<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">Name=jacky<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">读取：<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">CString SName;<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">结果：<span lang="EN-US">SName = "jacky"</span>；这里需要注意点就是用完<span lang="EN-US">GetBuffer</span>函数后一定要释放<span lang="EN-US">(</span>用<span lang="EN-US">SName.ReleaseBuffer()</span>函数<span lang="EN-US">)</span>，不然后面再用到<span lang="EN-US">SName</span>的其他子函数就会失灵。<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">读整数比较简单，如下<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">int Result = GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")</span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">返回值即为所读取的结果！<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">在<span lang="EN-US">GetPrivateProfileString</span>最后一个参数是配置文件路径的参数，此路径只能是绝对路径，不能是相对路径，但现在我需要是我的<span lang="EN-US">exe</span>文件能和我的配置文件在一起。因此我使用了<span lang="EN-US">GetCurrentDirectory</span>函数。<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">原代码如下：<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 10pt">CString server_ip;<br />
CString des="";<br />
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));<br />
des.ReleaseBuffer();<br />
des+="</span></span><a href="file://config.ini/"><span style="color: blue"><span style="font-size: 12pt"><span style="font-size: 10pt">\\config.ini</span></span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt">";<br />
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);<br />
server_ip.ReleaseBuffer();<o:p></o:p></span></span></span></p>
<p style="text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 10pt">注意：在这里使用<span lang="EN-US">CString</span>变量时，在使用完<span lang="EN-US">GetBuffer</span>后，紧接着一定要使用<span lang="EN-US">ReleaseBuffer()</span>函数，才可以进行其他的诸如字符串<span lang="EN-US">+</span>操作<span lang="EN-US"><o:p></o:p></span></span></span></span></p>
<p class="MsoNormal"><span style="mso-bidi-font-size: 7.0pt" lang="EN-US"><o:p><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;</span></span></o:p></span></p>
<br />
<span style="font-size: 12pt"><span style="font-size: 10pt">例如：<br />
&nbsp; </span></span>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">[settings]<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">remember_check=0<br />
</span></span></span></span></span><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">language_sel=0<br />
</span></span></span></span></span><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">IP_adress=192.168.1.1<br />
</span></span></span></span></span><span style="font-size: 10pt"><span style="font-family: Arial; font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">Password_sel=098764<br />
</span><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">usr_name_sel=opipiio<o:p></o:p></span></span></span></span></span></p>
<br />
<span style="font-size: 12pt"><span style="font-size: 10pt">在我们写的程序当中<span lang="EN-US">,</span>总有一些配置信息需要保存下来<span lang="EN-US">,</span>以便完成程序的功能<span lang="EN-US">,</span>最简单的办法就是将这些信息写入<span lang="EN-US">INI</span>文件中<span lang="EN-US">,</span>程序初始化时再读入<span lang="EN-US">.</span>具体应用如下<span lang="EN-US">:<o:p></o:p></span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"> </span></span>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　一<span lang="EN-US">.</span>将信息写入<span lang="EN-US">.INI</span>文件中<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　<span style="color: #00b050">　<span lang="EN-US">1.</span>所用的<span lang="EN-US">WINAPI</span>函数原型为<span lang="EN-US">: <o:p></o:p></span></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">BOOL WritePrivateProfileString(<br />
LPCTSTR lpAppName,<br />
LPCTSTR lpKeyName,<br />
LPCTSTR lpString,<br />
LPCTSTR lpFileName<br />
); <o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　其中各参数的意义<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">LPCTSTR lpAppName </span>是<span lang="EN-US">INI</span>文件中的一个字段名<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">LPCTSTR lpKeyName </span>是<span lang="EN-US">lpAppName</span>下的一个键名<span lang="EN-US">,</span>通俗讲就是变量名<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">LPCTSTR lpString </span>是键值<span lang="EN-US">,</span>也就是变量的值<span lang="EN-US">,</span>不过必须为<span lang="EN-US">LPCTSTR</span>型或<span lang="EN-US">CString</span>型的<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">LPCTSTR lpFileName </span>是完整的<span lang="EN-US">INI</span>文件名<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">2.</span>具体使用方法<span lang="EN-US">:</span>设现有一名学生<span lang="EN-US">,</span>需把他的姓名和年龄写入<span lang="EN-US"> c:\stud\student.ini </span>文件中<span lang="EN-US">. <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">CString strName,strTemp;<br />
int nAge;<br />
strName="</span></span></span></span><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">张三</span></span></span><span lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">";<br />
nAge=12;<br />
::WritePrivateProfileString("StudentInfo","Name",strName,"c:\\stud\\student.ini"); <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　此时<span lang="EN-US">c:\stud\student.ini</span>文件中的内容如下<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">[StudentInfo]<br />
</span>　　　<span lang="EN-US">Name=</span>张三<span lang="EN-US"><o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">3.</span>要将学生的年龄保存下来<span lang="EN-US">,</span>只需将整型的值变为字符型即可<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">strTemp.format("%d",nAge);<br />
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c:\\stud\\student.ini"); <o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">二<span lang="EN-US">.</span>将信息从<span lang="EN-US">INI</span>文件中读入程序中的变量<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">1.</span>所用的<span lang="EN-US">WINAPI</span>函数原型为<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">DWORD GetPrivateProfileString(<br />
LPCTSTR lpAppName, <br />
LPCTSTR lpKeyName, <br />
LPCTSTR lpDefault, <br />
LPTSTR lpReturnedString, <br />
DWORD nSize, <br />
LPCTSTR lpFileName <br />
); <o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　其中各参数的意义<span lang="EN-US">: <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　前二个参数与<span lang="EN-US"> WritePrivateProfileString</span>中的意义一样<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">lpDefault : </span>如果<span lang="EN-US">INI</span>文件中没有前两个参数指定的字段名或键名<span lang="EN-US">,</span>则将此值赋给变量<span lang="EN-US">. <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">lpReturnedString : </span>接收<span lang="EN-US">INI</span>文件中的值的<span lang="EN-US">CString</span>对象<span lang="EN-US">,</span>即目的缓存器<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">nSize : </span>目的缓存器的大小<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">lpFileName : </span>是完整的<span lang="EN-US">INI</span>文件名<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">2.</span>具体使用方法<span lang="EN-US">:</span>现要将上一步中写入的学生的信息读入程序中<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US">CString strStudName;<br />
int nStudAge; <br />
GetPrivateProfileString("StudentInfo","Name","</span><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">默认姓名<span lang="EN-US">",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\\stud\\student.ini"); <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　执行后<span lang="EN-US"> strStudName </span>的值为<span lang="EN-US">:"</span>张三<span lang="EN-US">",</span>若前两个参数有误<span lang="EN-US">,</span>其值为<span lang="EN-US">:"</span>默认姓名<span lang="EN-US">".<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">3.</span>读入整型值要用另一个<span lang="EN-US">WINAPI</span>函数<span lang="EN-US">: <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">UINT GetPrivateProfileInt(<br />
LPCTSTR lpAppName, <br />
LPCTSTR lpKeyName, <br />
INT nDefault, <br />
LPCTSTR lpFileName <br />
); <o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　这里的参数意义与上相同<span lang="EN-US">.</span>使用方法如下<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\\stud\\student.ini"); <o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">三<span lang="EN-US">.</span>循环写入多个值<span lang="EN-US">,</span>设现有一程序<span lang="EN-US">,</span>要将最近使用的几个文件名保存下来<span lang="EN-US">,</span>具体程序如下<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">1.</span>写入<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">CString strTemp,strTempA;<br />
int i;<br />
int nCount=6;<br />
</span></span></span></span><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">文件<span lang="EN-US">://</span>共有<span lang="EN-US">6</span>个文件名需要保存</span></span></span><span lang="EN-US"><br />
<span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">for(i=0;i {strTemp.format("%d",i);<br />
strTempA=</span></span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">文件名</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">;<br />
</span>文件<span lang="EN-US">://</span>文件名可以从数组<span lang="EN-US">,</span>列表框等处取得</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span lang="EN-US">.<br />
::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,<br />
"c:\\usefile\\usefile.ini");<br />
}<br />
strTemp.format("%d",nCount);<br />
::WritePrivateProfileString("FileCount","Count",strTemp,"c:\\usefile\\usefile.ini");<br />
</span>文件<span lang="EN-US">://</span>将文件总数写入<span lang="EN-US">,</span>以便读出<span lang="EN-US">. <o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　<span lang="EN-US">2.</span>读出<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">nCount=::GetPrivateProfileInt("FileCount","Count",0,"c:\\usefile\\usefile.ini");<br />
for(i=0;i {strTemp.format("%d",i);<br />
strTemp="FileName"+strTemp;<br />
::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c:\\usefile\\usefile.ini");<o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">文件<span lang="EN-US">://</span>使用<span lang="EN-US">strTempA</span>中的内容<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体" lang="EN-US"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">} <o:p></o:p></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　补充四点<span lang="EN-US">:<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">1.INI</span>文件的路径必须完整<span lang="EN-US">,</span>文件名前面的各级目录必须存在<span lang="EN-US">,</span>否则写入不成功<span lang="EN-US">,</span>该函数返回<span lang="EN-US"> FALSE </span>值<span lang="EN-US">.<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">2.</span>文件名的路径中必须为<span lang="EN-US"> \\ ,</span>因为在<span lang="EN-US">VC++</span>中<span lang="EN-US">, \\ </span>才表示一个<span lang="EN-US"> \ .<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">3.</span>也可将<span lang="EN-US">INI</span>文件放在程序所在目录<span lang="EN-US">,</span>此时<span lang="EN-US"> lpFileName </span>参数为<span lang="EN-US">: ".\\student.ini".<o:p></o:p></span></span></span></span></span></p>
<p style="text-align: left; line-height: 11.9pt; background: white; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 7pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">　　　<span lang="EN-US">4.</span>从网页中粘贴源代码时<span lang="EN-US">,</span>最好先粘贴至记事本中<span lang="EN-US">,</span>再往<span lang="EN-US">VC</span>中粘贴<span lang="EN-US">,</span>否则易造成编译错误<span lang="EN-US">,</span>开始时我也十分不解<span lang="EN-US">,</span>好好的代码怎么就不对呢<span lang="EN-US">?</span>后来才找到这个方法<span lang="EN-US">.</span>还有一些代码中使用了全角字符如<span lang="EN-US">:</span>＜，＼等<span lang="EN-US">,</span>也会</span></span></span><span lang="EN-US"><br />
</span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">造成编译错误<span lang="EN-US">. <o:p></o:p></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-14 17:08 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CTreeCtrl（树控件）--HTREEITEM句柄的使用</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328841.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 14 Aug 2010 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328841.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328841.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328841.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt"><span style="font-size: 12pt">&nbsp; </span></span>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt">原文：http://tech.ddvip.com/2008-11/122662858992494.html </span></span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt"><br />
<span style="font-size: 10pt"><span style="font-size: 12pt">ClassWizard</span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">为</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">CTreeCtrl</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">（树控件）添加的</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">NM_DBLCLK</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">（双击）消息的响应函数中带有一个</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">NMHDR * </span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">型指针形参：</span></span></span></p>
<p style="text-align: left; line-height: 160%; word-break: break-all" class="MsoNormal" align="left"><span style="border-bottom: #999999 1pt solid; border-left: #999999 1pt solid; padding-bottom: 6pt; line-height: 160%; padding-left: 6pt; padding-right: 6pt; font-family: 'Verdana','sans-serif'; background: #e6e6e6; color: #333333; font-size: 7pt; border-top: #999999 1pt solid; border-right: #999999 1pt solid; padding-top: 6pt"><span style="font-size: 10pt"><span style="font-size: 12pt">OnDblClkTree(NMHDR* pNMHDR, LRESULT* pResult)</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">　　这个陌生的指针类型常使初用树控件的编程者陷入迷茫之中。实际上我们完全不理会它，也可以实现树控件的双击响应，即在</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">OnDblClkTree( )</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">函数中</span><span style="line-height: 160%; font-family: 宋体; color: #00b050; font-size: 8.5pt">调用树控件的成员函数</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: #00b050; font-size: 8.5pt">CTreeCtrl::GetSelectedItem( )</span><span style="line-height: 160%; font-family: 宋体; color: #00b050; font-size: 8.5pt">以获取树控件的子项句柄</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: #00b050; font-size: 8.5pt">HTREEITEM</span><span style="line-height: 160%; font-family: 宋体; color: #00b050; font-size: 8.5pt">，得到此句柄后，我们便可用下列成员函数获取子项各种有用信息：</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: #00b050; font-size: 8.5pt">　　</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: #00b050; font-size: 8.5pt">CTreeCtrl::GetItemData( )</span><span style="line-height: 160%; font-family: 宋体; color: #00b050; font-size: 8.5pt">、</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">　　</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">CTreeCtrl::GetItemHeight( )</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">、</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">　　</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">CTreeCtrl::GetItemImage( )</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">、</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">　　</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">CTreeCtrl::GetItemRect( )</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">、</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">　　</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">CTreeCtrl::GetItemState( )</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">、</span></span></span></p>
<p style="text-align: left; line-height: 160%; margin: 8.35pt 0cm; word-break: break-all" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">　　</span><span style="line-height: 160%; font-family: 'Arial','sans-serif'; color: black; font-size: 8.5pt">CTreeCtrl::GetItemText( )</span><span style="line-height: 160%; font-family: 宋体; color: black; font-size: 8.5pt">。</span></span></span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-14 13:48 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>if(!srcmp(A,B))用法</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328840.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 14 Aug 2010 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328840.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328840.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328840.html</trackback:ping><description><![CDATA[strcmp(s1,s2)为字符串比较函数，比较的是从字符串的第一个字符开始比较他的ASCLL码值，跟字符串的长度无关。<br />
当s1 &gt; s2 时，返回值 &gt; 0<br />
当s1 = s2 时，返回值 = 0<br />
当s1 &lt; s2时，返回值 &lt; 0<br />
<br />
! 为逻辑非运算符，即当值为真时改成假，值为加时改成真<br />
<br />
在程序设计的判断真假中0为假，非0为真<br />
<br />
所以在if(!srcmp(A,B))这个语句中我们可以将A和B的关系设为两种，一种是A==B，另一种是A!=B<br />
当A==B时：strcmp(A,B)为0，!strcmp(A,B)为非0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if判断为真<br />
当A!=B时：strcmp(A,B)为非0，!strcmp(A,B)为0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if判断为假 <br />
<br />
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-14 13:40 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DDX_Control 与 DDX_Text 区别</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328838.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Sat, 14 Aug 2010 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328838.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328838.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328838.html</trackback:ping><description><![CDATA[&nbsp;
<p class="MsoNormal"><strong><span style="font-family: 'Tahoma','sans-serif'; color: #548dd4; font-size: 9pt">DDX_TEXT()</span></strong><strong><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">的作用可以理解为把字符串变量和控件的文本（</span></strong><strong><span style="font-family: 'Tahoma','sans-serif'; color: #548dd4; font-size: 9pt">WindowText</span></strong><strong><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">）关联起来，</span></strong><strong><span style="font-family: 'Tahoma','sans-serif'; color: #548dd4; font-size: 9pt"> <br />
DDX_Control()</span></strong><strong><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">的作用可以理解为把变量和控件本身关联起来，</span></strong><strong><span style="font-family: 'Tahoma','sans-serif'; color: #548dd4; font-size: 9pt"> <br />
DoDataExchang<em>e</em>(pDX)</span></strong><strong><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">就是处理所有变量与其关联控件交换数据的函数。</span></strong><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
<br />
void CView::DoDataExchange(CDataExchange* pDX) <br />
</span><span style="font-family: 宋体; font-size: 9pt">｛</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
CFormView::DoDataExchange(pDX); <br />
DDX_Text(pDX, IDC_ID_VALUE, m_strID); <br />
DDX_Control(pDX, IDC_ID_VALUE, m_editID); <br />
</span><span style="font-family: 宋体; font-size: 9pt">｝</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
</span><span style="font-family: 宋体; font-size: 9pt">在程序中</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
</span><span style="font-family: 宋体; font-size: 9pt">通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">update(TRUE)</span><span style="font-family: 宋体; font-size: 9pt">取得控件上的值到</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">m_strID</span><span style="font-family: 宋体; font-size: 9pt">，处理修改后通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">update(FALSE)</span><span style="font-family: 宋体; font-size: 9pt">传回控件，界面显示</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
</span><span style="font-family: 宋体; font-size: 9pt">通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">m_editID.GetWindText(str),</span><span style="font-family: 宋体; font-size: 9pt">取得值，处理后，通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">m_editID.SetWindText(str)</span><span style="font-family: 宋体; font-size: 9pt">传回控件界面显示</span></p>
<p><span style="font-family: 宋体; font-size: 9pt">通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">update(TRUE)</span><span style="font-family: 宋体; font-size: 9pt">取得控件上的值到</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">m_strID</span><span style="font-family: 宋体; font-size: 9pt">，处理修改后通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">update(FALSE)</span><span style="font-family: 宋体; font-size: 9pt">传回控件，界面显示</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
</span><span style="font-family: 宋体; font-size: 9pt">通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">m_editID.GetWindText(str),</span><span style="font-family: 宋体; font-size: 9pt">取得值，处理后，通过</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt">m_editID.SetWindText(str)</span><span style="font-family: 宋体; font-size: 9pt">传回控件界面显示</span><span style="font-family: 'Tahoma','sans-serif'; font-size: 9pt"> <br />
<br />
update(TRUE)=m_editID.GetWindText(str)? <br />
update(FALSE)=m_editID.SetWindText(str)?</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-14 13:10 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/14/328838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++  BeginWaitCursor()函数作用</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328707.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 12 Aug 2010 11:22:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328707.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328707.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328707.html</trackback:ping><description><![CDATA[&nbsp; <span style="font-family: 'simsun', 'serif'; color: #323e32"><br />
原文: <font color="#323e32" face="宋体">http://blog.sina.com.cn/s/blog_47145b660100gdw2.html<br />
</font><br />
BeginWaitCursor()</span><span style="font-family: 宋体; color: #323e32">是</span><span style="font-family: 'simsun', 'serif'; color: #323e32">CCmdTarget</span><span style="font-family: 宋体; color: #323e32">类的<nobr style="border-bottom: 2px dotted; background-color: transparent; color: #6600ff; text-decoration: underline" target="_blank">函数</nobr>，</span><span style="font-family: 'simsun', 'serif'; color: #323e32"> &nbsp;<br />
<wbr><wbr>&nbsp;<wbr><wbr> </span><span style="font-family: 宋体; color: #323e32">函数原型：</span><strong><span style="font-family: 'simsun', 'serif'; color: #00b050">void &nbsp;<wbr><wbr> BeginWaitCursor(); &nbsp;<br />
<wbr><wbr>&nbsp;<wbr><wbr> </span></strong><strong><span style="font-family: 宋体; color: #00b050">功能简介：本函数用于显示沙漏光标（通常在命令执行较长时采用）。</span></strong><strong><span style="font-family: 'simsun', 'serif'; color: #00b050"> &nbsp;<br />
<wbr><wbr>&nbsp;<wbr><wbr> </span></strong><strong><span style="font-family: 宋体; color: #00b050">框架调用本函数显示沙漏光标，告诉用户<nobr style="border-bottom: 2px dotted; background-color: transparent; color: #6600ff; text-decoration: underline" target="_blank">系统</nobr>忙。</span></strong><span style="font-family: 'simsun', 'serif'; color: #548dd4"> &nbsp;<br />
<wbr><wbr></span><span style="font-family: 'simsun', 'serif'; color: #323e32">&nbsp;<wbr><wbr> </span><span style="font-family: 宋体; color: #323e32">在不是处理单个消息时，</span><span style="font-family: 'simsun', 'serif'; color: #323e32"> &nbsp;<br />
<wbr><wbr>&nbsp;<wbr><wbr> BeginWaitCursor()</span><span style="font-family: 宋体; color: #323e32">可能不像其它函数那样有效，例如</span><span style="font-family: 'simsun', 'serif'; color: #323e32"> &nbsp;<br />
<wbr><wbr>&nbsp;<wbr><wbr> OnSetCursor()</span><span style="font-family: 宋体; color: #323e32">的处理也能改变光标形状。</span><span style="font-family: 'simsun', 'serif'; color: #323e32"> &nbsp;<br />
<wbr><wbr>&nbsp;<wbr><wbr> </span><span style="font-family: 宋体; color: #323e32">调用函数</span><span style="font-family: 'simsun', 'serif'; color: #323e32">EndWaitCursor</span><span style="font-family: 宋体; color: #323e32">可以恢复此前的光标。</span>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-12 19:22 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ComboBox控件，通过SetCurSel()默认选中第一项</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328673.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 12 Aug 2010 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328673.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328673.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328673.html</trackback:ping><description><![CDATA[ComboBox控件，通过SetCurSel()默认选中第一项<br />
http://hi.baidu.com/%CB%B3%C6%E4%B5%C0/blog/item/8d1aa5f4d19c84d1f2d3850e.html
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-12 15:10 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++  EDIT控件的SetLimitText()用法</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328672.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 12 Aug 2010 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328672.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328672.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328672.html</trackback:ping><description><![CDATA[&nbsp;原文：<font face="宋体"><a href="http://221.199.150.103/jsj/Html/vc/wen/vcwen10.htm">http://221.199.150.103/jsj/Html/vc/wen/vcwen10.htm</a></font>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">用VC++6.0编程的时候，文本编辑控件Edit Box是一个经常用到的控件。如果你是用它输入一些简单的文字、数字等信息，直接拿来用就可以了，但如果你用它制作大文本的编辑软件，就会觉得不好控制，许多功能无法实现，即便用CEditView，也只会生成一个类似于记事本的东西，再想加入些自己编写的功能也很困难。下面我以CEdit为基类定义了一个CEditBox类，加入了许多文本编辑时经常要用到的接口函数，用它来控制Edit Box控件就很容易制作出具有较强文本编辑功能的编辑软件了。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">在这个扩展类中主要增加了以下功能：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">①增加控件的容量，使它能容纳大文本；<br />
②可设置编辑控件文字颜色、背景色和字体；<br />
③对控件内的文本和选择文本的访问；<br />
④直接装入文件到控件和保存控件内容到文件；<br />
⑤自定义的右键菜单；<br />
⑥多重ReDo/UnDo功能。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">这些功能基本上都是独立的，实际使用时可根据需要选用所需功能。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">准备工作：用ClassWizard在工程中加入一个新类，基类选为CEdit，类名设置为CEditBox。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 12pt">一、设置控件的容量：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #00b050">EditBox</span><span style="font-family: 宋体; color: #00b050">控件默认情况下只能装入64K的文本，如果超出，多出部分会被自动截掉。利用CEdit类的SetLimitText()函数可重新设置控件容量。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">函数原型为：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #548dd4">void SetLimitText(UINT nMax);</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #548dd4">参数为nMax为控件可接收的文本最大字节数。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #548dd4">设置方法：用ClassWizard在CEditBox类中添加消息函数PreSubclassWindow()，把设置文本容量的语句放在里面即可。</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #548dd4">void&nbsp;CEditBox::PreSubclassWindow()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetLimitText(&nbsp;-1&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">//</span><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">设置编辑控件可接收的最大字节数</span><span style="font-family: 宋体; color: #548dd4"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;CEdit::PreSubclassWindow();<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #548dd4">因为nMax为无符号整型，-1是把它设置为可以取到的最大值。你也可以根据需要设置控件的容量。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #548dd4">注意：在不同操作系统下，控件可设置的最大容量也不同。如果是Windows98，这个值就是64K，无法再增大了，而在Windows2000和WindowsXP下这个值要大得多，才可以起到增加控件容量的目的。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 12pt">二、设置编辑控件的前景色、背景色和字体：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">在CEditBox的头文件中加入以下变量定义：</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">COLORREF&nbsp;&nbsp;&nbsp;&nbsp;m_ForeColor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">文本颜色</span><span style="font-family: 宋体"><br />
            COLORREF&nbsp;&nbsp;&nbsp;&nbsp;m_BackColor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">背景色</span><span style="font-family: 宋体"><br />
            CBrush&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_BkBrush;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">背景刷</span><span style="font-family: 宋体"><br />
            CFont*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_Font;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">字体指针</span><span style="font-family: 宋体"><br />
            int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_FontSize;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">字体大小(1/10点)</span><span style="font-family: 宋体"><br />
            CString&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_FontName;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">字体名</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">在CEditBox的构造函数中设置它们的初值：</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">CEditBox::CEditBox()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_ForeColor&nbsp;=&nbsp;RGB(0,0,0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">文字颜色（黑）</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_BackColor&nbsp;=&nbsp;RGB(255,255,255);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">文字背景色（白）</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_BkBrush.CreateSolidBrush(m_BackColor);&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">背景刷</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;p_Font&nbsp;=&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">字体指针</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">在CEditBox的析构函数中回收创建的字体资源：</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">CEditBox::~CEditBox()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;p_Font&nbsp;)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;p_Font;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">回收字体资源</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">这里只设置了前景色和背景色的默认值，如果想设置默认字体，可在上面的PreSubclassWindow()函数中进行设置：</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::PreSubclassWindow()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetLimitText(&nbsp;-1&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置编辑控件可接收的最大字节数</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_FontSize&nbsp;=&nbsp;100;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_FontName&nbsp;=&nbsp;_T("</span><span style="font-family: 宋体">宋体");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;p_Font&nbsp;=&nbsp;new&nbsp;CFont;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">生成字体对象</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;p_Font-&gt;CreatePointFont(&nbsp;m_FontSize,&nbsp;m_FontName&nbsp;);&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">创建字体</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetFont(&nbsp;p_Font&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置控件默认字体</span><span style="font-family: 宋体"><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;CEdit::PreSubclassWindow();<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">这里使用了比较简单的CreatePointFont()函数创建字体，它只需给出字体尺寸和字体名。如果想创建更复杂的字体，可以改用CreateFont()函数。本例中设置控件的初始字体为尺寸为100（0.1点）的&#8220;宋体&#8221;字。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">如果你想用EditBox本身的默认字体作为初始字体，就不要在PreSubclassWindow()函数中加入这些语句。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">用ClassWizard添加消息反射函数CtlColor()来修改控件的文本颜色和背景色。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">注意：在ClassWizard下可看到有两个很相似的消息，一个是&#8220;=WM_CTLCOLOR&#8221;消息，另一个是&#8220;WM_CTLCOLOR&#8221;消息，这里必须用&#8220;=WM_CTLCOLOR&#8221;消息添加函数。如果误用了&#8220;WM_CTLCOLOR&#8221;消息将得不到想要的效果。</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">HBRUSH&nbsp;CEditBox::CtlColor(CDC*&nbsp;pDC,&nbsp;UINT&nbsp;nCtlColor)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetTextColor(&nbsp;m_ForeColor&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置控件文字颜色</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;pDC-&gt;SetBkColor(&nbsp;m_BackColor&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置文字的背景色</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(HBRUSH)m_BkBrush.GetSafeHandle();&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">控件背景刷</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">PreSubclassWindow()</span><span style="font-family: 宋体">和CtlColor()函数都是消息函数，为了设置控件颜色和字体，还需定义接口函数在使用时调用：</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置文本颜色</span><span style="font-family: 宋体"><br />
            void&nbsp;CEditBox::SetForeColor(COLORREF&nbsp;color)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_ForeColor&nbsp;=&nbsp;color;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;Invalidate();<br />
            }<br />
            <br />
            </span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取文本颜色</span><span style="font-family: 宋体"><br />
            COLORREF&nbsp;CEditBox::GetForeColor()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_ForeColor;<br />
            }<br />
            <br />
            </span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置背景颜色</span><span style="font-family: 宋体"><br />
            void&nbsp;CEditBox::SetBkColor(COLORREF&nbsp;color)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_BackColor&nbsp;=&nbsp;color;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_BkBrush.Detach();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_BkBrush.CreateSolidBrush(&nbsp;m_BackColor&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;Invalidate();<br />
            }<br />
            <br />
            </span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取背景色</span><span style="font-family: 宋体"><br />
            COLORREF&nbsp;CEditBox::GetBkColor()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_BackColor;<br />
            }<br />
            <br />
            </span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置字体</span><span style="font-family: 宋体"><br />
            void&nbsp;CEditBox::SetTextFont(int&nbsp;FontSize,LPCTSTR&nbsp;FontName)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;p_Font&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;p_Font;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_Font&nbsp;=&nbsp;new&nbsp;CFont;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;p_Font-&gt;CreatePointFont(&nbsp;FontSize,&nbsp;FontName&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetFont(&nbsp;p_Font&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_FontSize&nbsp;=&nbsp;FontSize;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_FontName&nbsp;=&nbsp;FontName;<br />
            }<br />
            <br />
            </span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取字体大小</span><span style="font-family: 宋体"><br />
            int&nbsp;CEditBox::GetFontSize()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_FontSize;<br />
            }<br />
            <br />
            </span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取字体名</span><span style="font-family: 宋体"><br />
            CString&nbsp;CEditBox::GetFontName()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_FontName;<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">至此，用CEditBox类可以定义出可设置颜色和字体的Edit Box控件了。使用时，先在对话框中加入一个Edit Box控件，用ClassWizard为定义一个控制变量m_Edit，类型设定为CEditBox。然后用m_Edit.SetForeColor(color)、m_Edit.SetBkColor()和m_Edit.SetTextFont(FontHight,FontName)为控件设置颜色和字体，这样就可以作出一个美观的文本框了。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">说明：Edit Box控件只能放入纯文本，不支持对文本格式的设置，也就不能对局部的文字颜色和字体进行设置，所以，以上设置都是针对整个控件的。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 12pt">三、访问编辑控件的内容：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">Edit Box</span><span style="font-family: 宋体">控件已经提供了几种访问控件内容的方法：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">①定义一个与控件关联的变量，类型可设置为CString或其它类型，用UpdateData()函数来更新控件或变量。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">②用GetWindowText()获取控件内文本，用SetWindowText()设置控件文本。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">③用SetSel()设置控件内的选择区，用GetSel()获取控件中选择文本的位置，用ReplaceSel()替换选择的文本。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">但只用这几种方法还是不太方便，所以在CEditBox类中又增加了几个访问接口函数。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">1</span><span style="font-family: 宋体; color: #000099">、读取控件文本ReadText()</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">int&nbsp;CEditBox::ReadText(CString&amp;&nbsp;str)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;GetWindowText(&nbsp;str&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取控件文本</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;str.GetLength();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">文本长度</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">参数str是字符串的引用，用于接收读取的控件内容，返回值是控件中文本字节数。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">2</span><span style="font-family: 宋体; color: #000099">、用字符串设置控件内容SetText()</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::SetText(LPCTSTR&nbsp;str)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetSel(&nbsp;0,&nbsp;-1,&nbsp;true&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">全选</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;ReplaceSel(&nbsp;str&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">替换</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetSel(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">设置插入点为起始位置</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">参数str是准备设置控件的内容，要求是字符串。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">3</span><span style="font-family: 宋体; color: #000099">、读取当前选择的文本ReadSelText()</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">int&nbsp;CEditBox::ReadSelText(CString&amp;&nbsp;str)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;selStart,&nbsp;selEnd;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;GetSel(&nbsp;selStart,&nbsp;selEnd&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取当前选择的位置</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;selLen&nbsp;=&nbsp;selEnd-selStart;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">求选择区长度</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;selLen&nbsp;)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetWindowText(&nbsp;text&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取控件文本</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;=&nbsp;text.Mid(&nbsp;selStart,&nbsp;selLen&nbsp;);&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取选择的文本</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;else<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;=&nbsp;_T("");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;selLen;<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">参数str是字符串的引用，用于接收读出的文本，返回值是读出的文本字节数。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">如果当前控件中有内容被选择，则读出选择文本，并返回长度；如果没有选择的文本，读出的是空串，返回为0。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">4</span><span style="font-family: 宋体; color: #000099">、设置选择区SetSelText()</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::SetSelText(int&nbsp;nStartChar,int&nbsp;nSelLen)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetSel(nStartChar,nStartChar+nSelLen);<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">参数nStartChar为选择区起点（从0算起），nSelLen为选择区长度。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">功能是把控件的指定区域设置为选择的状态。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">5</span><span style="font-family: 宋体; color: #000099">、当前是否有选择isSelect()</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">BOOL&nbsp;CEditBox::isSelect()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;selStart,&nbsp;selEnd;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;GetSel(&nbsp;selStart,&nbsp;selEnd&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">获取当前选择的位置</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;selEnd-selStart;<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">如果当前控件中有选择的文本，返回非0值，否则返回0。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">以上是为了使控件访问更方便而增加的接口函数。再配合CEdit本身提供的访问函数，很多操作都可轻易实现了。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">CEdit</span><span style="font-family: 宋体">控件提供访问函数主要有：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">int GetWindowText(LPCTSTR lpszStringBuf,int nMaxCount);</span><span style="font-family: 宋体"><br />
</span><span style="font-family: 宋体">获取控件文本，与ReadText()功能相同。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">void SetWindowText(LPCTSTR lpszString);</span><span style="font-family: 宋体"><br />
</span><span style="font-family: 宋体">设置控件文本。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">void GetSel(int&amp; nStartChar,int&amp; nEndChar);</span><span style="font-family: 宋体"><br />
</span><span style="font-family: 宋体">获取选择区的位置</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">void SetSel(int nStartChar,int nEndChar,BOOL bNoScroll=FALSE);</span><span style="font-family: 宋体"><br />
</span><span style="font-family: 宋体">设置选择区，参数为起点和终点，用SetSel(0,-1)可设置为全选</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">void ReplaceSel(LPCTSTR lpszNewText,BOOL bCanUndo=FALSE);</span><span style="font-family: 宋体"><br />
</span><span style="font-family: 宋体">用字符串替换选择的文本</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 12pt">四、与文件的接口：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">这部分接口函数供&#8220;打开文件&#8221;和&#8220;保存文件&#8221;等操作调用。把它们定义在CEditBox类中，增强了控件的封装性，也可以简化应用中&#8220;打开&#8221;和&#8220;保存&#8221;的操作。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">1</span><span style="font-family: 宋体; color: #000099">、文件内容装入Edit控件</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::LoadFile(LPCTSTR&nbsp;PathName)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;CFile&nbsp;file;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">构造一个CFile类的对象</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;file.Open(&nbsp;PathName,&nbsp;CFile::modeRead&nbsp;)==0&nbsp;)&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">以读方式打开文件</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;file.GetLength();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">求文件长度</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text&nbsp;=&nbsp;_T("");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;file.Read(&nbsp;text.GetBufferSetLength(len),&nbsp;len&nbsp;);&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">读文件</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;text.ReleaseBuffer();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;file.Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">关闭文件</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetText(&nbsp;text&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">装入编辑控件</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_PathName&nbsp;=&nbsp;PathName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetModify(&nbsp;false&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">清除修改标志</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">参数PathName为文件路径名，调用该函数可以把指定文件装入编辑控件。如果文件不存在，直接返回。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">2</span><span style="font-family: 宋体; color: #000099">、保存编辑控件内容到文件</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::SaveFile(LPCTSTR&nbsp;PathName)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;CFile&nbsp;file;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;file.Open(&nbsp;PathName,&nbsp;CFile::modeCreate&nbsp;|&nbsp;CFile::modeWrite&nbsp;)==0&nbsp;)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;textLen&nbsp;=&nbsp;ReadText(&nbsp;text&nbsp;);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;file.Write(&nbsp;(LPCTSTR)text,&nbsp;textLen&nbsp;);&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">把字符串内容写入文件</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;file.Close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">关闭文件</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_PathName&nbsp;=&nbsp;PathName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetModify(&nbsp;false&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">清除修改标志</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">参数PathName为文件路径名，调用该函数可以把控件内容写入指定文件。如果建立文件失败，直接返回。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">3</span><span style="font-family: 宋体; color: #000099">、新建文件</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::NewFile()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetSel(&nbsp;0,&nbsp;-1,&nbsp;true&nbsp;);&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">全选</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;Clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">清除</span><span style="font-family: 宋体"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;m_PathName&nbsp;=&nbsp;_T("");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;SetModify(&nbsp;false&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 9pt">//</span><span style="font-family: 宋体; font-size: 9pt">清除修改标志</span><span style="font-family: 宋体"><br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">供&#8220;新建&#8221;文件菜单消息调用，功能是清空控件。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">4</span><span style="font-family: 宋体; color: #000099">、是否有文件打开</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">BOOL&nbsp;CEditBox::isOpenFile()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;!(m_PathName.IsEmpty());<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">如果控件中已经有打开的文件，返回非0，否则返回0。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: #000099">5</span><span style="font-family: 宋体; color: #000099">、获取打开的文件名</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">CString&nbsp;CEditBox::GetPathName()<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_PathName;<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">如果控件中已经有打开的文件，返回文件路径名，否则返回空串。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">这5个函数中的m_PathName是在CEditBox中定义的字符串变量，并初始化为空串。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体; color: red; font-size: 12pt">五、自定义右键菜单：</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">文本编辑框已经提供了一个默认右键菜单，如果你想重新定义一个来代替它，可以按下面的方法制作。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">在VC++的Project菜单下选择Add To Project下的Components and Controls，在弹出的对话框中打开Visual C++ Components，找到Pop-up Menu，单击Insert按钮，选择加入的类为CEditBox，确定。关闭对话框。</span></p>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">这时，你在CEditBox类中会看到已经加入了下面的代码：</span></p>
<div align="center">
<table style="border-bottom: #cccccc 1pt outset; border-left: #cccccc 1pt outset; width: 85%; background: #eeeeee; border-top: #cccccc 1pt outset; border-right: #cccccc 1pt outset" class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="85%">
    <tbody>
        <tr>
            <td style="border-bottom: #cccccc 1pt inset; border-left: #cccccc 1pt inset; padding-bottom: 7.5pt; padding-left: 7.5pt; padding-right: 7.5pt; border-top: #cccccc 1pt inset; border-right: #cccccc 1pt inset; padding-top: 7.5pt">
            <p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">void&nbsp;CEditBox::OnContextMenu(CWnd*,&nbsp;CPoint&nbsp;point)<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CG:&nbsp;This&nbsp;block&nbsp;was&nbsp;added&nbsp;by&nbsp;the&nbsp;Pop-up&nbsp;Menu&nbsp;component<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(point.x&nbsp;==&nbsp;-1&nbsp;&amp;&amp;&nbsp;point.y&nbsp;==&nbsp;-1){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//keystroke&nbsp;invocation<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;rect;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetClientRect(rect);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientToScreen(rect);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point&nbsp;=&nbsp;rect.TopLeft();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point.Offset(5,&nbsp;5);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu&nbsp;menu;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VERIFY(menu.LoadMenu(CG_IDR_POPUP_EDIT_BOX));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu*&nbsp;pPopup&nbsp;=&nbsp;menu.GetSubMenu(0);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pPopup&nbsp;!=&nbsp;NULL);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CWnd*&nbsp;pWndPopupOwner&nbsp;=&nbsp;this;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(pWndPopupOwner-&gt;GetStyle()&nbsp;&amp;&nbsp;WS_CHILD)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pWndPopupOwner&nbsp;=&nbsp;pWndPopupOwner-&gt;GetParent();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPopup-&gt;TrackPopupMenu(TPM_LEFTALIGN&nbsp;|&nbsp;TPM_RIGHTBUTTON,&nbsp;point.x,&nbsp;point.y,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pWndPopupOwner);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            } </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-align: left" class="MsoNormal" align="left"><span style="font-family: 宋体">再到资源的Menu下，你可以找到一个ID号为CG_IDR_POPUP_EDIT_BOX的新菜单，编辑它就可得到你想要的右键菜单了。这和其它菜单的做法没有区别，我就不再详细介绍了。</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-12 15:08 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++  容器类</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328659.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 12 Aug 2010 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328659.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328659.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328659.html</trackback:ping><description><![CDATA[&nbsp;
<p class="MsoNormal"><span style="font-family: 宋体; color: #548dd4; font-size: 12pt">C++</span><span style="font-family: 宋体; color: #548dd4; font-size: 12pt">中的容器类包括&#8220;顺序存储结构&#8221;和&#8220;关联存储结构&#8221;，前者包括vector，list，deque等；后者包括set，map，multiset，multimap等。<br />
若需要存储的元素数在编译器间就可以确定，可以使用数组来存储，否则，就需要用到容器类了。</span><span style="font-family: 宋体; font-size: 12pt"> <br />
<br />
1</span><span style="font-family: 宋体; font-size: 12pt">、vector<br />
&nbsp;&nbsp;&nbsp; 连续存储结构，每个元素是在内存上是连续的；<br />
&nbsp;&nbsp;&nbsp; 支持高效的<strong>随机访问</strong>和在<strong>尾端插入/删除</strong>操作，但其他位置的插入/删除操作效率低下；<br />
2、deque<br />
&nbsp;&nbsp;&nbsp; 连续存储结构，即其每个元素在内存上也是连续的，类似于vector，不同之处在于，deque提供了两级数组结构，第一级完全类似于vector，代表实际容器；另一级维护容器的首位地址。<br />
&nbsp;&nbsp;&nbsp; 这样，deque除了具有vector的所有功能外，还支持高效的<strong>首端插入/删除</strong>操作。<br />
3、list<br />
&nbsp;&nbsp;&nbsp; 非连续存储结构，具有双链表结构，每个元素维护一对前向和后向指针，因此支持前向/后向遍历。<br />
&nbsp;&nbsp;&nbsp; 支持高效的<strong>随机插入/删除</strong>操作，但随机访问效率低下，且由于需要额外维护指针，开销也比较大。<br />
<br />
4、vector V.S. list V.S. deque：<br />
&nbsp;&nbsp;&nbsp; a、若需要随机访问操作，则选择vector；<br />
&nbsp;&nbsp;&nbsp; b、若已经知道需要存储元素的数目， 则选择vector；<br />
&nbsp;&nbsp;&nbsp; c、若需要随机插入/删除（不仅仅在两端），则选择list<br />
&nbsp;&nbsp;&nbsp; d、只有需要在首端进行插入/删除操作的时候，才选择deque，否则都选择vector。<br />
&nbsp;&nbsp;&nbsp; e、若既需要随机插入/删除，又需要随机访问，则需要在vector与list间做个折中。<br />
&nbsp;&nbsp;&nbsp; f、当要存储的是大型负责类对象时，list要优于vector；当然这时候也可以用vector来存储指向对象的指针，同样会取得较高的效率，但是指针的维护非常容易出错，因此不推荐使用。<br />
<br />
5、capacity V.S size<br />
&nbsp;&nbsp;&nbsp; a、capacity是容器需要增长之前，能够盛的元素总数；只有连续存储的容器才有capacity的概念（例如vector，deque，string），list不需要capacity。<br />
&nbsp;&nbsp;&nbsp; b、size是容器当前存储的元素的数目。<br />
&nbsp;&nbsp;&nbsp; c、vector默认的容量初始值，以及增长规则是依赖于编译器的。<br />
<br />
6、用vector存储自定义类对象时，自定义类对象须满足：<br />
&nbsp;&nbsp;&nbsp; a、有可供调用的无参构造函数（默认的或自定义的）；<br />
&nbsp;&nbsp;&nbsp; b、有可用的拷贝赋值函数（默认的或自定义的）<br />
<br />
7、迭代器iterator <br />
&nbsp;&nbsp;&nbsp; a、vector与deque的迭代器支持算术运算，list的迭代器只能进行++/--操作，不支持普通的算术运算。</span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-12 13:54 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++  c_str()函数</title><link>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328655.html</link><dc:creator>幻海蓝梦</dc:creator><author>幻海蓝梦</author><pubDate>Thu, 12 Aug 2010 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328655.html</guid><wfw:comment>http://www.blogjava.net/jasmine214--love/comments/328655.html</wfw:comment><comments>http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jasmine214--love/comments/commentRss/328655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jasmine214--love/services/trackbacks/328655.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">&nbsp; 原文：<font face="宋体">http://www.dnbcw.com/biancheng/c/fldh74939.html</font></span>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 9pt">1.string</span><span style="font-family: 宋体; font-size: 9pt">类成员函数c_str()的原型:</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *c_str()const;//</span><span style="font-family: 宋体; font-size: 9pt">返回一个以null终止的c字符串</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 9pt">2.<span style="color: #548dd4">c_str()</span></span><span style="font-family: 宋体; color: #548dd4; font-size: 9pt">函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式;</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 9pt">3.</span><span style="font-family: 宋体; font-size: 9pt">操作c_str()函数的返回值时,只能使用c字符串的操作函数,如:strcpy()等函数.因为,string对象可能在使用后被析构函数释放掉,那么你所指向的内容就具有不确定性.</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 9pt"><span style="font-size: 10pt">eg:</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 9pt"><span style="font-size: 10pt">char&nbsp; * name[20];</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-family: 宋体; font-size: 9pt"><span style="font-size: 10pt">string&nbsp; ptr = "tongnono";</span></span></p>
<p style="text-align: left; line-height: 15pt" class="MsoNormal" align="left"><span style="font-size: 10pt"><span style="font-family: 宋体; font-size: 9pt">strcpy(name,ptr.c_str());//c_str()</span><span style="font-family: 宋体; font-size: 9pt">返回的是一个临时的指针变量,不能对其操作.</span></span></p>
<img src ="http://www.blogjava.net/jasmine214--love/aggbug/328655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jasmine214--love/" target="_blank">幻海蓝梦</a> 2010-08-12 13:35 <a href="http://www.blogjava.net/jasmine214--love/archive/2010/08/12/328655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>