﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-乔栋的佛国-随笔分类-C++的健身房</title><link>http://www.cppblog.com/qiaodong/category/2993.html</link><description>耶路撒冷对你来说意味着什么？</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 07:17:19 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 07:17:19 GMT</pubDate><ttl>60</ttl><item><title>Cstring and char *</title><link>http://www.cppblog.com/qiaodong/archive/2007/08/03/29310.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Fri, 03 Aug 2007 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/08/03/29310.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/29310.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/08/03/29310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/29310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/29310.html</trackback:ping><description><![CDATA[char*转换成CString &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 若将char*转换成CString，除了直接赋值外，还可使用CString::format进行。例如： &nbsp; <br>&nbsp; char &nbsp; chArray[] &nbsp; = &nbsp; "This &nbsp; is &nbsp; a &nbsp; test"; &nbsp; <br>&nbsp; char &nbsp; * &nbsp; p &nbsp; = &nbsp; "This &nbsp; is &nbsp; a &nbsp; test"; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 或 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; LPSTR &nbsp; p &nbsp; = &nbsp; "This &nbsp; is &nbsp; a &nbsp; test"; &nbsp; 或在已定义Unicode应的用程序中 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; TCHAR &nbsp; * &nbsp; p &nbsp; = &nbsp; _T("This &nbsp; is &nbsp; a &nbsp; test"); &nbsp; 或 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; LPTSTR &nbsp; p &nbsp; = &nbsp; _T("This &nbsp; is &nbsp; a &nbsp; test"); &nbsp; <br>&nbsp; CString &nbsp; theString &nbsp; = &nbsp; chArray; &nbsp; <br>&nbsp; theString.format(_T("%s"), &nbsp; chArray); &nbsp; <br>&nbsp; theString &nbsp; = &nbsp; p; &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 2、CString转换成char* &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 若将CString类转换成char*(LPSTR)类型，常常使用下列三种方法： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 方法一，使用强制转换。例如： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; CString &nbsp; theString( &nbsp; "This &nbsp; is &nbsp; a &nbsp; test" &nbsp; ); &nbsp; <br>&nbsp; LPTSTR &nbsp; lpsz &nbsp; =(LPTSTR)(LPCTSTR)theString; &nbsp; 方法二，使用strcpy。例如： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; CString &nbsp; theString( &nbsp; "This &nbsp; is &nbsp; a &nbsp; test" &nbsp; ); &nbsp; <br>&nbsp; LPTSTR &nbsp; lpsz &nbsp; = &nbsp; new &nbsp; TCHAR[theString.GetLength()+1]; &nbsp; <br>&nbsp; _tcscpy(lpsz, &nbsp; theString); &nbsp; 需要说明的是，strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 &nbsp; const &nbsp; wchar_t* &nbsp; (Unicode)或const &nbsp; char* &nbsp; (ANSI)，系统编译器将会自动对其进行转换。 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 方法三，使用CString::GetBuffer。例如： &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; CString &nbsp; s(_T("This &nbsp; is &nbsp; a &nbsp; test &nbsp; ")); &nbsp; <br>&nbsp; LPTSTR &nbsp; p &nbsp; = &nbsp; s.GetBuffer(); &nbsp; <br>&nbsp; // &nbsp; 在这里添加使用p的代码 &nbsp; <br>&nbsp; if(p &nbsp; != &nbsp; NULL) &nbsp; *p &nbsp; = &nbsp; _T('\0'); &nbsp; <br>&nbsp; s.ReleaseBuffer(); &nbsp; // &nbsp; 使用完后及时释放，以便能使用其它的CString成员函数&nbsp;&nbsp; <br>
<img src ="http://www.cppblog.com/qiaodong/aggbug/29310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-08-03 17:05 <a href="http://www.cppblog.com/qiaodong/archive/2007/08/03/29310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket 初始化</title><link>http://www.cppblog.com/qiaodong/archive/2007/07/22/28582.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Sun, 22 Jul 2007 12:56:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/07/22/28582.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/28582.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/07/22/28582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/28582.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/28582.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;wVersionRequested&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;MAKEWORD(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;WSADATA&nbsp;&nbsp;&nbsp;wsaData;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;err&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;WSAStartup(wVersionRequested,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">wsaData);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;(err&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img id=Codehighlighter1_179_205_Open_Image onclick="this.style.display='none'; Codehighlighter1_179_205_Open_Text.style.display='none'; Codehighlighter1_179_205_Closed_Image.style.display='inline'; Codehighlighter1_179_205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_179_205_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_179_205_Closed_Text.style.display='none'; Codehighlighter1_179_205_Open_Image.style.display='inline'; Codehighlighter1_179_205_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_179_205_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_179_205_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;WSACleanup();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
<img src ="http://www.cppblog.com/qiaodong/aggbug/28582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-07-22 20:56 <a href="http://www.cppblog.com/qiaodong/archive/2007/07/22/28582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获得控件内容</title><link>http://www.cppblog.com/qiaodong/archive/2007/06/04/25528.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 04 Jun 2007 15:18:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/06/04/25528.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/25528.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/06/04/25528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/25528.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/25528.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Edit</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">输入框</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.(CWnd&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_EDIT_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetWindowText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">GetDlgItemInt(IDC_EDIT_1,&nbsp;&nbsp;&nbsp;NULL,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.(CWnd&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_EDIT_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(cs);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;Combox</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">下拉框</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.((CComboBox&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_COMB_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetCurSel(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.&nbsp;&nbsp;&nbsp;GetDlgItemText(IDC_COMB_1,&nbsp;&nbsp;&nbsp;cs,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">m_COM.GetCurSel();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_COM.GetLBText(i,cs);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">.m_COM.AddString(cs);m_COM.DeleteString(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);m_COM.SetCurSel(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;Radio</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">单选按钮</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.((CButton&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_RADIO_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetCheck(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_676_677_Open_Image onclick="this.style.display='none'; Codehighlighter1_676_677_Open_Text.style.display='none'; Codehighlighter1_676_677_Closed_Image.style.display='inline'; Codehighlighter1_676_677_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_676_677_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_676_677_Closed_Text.style.display='none'; Codehighlighter1_676_677_Open_Image.style.display='inline'; Codehighlighter1_676_677_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;(((CButton&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_RADIO_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetCheck())&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_676_677_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_676_677_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.((CButton&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_RADIO_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetCheck(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;List&nbsp;&nbsp;&nbsp;Control</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">列表</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">LVS_EX_GRIDLINES);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_list2.InsertColumn(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TagID</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,LVCFMT_LEFT,</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_list2.InsertColumn(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TagType</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,LVCFMT_CENTER,</span><span style="COLOR: #000000">120</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_list2.InsertItem(i,cs1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_list2.SetItemText(i,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,cs2);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_list2.GetSelectedItem()</span><span style="COLOR: #000000">!=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_1122_1230_Open_Image onclick="this.style.display='none'; Codehighlighter1_1122_1230_Open_Text.style.display='none'; Codehighlighter1_1122_1230_Closed_Image.style.display='inline'; Codehighlighter1_1122_1230_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1122_1230_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1122_1230_Closed_Text.style.display='none'; Codehighlighter1_1122_1230_Open_Image.style.display='inline'; Codehighlighter1_1122_1230_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1122_1230_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1122_1230_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">m_list2.GetSelectionMark();&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cs</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">m_list2.GetItemText(i,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">m_List2.GetItemCount();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">.m_list2.DeleteItem(i);m_list2.DeleteAllItems();&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;ListBox</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">列表框</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.((CListBox&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)listBox)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">InsertString(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;&nbsp;&nbsp;str);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;Button</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">按钮</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">.((CWnd&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_BUTTON_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ShowWindow(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">.((CWnd&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetDlgItem(IDC_BUTTON_1))</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">EnableWindow(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<img src ="http://www.cppblog.com/qiaodong/aggbug/25528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-06-04 23:18 <a href="http://www.cppblog.com/qiaodong/archive/2007/06/04/25528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将资源打成DLL</title><link>http://www.cppblog.com/qiaodong/archive/2007/04/24/22712.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Tue, 24 Apr 2007 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/04/24/22712.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/22712.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/04/24/22712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/22712.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/22712.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1&nbsp;&nbsp;1&nbsp;//&nbsp;&nbsp;&nbsp;UseResourceDllView.cpp&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;implementation&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;CUseResourceDllView&nbsp;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/qiaodong/archive/2007/04/24/22712.html'>阅读全文</a><img src ="http://www.cppblog.com/qiaodong/aggbug/22712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-04-24 12:00 <a href="http://www.cppblog.com/qiaodong/archive/2007/04/24/22712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中动态添加控件</title><link>http://www.cppblog.com/qiaodong/archive/2007/04/23/22640.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 23 Apr 2007 06:44:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/04/23/22640.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/22640.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/04/23/22640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/22640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/22640.html</trackback:ping><description><![CDATA[<strong>动态控件是指在需要时由Create()创建的控件，这与预先在对话框中放置的控件是不同的。 <br><br>　　一、创建动态控件：<br><br>　　为了对照，我们先来看一下静态控件的创建。<br><br>　　放置静态控件时必须先建立一个容器，一般是对话框，这时我们在对话框编辑窗口中，从工具窗口中拖出所需控件放在对话框中即可，再适当修改控件ID，设置控件属性，一个静态控件就创建好了，当对话框被显示时，其上的控件也会显示。<br><br>　　静态控件不需要调用Create()函数来创建。<br><br>　　而创建动态控件有很大不同，以下以按钮为例，看一下动态控件的创建过程：<br><br>　　1.建立控件ID号：<br><br>　　ID号是控件的标识，创建控件前必须先为它设置一个ID号。<br><br>　　打开资源中的&#8220;String Table&#8221;，在空白行上双击鼠标，这时会弹出一个ID属性对话框，在其中的ID编辑框中输入ID，如：IDC_MYBUTTON，在Caption中输入控件标题或注解（注：Caption框不能为空，为空会导致创建失败），这里我输入的是按钮上要显示的文字--动态按钮。<br><br>　　2.建立控件对象：<br><br>　　不同种类的控件应创建不同的类对象：<br><br>　　&#183;按钮控件 CButton （包括普通按钮、单选按钮和复选按钮）<br>　　&#183;编辑控件 CEdit<br>　　&#183;静态文本控件 CStatic<br>　　&#183;标签控件 CTabCtrl<br>　　&#183;旋转控件 CSpinButtonCtrl<br>　　&#183;滑标控件 CSliderCtrl<br>　　&#183;多信息编辑控件 CRichEditCtrl<br>　　&#183;进度条控件 CProgressCtrl<br>　　&#183;滚动条控件 CSrcollBar<br>　　&#183;组合框控件 CComboBox<br>　　&#183;列表框控件 CListBox<br>　　&#183;图像列表控件 CImageCtrl<br>　　&#183;树状控件 CTreeCtrl<br>　　&#183;动画控件 CAnimateCtrl<br><br>　　本例中我们创建一个CButton类的普通按钮。注意不能直接定义CButton对象，如：CButton m_MyBut;这种定义只能用来给静态控件定义控制变量，不能用于动态控件。<br><br>　　正确做法是用new调用CButton构造函数生成一个实例：<br><br></strong>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CButton *p_MyBut = new CButton();</td>
        </tr>
    </tbody>
</table>
<br>　　然后用CButton类的Create()函数创建，该函数原型如下：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT&amp; rect, CWnd* pParentWnd, UINT nID );</td>
        </tr>
    </tbody>
</table>
<br>　　lpszCaption是按钮上显示的文本；dwStyle指定按钮风格，可以是按钮风格与窗口风格的组合，取值有：<br><br>　　窗口风格：<br><br>　　&#183;WS_CHILD 子窗口，必须有<br>　　&#183;WS_VISIBLE 窗口可见，一般都有<br>　　&#183;WS_DISABLED 禁用窗口，创建初始状态为灰色不可用的按钮时使用<br>　　&#183;WS_TABSTOP 可用Tab键选择<br>　　&#183;WS_GROUP 成组，用于成组的单选按钮中的第一个按钮<br><br>　　按钮风格：<br><br>　　&#183;BS_PUSHBUTTON 下压式按钮，也即普通按钮<br>　　&#183;BS_AUTORADIOBUTTON 含自动选中状态的单选按钮<br>　　&#183;BS_RADIOBUTTON 单选按钮，不常用<br>　　&#183;BS_AUTOCHECKBOX 含自动选中状态的复选按钮<br>　　&#183;BS_CHECKBOX 复选按钮，不常用<br>　　&#183;BS_AUTO3STATE 含自动选中状态的三态复选按钮<br>　　&#183;BS_3STATE 三态复选按钮，不常用<br>　<br>　　以上风格指定了创建的按钮类型，不能同时使用，但必须有其一。<br><br>　　&#183;BS_BITMAP 按钮上将显示位图<br>　　&#183;BS_DEFPUSHBUTTON 设置为默认按钮，只用于下压式按钮，一个对话框中只能指定一个默认按钮<br>　　&#183;rect指定按钮的大小和位置；<br>　　&#183;pParentWnd指示拥有按钮的父窗口，不能为NULL；<br>　　&#183;nID指定与按钮关联的ID号，用上一步创建的ID号。<br><br>　　不同控件类的Create()函数略有不同，可参考相关资料。<br><br>　　例：p_MyBut-&gt;Create( "动态按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );<br>这样，我们就在当前对话框中的(20,10)处创建了宽60，高30，按钮文字为&#8220;动态按钮&#8221;的下压式按钮。<br><br>　　为了使创建过程更方便易用，我定义了如下函数：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle)<br>{<br>CString m_Caption;<br>m_Caption.LoadString( nID ); //取按钮标题<br>CButton *p_Button = new CButton();<br>ASSERT_VALID(p_Button);<br>p_Button-&gt;Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //创建按钮<br>return p_Button;<br>} </td>
        </tr>
    </tbody>
</table>
<br>　　其中m_Caption.LoadString( nID )是从字符串表中读取按钮文本，这样在创建按钮ID时，应该把文本设置好，参数nStyle为除必须风格外的额外风格。<br><br>　　以下，我调用该函数创建三个按钮，并指定第一个按钮为默认按钮，按钮的ID已预先设置好了：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CButton *p_MyBut[3];<br>p_MyBut[0] = NewMyButton( ID_MYBUT1, CRect(10,20,50,35), BS_DEFPUSHBUTTON );<br>p_MyBut[1] = NewMyButton( ID_MYBUT2, CRect(55,20,95,35), 0 );<br>p_MyBut[2] = NewMyButton( ID_MYBUT3, CRect(100,20,140,35), 0 ); </td>
        </tr>
    </tbody>
</table>
<br>　　<strong>二、动态控件的响应</strong>：<br><br>　　动态控件的响应函数不能用ClassWizard添加，只能手动添加。仍以上面的按钮为例，我们制作按钮的单击响应函数。<br><br>　　1.在MESSAGE_MAP中添加响应函数：<br><br>　　MESSAGE_MAP表中定义了消息响应函数，其格式为：消息名(ID,函数名)，当我们用ClassWizard添加函数时，会自动添加在AFX_MSG_MAP括起的区间内，如：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)<br>//{{AFX_MSG_MAP(CTextEditorView)<br>ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)<br>//}}AFX_MSG_MAP<br>END_MESSAGE_MAP() </td>
        </tr>
    </tbody>
</table>
　<br>　　手工添加时不要添加到AFX_MSG_MAP区间内，以防ClassWizard不能正常工作，如： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)<br>//{{AFX_MSG_MAP(CTextEditorView)<br>ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)<br>//}}AFX_MSG_MAP<br>ON_BN_CLICKED(ID_MYBUT1, OnMybut1)<br>ON_BN_CLICKED(ID_MYBUT2, OnMybut2)<br>ON_BN_CLICKED(ID_MYBUT3, OnMybut3)<br>END_MESSAGE_MAP() </td>
        </tr>
    </tbody>
</table>
<br>　　其中ON_BN_CLICKED是按钮单击消息。<br><br>　　2.在头文件中添加函数定义：<br><br>　　用ClassWizard添加函数时，会在头文件的AFX_MSG区间内添加函数定义，如： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>protected:<br>//{{AFX_MSG(CTextEditorView)<br>afx_msg void OnIconbut0();<br>//}}AFX_MSG<br>DECLARE_MESSAGE_MAP() </td>
        </tr>
    </tbody>
</table>
<br>　　我们模仿这种形式，只是把函数定义添加到AFX_MSG区间外就行了：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>protected:<br>//{{AFX_MSG(CTextEditorView)<br>afx_msg void OnIconbut0();<br>//}}AFX_MSG<br>afx_msg void OnMybut1();<br>afx_msg void OnMybut2();<br>afx_msg void OnMybut3();<br>DECLARE_MESSAGE_MAP() </td>
        </tr>
    </tbody>
</table>
<br>　　3.编写消息响应函数：<br><br>　　以上是把消息和函数关联起来了，具体在单击按钮后应做的工作在函数中完成： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>void CTextEditorView::OnMybut1()<br>{<br>MessageBox( "哈！你单击了动态按钮。" );<br>}<br>void CTextEditorView::OnMybut2()<br>{<br>&#8230;&#8230;<br>}<br>void CTextEditorView::OnMybut3()<br>{<br>&#8230;&#8230;<br>} </td>
        </tr>
    </tbody>
</table>
<br>　　除了按钮的响应函数外，你还可以用上面获得的指针访问按钮，如：<br><br>　　修改按钮的大小和位置：p_MyBut[0]-&gt;MoveWindow(&#8230;&#8230;);<br><br>　　修改按钮文本：p_MyBut[0]-&gt;SetWindowText(&#8230;&#8230;);<br><br>　　显示/隐藏按钮：p_MyBut[0]-&gt;ShowWindow(&#8230;&#8230;);等等。<br>三、回收资源：<br><br>　　由于动态控件对象是由new生成的，它不会被程序自动释放，所以需手工释放。在控件不再使用时可以删除它：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>if( p_MyBut[0] )<br>delete p_MyBut[0]; </td>
        </tr>
    </tbody>
</table>
<br>　　以上就是按钮控件动态生成的方法。下面，再看一下单选按钮的动态生成问题。 四、实例：单选按钮组的动态生成<br><br>　　单选按钮也属于CButton类，但由于单选按钮总是成组使用的，所以它在制作和使用上与普通按钮有一定区别。<br><br>　　假设有三个单选按钮组成一组，初始时，第一个单选按钮处于选中状态。<br><br>　　我们先来看静态制作方法：在对话框中放置三个单选按钮，设置属性如下：<br><br>　　&#183;Radio1属性：Visible、Group、Tab stop、Auto<br>　　&#183;Radio2属性：Visible、Tab stop、Auto<br>　　&#183;Radio3属性：Visible、Tab stop、Auto<br><br>　　这样的属性设置就把三个单选按钮分成了一组，它们一次只能有一个被选中，若对话框中还有其它成组的单选按钮，使用时也会互不干扰。但这时还没有使第一个按钮处于选中状态。<br><br>　　接着就用ClassWizard为这组单选按钮添加变量，这里只需为第一个单选按钮添加变量即可。设变量名为m_Radio，类型选为int型。在构造函数中ClassWizard把m_Radio的值设置为-1，我们把它改为0，这样在运行程序时可以看到第一个单选按钮处于选中状态了。之后，还应该用ClassWizard为三个单选按钮添加单击响应函数，在里面修改m_Radio的值对应三个单选按钮就可以了。<br><br>　　以上就是通常制作单选按钮组的办法，现我们欲改为动态生成，主要要解决按钮分组和单击控制问题。以下为制作步骤：<br><br>　　1.定义三个单选按钮的ID：<br><br>　　打开资源中的&#8220;String Table&#8221;，在其中添加三个ID值：<br><br>　　&#183;第一个：ID为IDC_MYRADIO1，Caption为单选1<br>　　&#183;第二个：ID为IDC_MYRADIO2，Caption为单选2<br>　　&#183;第三个：ID为IDC_MYRADIO3，Caption为单选3<br><br>　　其中Caption为按钮上要显示的文字，可根据需要设置。<br><br>　　2.用CButton类的Create()函数生成三个单选按钮：<br><br>　　为方便起见，先定义一个函数生成单选按钮： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CButton* CTextEditorView::NewMyRadio(int nID,CRect rect,int nStyle)<br>{<br>　CString m_Caption;<br>　m_Caption.LoadString( nID ); //取按钮标题<br>　CButton *p_Radio = new CButton();<br>　ASSERT_VALID(p_Radio);<br>　p_Radio-&gt;Create( m_Caption, WS_CHILD | WS_VISIBLE | nStyle | WS_TABSTOP | BS_AUTORADIOBUTTON, rect, this, nID ); //创建按钮<br>　return p_Radio;<br>} </td>
        </tr>
    </tbody>
</table>
<br>　　函数LoadString()用于从&#8220;String Table&#8221;中读取按钮文本，Create()函数中设定了单选按钮必须的属性，其中就包括了Visible、Tab stop、Auto属性。<br><br>　　参数nID为单选按钮ID号，rect为单选按钮尺寸，nStyle为除必要属性外的其它属性。返回值为指向新建按钮的指针。<br><br>　　有了这个函数后，创建单选按钮组时只要依次调用该函数即可，其中单选按钮组的第一个单选按钮必须指定WS_GROUP属性。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CButton *p_MyRadio[3];<br>p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP );<br>p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 );<br>p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 ); </td>
        </tr>
    </tbody>
</table>
<br>　　3.定义单选按钮组的控制变量，设置第一个单选按钮为选中状态：<br><br>　　这里不能用ClassWizard添加变量，也不要在DoDataExchange()中添加控制变量，因为动态控件一开始并不存在，在DoDataExchange()中添加控制变量会造成运行错误。这里我们只需在头文件中随意定义一个int型变量作为控制变量即可，如：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>int m_SelRadio;</td>
        </tr>
    </tbody>
</table>
<br>　　在构造函数中设置其初值为0：m_SelRadio = 0;<br><br>　　在上面的创建按钮的语句中，用SetCheck()函数设置初始选中的按钮：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CButton *p_MyRadio[3];<br>p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP );<br>p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 );<br>p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 );<br>p_MyRadio[m_SelRadio]-&gt;SetCheck(1); //设置第一个单选为选中状态 </td>
        </tr>
    </tbody>
</table>
<br>　　在SetCheck()函数中，参数为1表示设置为选中状态，为0表示未选中状态。<br><br>　　4.添加鼠标单击响应函数：<br><br>　　鼠标单击某单选按钮后，其状态已经能自动改变，这里我们还需修改控制变量m_SelRadio的值，以便跟踪选中的单选按钮。<br><br>　　首先在MESSAGE_MAP中把鼠标单击消息与响应函数联系起来： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)<br>//{{AFX_MSG_MAP(CTextEditorView)<br>ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) //ClassWizard在此处添加<br>//}}AFX_MSG_MAP<br>ON_BN_CLICKED(IDC_MYRADIO1, OnMyRadio1) //单选按钮1<br>ON_BN_CLICKED(IDC_MYRADIO2, OnMyRadio2) //单选按钮2<br>ON_BN_CLICKED(IDC_MYRADIO3, OnMyRadio3) //单选按钮3<br>END_MESSAGE_MAP() </td>
        </tr>
    </tbody>
</table>
<br>　　然后在头文件的MESSAGE_MAP中定义单击函数：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>protected:<br>//{{AFX_MSG(CTextEditorView)<br>afx_msg void OnIconbut0(); //ClassWizard在此处添加<br>//}}AFX_MSG<br>afx_msg void OnMyRadio1(); //单选按钮1<br>afx_msg void OnMyRadio2(); //单选按钮2<br>afx_msg void OnMyRadio3(); //单选按钮3<br>DECLARE_MESSAGE_MAP() </td>
        </tr>
    </tbody>
</table>
<br>　　这里注意不要把函数加在AFX_MSG区间内，以防影响ClassWizard的使用。<br><br>　　定义具体的响应函数（这里是用手工加入的，不是用ClassWizard加入的）：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>//单击单选按钮1 void CTextEditorView::OnMyRadio1() <br>{<br>m_SelRadio=0;<br>} <br><br>//单击单选按钮2 void CTextEditorView::OnMyRadio2() <br>{<br>m_SelRadio=1;<br>} <br><br>//单击单选按钮3 void CTextEditorView::OnMyRadio3() <br>{<br>m_SelRadio=2;<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　5.回收资源：<br><br>　　在析构函数中，回收创建的单选按钮（也可以在不使用单选按钮时立即回收）：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>CTextEditorView::~CTextEditorView()<br>{<br>int i;<br>for( i=0; i&lt;3; i++)<br>{<br>if(p_MyRadio[i])<br>delete p_MyRadio[i];<br>}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　以上就是动态控件的生成和响应方法，各种不同的控件做法略有不同，但思路和步骤都是类似的，希望以上实例对你能够有所帮助。 <br><br><br><br><br>
<img src ="http://www.cppblog.com/qiaodong/aggbug/22640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-04-23 14:44 <a href="http://www.cppblog.com/qiaodong/archive/2007/04/23/22640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用ITaskbarList接口操纵Windows任务栏程序按钮的状态 </title><link>http://www.cppblog.com/qiaodong/archive/2007/04/22/22606.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Sun, 22 Apr 2007 14:45:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/04/22/22606.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/22606.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/04/22/22606.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/22606.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/22606.html</trackback:ping><description><![CDATA[<p><font face="Courier New" size=1>class CXDlg : public CDialog<br>{<br>&nbsp;&nbsp;&nbsp; ......<br>&nbsp;&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef ITaskbarList *LPITaskbarList;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPITaskbarList pTaskbar;<br>&nbsp;&nbsp;&nbsp; ......<br>};</font></p>
<p><strong><u><font color=#008000 size=2>Step 2: 初始化 任务栏COM 对象</font></u></strong></p>
<p><font face="Courier New" size=1>BOOL CXDlg::OnInitDialog()<br>{<br>&nbsp;&nbsp;&nbsp; ......<br>&nbsp;&nbsp;&nbsp; // Initializes the Component Object Model(COM)<br>&nbsp;&nbsp;&nbsp; CoInitialize(0);<br>&nbsp;&nbsp;&nbsp; // We call below function since we only need to create one object<br>&nbsp;&nbsp;&nbsp; CoCreateInstance(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLSID_TaskbarList,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLSCTX_INPROC_SERVER,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IID_ITaskbarList,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (void**)&amp;pTaskbar<br>&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp; // Below function will initialize the taskbar list object<br>&nbsp;&nbsp;&nbsp; pTaskbar-&gt;HrInit();<br>&nbsp;&nbsp;&nbsp; ......<br>}</font></p>
<p><font color=#008000 size=2><strong><u>Step 3: 使用：删除/显示 任务栏程序按钮</u></strong></font></p>
<p><font face="Courier New" size=1>void CXDlg::OnBnClickedButtonHide()<br>{<br>&nbsp;&nbsp;&nbsp; pTaskbar-&gt;DeleteTab(this-&gt;GetSafeHwnd());<br>}</font></p>
<p><font face="Courier New" size=1>void CXDlg::OnBnClickedButtonShow()<br>{<br>&nbsp;&nbsp;&nbsp; pTaskbar-&gt;AddTab(this-&gt;GetSafeHwnd());<br>}</font></p>
<br><br><br>
<img src ="http://www.cppblog.com/qiaodong/aggbug/22606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-04-22 22:45 <a href="http://www.cppblog.com/qiaodong/archive/2007/04/22/22606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用程序从任务管理器中消失</title><link>http://www.cppblog.com/qiaodong/archive/2007/04/09/21533.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 09 Apr 2007 06:51:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/04/09/21533.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/21533.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/04/09/21533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/21533.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/21533.html</trackback:ping><description><![CDATA[[问题]<br>通常我们按下CTRL+ATL+DEL组合键后，可以看到正在运行的程序或者进程，有没有办法让程序从CTRL+ATL+DEL消失掉呢？也就是说让正在运行的程序对CTRL+ATL+DEL不可见。<br>[解答]<br>答案是肯定的，办法如下：<br>使用Win32 API 函数RegisterServiceProcess，但是这个API函数的文档你是很难找到的。这里我们要用一下汇编。<br><br>#include &lt;windows.h&gt;<br><br>HINSTANCE hLibrary;<br>void *regproc;<br><br>void CADInit(void);<br>void HideApp(void);<br>void ShowApp(void);<br>void CADClean(void);<br><br>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)<br>{<br>&nbsp;&nbsp;CADInit(); //加载 DLL 并创建一指向它指针<br>&nbsp;&nbsp;HideApp(); //隐藏程序<br>&nbsp;&nbsp;//ShowApp(); //显示程序<br><br>&nbsp;&nbsp;//其他处理或调用<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;CADClean(); //卸载 DLL<br>&nbsp;&nbsp;return 0; //retrun 0 因为没有进入消息循环<br>}<br><br>void CADInit(void)<br>{<br>&nbsp;&nbsp;//加载 kernel32.dll<br>&nbsp;&nbsp;hLibrary = LoadLibrary("kernel32.dll");<br>&nbsp;&nbsp;//获取函数RegisterServiceProcess的地址<br>&nbsp;&nbsp;regproc = GetProcAddress(hLibrary, "RegisterServiceProcess");<br>}<br><br>void HideApp(void)<br>{<br>&nbsp;&nbsp;//实现程序的隐藏<br>&nbsp;&nbsp;__asm<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp; push 1<br>&nbsp;&nbsp; push 0<br>&nbsp;&nbsp; call regproc<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return;<br>}<br><br>void ShowApp(void)<br>{<br>&nbsp;&nbsp;//恢复状态<br>&nbsp;&nbsp;__asm<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call regproc<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return;<br>}<br><br>void CADClean(void)<br>{<br>&nbsp;&nbsp;//卸载 DLL<br>&nbsp;&nbsp;FreeLibrary(hLibrary);<br>&nbsp;&nbsp;return;<br>}<br>本程序在W2K和Win9x测试通过。 
<img src ="http://www.cppblog.com/qiaodong/aggbug/21533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-04-09 14:51 <a href="http://www.cppblog.com/qiaodong/archive/2007/04/09/21533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ON_NOTIFY 消息</title><link>http://www.cppblog.com/qiaodong/archive/2007/04/09/21513.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 09 Apr 2007 02:12:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/04/09/21513.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/21513.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/04/09/21513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/21513.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/21513.html</trackback:ping><description><![CDATA[<h1><span style="COLOR: #3366ff">问题:<br><em>对button，我直接用WM_COMMAND是可以的。&nbsp;现在我想尝试使用VC的ON_NOTIFY，怎么试也不起作用。<br><br>解答:<br></em>ON_NOTIFY是针对WM_NOTIFY的消息宏，而WM_NOTIFY是针对&nbsp;<br>ListCtrl,TreeCtrl,TabCtrl等通用控件使用的消息&nbsp;<br>button，listbox等基本控件是不会用到这个消息的&nbsp;.<br></span></h1>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/21513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-04-09 10:12 <a href="http://www.cppblog.com/qiaodong/archive/2007/04/09/21513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中使用map来定位错误代码</title><link>http://www.cppblog.com/qiaodong/archive/2007/03/26/20592.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 26 Mar 2007 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/03/26/20592.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/20592.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/03/26/20592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/20592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/20592.html</trackback:ping><description><![CDATA[
		<span class="content">作为程序员，平时最担心见到的事情就是程序发生了崩溃，无论是指针越界还是非法操作，都将给我们的应用系统造成巨大的损失。但在一个大型系统的测试过程中，初期出现程序崩溃似乎成了不可避免的事。其实测试中出现程序崩溃并不可怕，反而是测试的成功。我们更为关心的是程序中的哪一行导致了系统崩溃，这样我们才能有针对性的进行改正。<br />　　在VC中，我们可以利用出现程序崩溃时VC的自动跳转，定位到出错代码行。但在大量的压力测试时，尤其是多线程测试时，同时出现几十个错，这时VC本身的出错跳转往往会失灵。<br />　　在这里我们介绍一种辅助查找程序崩溃代码行的好方法，它的核心就是利用编译时生成MAP文件中的信息来定位代码行。<br />下面就开始我们的介绍。<br />　　首先我们必须生成程序的MAP文件。那么什么是 MAP 文件呢？简单地讲， MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法，是整个程序工程信息的静态文本。它可以在任何地方、任何时候使用，不需要有额外的程序进行支持，仅仅通过一个文本阅读工具如Ultra Edit就可以打开了。而且，这是唯一能找出程序崩溃代码行的救星。<br />　　那么我们应该如何生成MAP文件呢？在 VC 中，我们可以按下 Alt+F7，打开“Project Settings”选项页，选择 C/C++ 选项卡，并在最下面的 Project Options 里面输入：/Zd ，然后要选择 Link 选项卡，选中“Generate mapfile”复选框，并在最下面的 Project Options 里面输入：/mapinfo:lines，表示生成 MAP 文件时，加入行信息。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件，此时可以在工程的Debug目录下找到刚刚生成的MAP文件，文件名为“工程名.map”。<br />　　通过上面的步骤，已经得到了 MAP 文件，那么我们该如何利用它呢？让我们从一个简单的实例入手，一步一步演示使用MAP文件定位程序崩溃行的过程。<br />首先假设我们的VC工程中有下面这个文件：<br />//*****************************************************<br />// 程序名称：演示如何通过崩溃地址找出源代码的出错行<br />// 作者：刘可<br />// 日期：2003-6-19<br />// 本程序会产生“除0错误”，所以会导致<br />// 程序崩溃，弹出“非法操作”对话框。<br />//******************************************************<br />#include<br /><br />int crashtest(int a,int b)<br />{<br />int c;<br />c = a/b;<br />return c;<br />}<br /><br />void main(void)<br />{<br />int a = 30;<br />int b = 0;<br />int ret;<br />printf("let's begin crash test...\n");<br />ret = crashtest(a,b);<br />}<br /><br />很显然本程序有“除0错误”，在 Debug 方式下编译，运行时会产生“非法操作”。我们记录下产生崩溃的地址——在我的机器上是 0x0040102f 。这个在不同的机器上可能地址不同，但记下这个地址我们下面将要使用。<br />我们打开它的 MAP 文件：（这里列出我们比较关心的内容，其他的就略过了）<br /><br />abort（工程名）<br /><br />Timestamp is 3ef16533 (Thu Jun 19 15:24:35 2003)<br /><br />Preferred load address is 00400000<br /><br />Start　　　　Length　　　　Name　　　　　　　　Class<br />0001:00000000　0001081dH .text　　　　　　　　CODE<br />0002:00000000　000013baH .rdata 　　　　　　　DATA<br />0002:000013ba　00000000H .edata　　　　　　　　DATA<br />0003:00000000　00000104H .CRT$XCA　　　　　　　DATA<br />0003:00000104　00000104H .CRT$XCZ　　　　　　　DATA<br />0003:00000208　00000104H .CRT$XIA　　　　　　　DATA<br />0003:0000030c　00000109H .CRT$XIC　　　　　　　DATA<br />0003:00000418　00000104H .CRT$XIZ　　　　　　　DATA<br />0003:0000051c　00000104H .CRT$XPA　　　　　　　DATA<br />0003:00000620　00000104H .CRT$XPX　　　　　　　DATA<br />0003:00000724　00000104H .CRT$XPZ　　　　　　　DATA<br />0003:00000828 　00000104H .CRT$XTA　　　　　　　DATA<br />0003:0000092c　 00000104H .CRT$XTZ　　　　　　　DATA<br />0003:00000a30 　00003236H .data 　　　　　　　DATA<br />0003:00003c68 　000019c8H .bss 　　　　　　　DATA<br />0004:00000000 　00000014H .idata$2　　　　　　　DATA<br />0004:00000014 　00000014H .idata$3　　　　　　　DATA<br />0004:00000028 　00000120H .idata$　　　　　　　DATA<br />0004:00000148 　00000120H .idata$5 　　　　　　　DATA<br />0004:00000268 　000004f4H .idata$6　　　　　　　DATA<br /><br />Address Publics by Value Rva+Base Lib:Object<br /><br />0001:00000020 ?crashtest@@YAHHH@Z 00401020 f main.obj<br />0001:0000003c _main 0040103c f main.obj<br />0001:000000b0 _printf 004010b0 f LIBCD:printf.obj<br />0001:00000130 __chkesp 00401130 f LIBCD:chkesp.obj<br />0001:00000170 _mainCRTStartup 00401170 f LIBCD:crt0.obj<br />0001:000002a0 __amsg_exit 004012a0 f LIBCD:crt0.obj<br />0001:00000300 __stbuf 00401300 f LIBCD:_sftbuf.obj<br />0001:00000460 __ftbuf 00401460 f LIBCD:_sftbuf.obj<br />0001:00000520 __output 00401520 f LIBCD:output.obj<br />0001:000013c0 ___initstdio 004023c0 f LIBCD:_file.obj<br />0001:000014f0 ___endstdio 004024f0 f LIBCD:_file.obj<br />0001:00001510 __CrtDbgBreak 00402510 f LIBCD:dbgrpt.obj<br />0001:00001520 __CrtSetReportMode 00402520 f LIBCD:dbgrpt.obj<br />0001:00001580 __CrtSetReportFile 00402580 f LIBCD:dbgrpt.obj<br />0001:00001600 __CrtSetReportHook 00402600 f LIBCD:dbgrpt.obj<br />0001:00001620 __CrtDbgReport 00402620 f LIBCD:dbgrpt.obj<br /><br />　　如果仔细浏览 Rva+Base 这栏，我们可以发现第一个比崩溃地址 0x0040102f 大的函数地址是 0x0040103c ，所以在 0x0040103c 这个地址之前的那个入口就是产生崩溃的函数，也就是这行：<br /><br />0001:00000020 ?crashtest@@YAHHH@Z 00401020 f main.obj<br /><br />　　因此，发生崩溃的函数就是 ?crashtest@@YAHHH@Z，所有以问号开头的函数名称都是 C++ 修饰的名称。所以在我们的源程序中，这个发生崩溃的函数就是 crashtest ()！<br /><br />　　现在我们便轻而易举地知道了发生崩溃的函数名称。把它记下来，然后我们将要直接定位发生崩溃的代码行了。我们注意 MAP 文件的最后部分——代码行信息（Line numbers information），它是以这样的形式显示的：<br /><br />Line numbers for .\Debug\main.obj(D:\我的工作\技术\出异常例子abort\main.cpp) segment .text<br /><br />12 0001:00000020 14 0001:0000002b 15 0001:00000035 16 0001:00000038<br />19 0001:0000003c 20 0001:00000057 21 0001:0000005e 23 0001:00000065<br />24 0001:00000072 25 0001:00000085<br /><br />　　第一个数字代表在源代码中的代码行号，第二个数是该代码行在所属的代码段中的偏移量。如果要查找代码行号，需要使用下面的公式做一些十六进制的减法运算：<br /><br />崩溃行偏移 = 崩溃地址（Crash Address）－ 基地址（ImageBase Address）－ 0x1000<br /><br />　　为什么要这样做呢？因为我们得到的崩溃地址都是由 偏移地址（Rva）+ 基地址（Base）得来的，所以在计算行号的时候要把基地址减去。一般情况下，基地址的值是 0x00400000 。另外，由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的，所以也必须减去 0x1000 。<br />　　所以我们的：崩溃行偏移 = 0x0040102f - 0x00400000 - 0x1000 = 0x2f<br />我们在MAP 文件的中的代码行信息里查找不超过计算结果0x2f，但却最接近的数。发现是 main.cpp 文件中的：<br /><br />14 0001:0000002b<br /><br />　　也就意味着在源代码中的第 14 行！让我们来看看源代码，注意注释行和空行也要计算在内，程序的第14行为：<br /><br />c = a/b;<br /><br />果然就是第 14 行啊，它发生了“除0异常”！<br /><br />　　方法已经介绍完了，从今以后，我们就可以精确地定位到源代码中的崩溃行，而且只要编译器可以生成 MAP 文件，无论在WIN平台还是UNIX平台，本方法都是适用的。<br />　　本文我们只是列举了一个非常简单的“除0异常”例子，使用MAP文件的效力或许还不十分明显。但相信在我们的大型应用系统调试中，使用MAP文件的辅助方法来快速定位发生程序崩溃的函数以及代码行，将会为我们的程序调试工作节省大量时间和精力，提高我们的调试质量。我们甚至可以要求远地用户直接提供程序崩溃的地址，然后就可以在自己机器上利用MAP文件静态地找到出错的那行，并在程序中进行相应修正了。<br /><br />&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;<br /><br />VC7下运行OK.<br /><br /><br /></span>
<img src ="http://www.cppblog.com/qiaodong/aggbug/20592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-03-26 10:37 <a href="http://www.cppblog.com/qiaodong/archive/2007/03/26/20592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自我反省</title><link>http://www.cppblog.com/qiaodong/archive/2007/03/25/20575.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Sun, 25 Mar 2007 14:57:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/03/25/20575.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/20575.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/03/25/20575.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/20575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/20575.html</trackback:ping><description><![CDATA[从前,现在,将来<br /><br />从前的我,热衷于收集网络上所有我可能会用到的技巧,并为能在自己的作品中出现这样的技巧而兴奋不已.<br /><br />现在的我,热衷于看别人写下的文章,并尝试理解它的意义,迅速的记录下来,并且更加迅速的忘掉.<br /><br />将来的我......<br /><br />我想,将来应该尝试去写一些这样的文章,去以一个书写者的角度来观感别人的作品,或许更有收获.<br /><br /><br />从前的我,不知道自己是不是能当一个好程序员.<br /><br />现在的我,知道自己可以作一个好程序员,但是不知道下来怎么办.<br /><br />将来的我.......<br /><br />不知道.<br /><br />从前的我,热衷社交,喜欢琢磨穿着饮食.<br /><br />现在的我,更加喜欢耐脏而朴素的衣服,更加顺口健康的食品,当然,越廉价越好<br /><br />将来的我.......<br /><br />也许,会追求时装会品位美食,也可能会更喜欢朴素的衣服,和健康而廉价的食品.<br /><br />从前,我没有这样的文字.<br /><br />现在,我尝试将这样劈为横枝竖条的烂木头一样文字组合起来,却为其轰然倒塌而沮丧不已.<br /><br />将来,我会写出更好的更满意的文字去记录这些历程,像大厦一样坚固.<img src ="http://www.cppblog.com/qiaodong/aggbug/20575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-03-25 22:57 <a href="http://www.cppblog.com/qiaodong/archive/2007/03/25/20575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC 界面库</title><link>http://www.cppblog.com/qiaodong/archive/2007/03/21/20272.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Wed, 21 Mar 2007 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/03/21/20272.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/20272.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/03/21/20272.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/20272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/20272.html</trackback:ping><description><![CDATA[
		<p>GuiToolkit(开源，类似Visual Studio 2003风格)<br /><a href="http://www.beyondata.com/default.htm">http://www.beyondata.com/default.htm</a></p>
		<p>GardenUI(免费，界面效果挺好的,XML，代码 界面 分离)<br /><a href="http://www.gardenui.com/">http://www.gardenui.com/</a></p>
		<p>CJLib(开源，免费，UNICODE编码,是xtreme toolkit的前生，但xtreme toolkit收费了)<br /><a href="http://www.codejock.com/">http://www.codejock.com/</a></p>
		<p>LibUIDK(部分免费，不开源，效果好,适合贴图)<br /><a href="http://www.iuishop.com/download.htm">http://www.iuishop.com/download.htm</a></p>
		<p>BCGControlBar(收费，界面感觉和Office类似)<br /><a href="http://www.bcgsoft.com/">http://www.bcgsoft.com</a></p>
		<p>SKin++(收费，界面很好看，从它的截图上可以看出)<br /><a href="http://www.uipower.com/">http://www.uipower.com/</a></p>
		<p>SkinMagic(收费，看起来像Office)<br /><a href="http://appspeed.com/html/download.html">http://appspeed.com/html/download.html</a></p>
		<p>ActiveSkin(未知)<br /><a href="http://www.softshape.com/software/develop/">http://www.softshape.com/software/develop/</a></p>
		<p>SYGUI(收费,类似Office)<br /><a href="http://www.sygui.com/">http://www.sygui.com/</a><br /><br /><br /><br /><br /><br /><br /></p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/20272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-03-21 10:42 <a href="http://www.cppblog.com/qiaodong/archive/2007/03/21/20272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也许有用(也谈VC中ModifyStyle&amp;ModifyStyleEx无法改变控件的Style)</title><link>http://www.cppblog.com/qiaodong/archive/2007/03/19/20153.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 19 Mar 2007 10:30:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/03/19/20153.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/20153.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/03/19/20153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/20153.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/20153.html</trackback:ping><description><![CDATA[
		<h4 class="TextColor1" id="subjcns!C87821B94B02DD53!225" style="MARGIN-BOTTOM: 0px"> </h4>
		<div id="msgcns!C87821B94B02DD53!225">
				<div>     一个View中用到了一个CListCtrl，在OnInitialUpdate函数里面他调用了m_listCtrl.ModifyStyleEx(0, LVS_EX_FULLROWSELECT);但是结果是并没有改变View中这个ListCtrl的效果。</div>
				<div> </div>
				<div>     仔细的查阅了MSDN的关于ModifyStyleEx的说明，发现没什么可以的地方，调试几遍发现也没异常，最后在网上一搜索ModifyStyleEx，结果发现碰到这个问题的朋友还真不少，有一遍关于ModifyStyle和ModifyStyleEx无法改变样式的解决方法的文章被转载得到处都是，不仅感慨现在的互联网信息重复程度~~结果看完文章很失望，他完全是重新Create了一个控件。</div>
				<div> </div>
				<div>     最后经过努力，发现使用SetExtendStyle函数就可以实现改变Style的功能。</div>
				<div> </div>
				<div>     有一点是可以肯定地，如果你重构一个控件继承自CListCtrl，那么你可以在该控件的OnCreate中使用ModifyStyle或者ModifyStyleEx，这都是可以达到目的的，但是如果控件的一个实例是另一个窗口的成员变量，那么你在这个窗口的初始化函数中调用该控件的ModifyStyle或者ModifyStyleEx是不能达到目的的，有些关联的一个说明是SetWindowLong会因为控件和调用者不在同一进程而失败（ModifyStyle和ModifyStyleEx函数中有调用SetWindowLong）.<br /><br /><br /><br /><br /><br /></div>
		</div>
<img src ="http://www.cppblog.com/qiaodong/aggbug/20153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-03-19 18:30 <a href="http://www.cppblog.com/qiaodong/archive/2007/03/19/20153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>About ' DLL ' something  (孙鑫VC 19讲 DLL)</title><link>http://www.cppblog.com/qiaodong/archive/2007/03/15/19894.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Thu, 15 Mar 2007 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/03/15/19894.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/19894.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/03/15/19894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/19894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/19894.html</trackback:ping><description><![CDATA[
		<p>
				<font style="BACKGROUND-COLOR: #fffbf0">动态链接库的连接方式: 显式链接,隐式链接<br /><br />在命令行下运行当前目录下(如C:\Documents and Settings\Tony\桌面\dll1\Debug),运行命令dumpbin,如果不能运行,说明环境找到损坏,利用vcvars32.bat(VC87 / VC7 目录下Bin 文件夹直接拖入然后运行). 运行dumpbin -exports dll1.dll可以看到DLL中到处函数名.<br /><br /><font color="#000080">Code:<br />&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;<br /></font><font color="#000080">dll1.cpp:<br /></font><br />_declspec(dllexport) int add(int a, int b )<br />{<br />       return a+b;<br />}</font>
		</p>
		<p>
				<font style="BACKGROUND-COLOR: #fffbf0">_declspec(dllexport)int subtract(int a, int b)<br />{<br />       return a-b;<br />}<br /><font color="#ff0000"><font size="2">_declspec(dllexport)表示为导出函数,可供应用程序调用。"extern C"表示,可以使用其他编程语言访问dll中的函数.<br /><br /></font><font color="#000000" size="2">编译后可以得到DLL1.DLL文件.<br />&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;<br /><br />dlltest.dlg<br /><br /></font><font color="#000000"><font size="2">extern int add(int x,int y);<br />extern int subtract(int x,int y);<br /><font size="3">//_declspec(dllimport) int add(int a, int b )</font><br /><font size="3">//_declspec(dllimport)int subtract(int a, int b)   //这样的方法告诉编译器这些函数是从一个dll中调用的函数.编译器就能调用相应的lib文件,提高运行效率</font><br /><br /><font color="#ff0000">extern可以置于变量或者</font></font><a href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD" target="_blank"><font color="#ff0000" size="2">函数</font></a><font color="#ff0000" size="2">前，以标示变量或者</font><a href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD" target="_blank"><font color="#ff0000" size="2">函数</font></a><font color="#ff0000" size="2">的定义在别的文件中，提示编译器遇到此变量和</font><a href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD" target="_blank"><font color="#ff0000" size="2">函数</font></a></font><font color="#ff0000" size="2">时在其他模块中寻找其定义<br /><br /> <font color="#000000">CString str;<br /> str.Format("3+5=%d",add(3,5));<br /> MessageBox(str);<br /><br />编译器工程属性LINK--&gt;input--&gt;additional dependencies 添加相应的lib文件,LINK--&gt;input--&gt;Module defintion file添加def文件.<br />&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;<br /><font color="#ff0000">如何显式的加载一个动态链接库<br />动态加载不需要lib文件,只需要dll文件即可<br /><font color="#000000">HINSTANCE与HMODULE可以通用<br /><br />HInstance hinst;<br />hinst = Loadlibrary("dll2.dll");         //显式加载<br />typedef int (*ADDPROC)(int a , int b);            //定义一个函数指针<br />ADDPROC Add = (ADDPROC)getprocAdress(hinst, "add");    //获得函数指针<br />if(!add)<br />{<br />   messagebox("fail");<br />}<br />else<br />{<br />   <font color="#ff0000"> </font><font color="#000000">CString str;<br />    str.Format("3+5=%d",add(3,5));<br />    MessageBox(str);</font><br />}<br /><br /><br /></font><br /></font><br /></font></font><br /><br /><br /><br /></font></font>
		</p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/19894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-03-15 15:11 <a href="http://www.cppblog.com/qiaodong/archive/2007/03/15/19894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【高效排序】</title><link>http://www.cppblog.com/qiaodong/archive/2007/03/06/19284.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Tue, 06 Mar 2007 04:14:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/03/06/19284.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/19284.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/03/06/19284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/19284.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/19284.html</trackback:ping><description><![CDATA[
		<div id="msgcns!62FB2A0D08BE727B!174">
				<p dir="ltr">Sort(int a[],int left,int right)<br />{<br />   int value,l,r,temp;<br />   l=left;<br />   r=right;<br />   value = a[(left+right)/2];<br />   while(l&lt;r)<br />   {<br />      while(a[l]&lt;value)<br />       l++;<br />      while(a[r]&gt;value)<br />       r--;<br />      if(l&gt;=r)<br />         break;<br />      temp = a[l];<br />      a[l] = a[r];<br />      a[r] = temp;<br />      l++;<br />      r--;</p>
				<p>   }<br />   if(l==r)<br />      l++;<br />   if(left&lt;r)<br />      Sort(a,left,l-1);<br />   if(l&lt;right)<br />      Sort(a,r+1,right);<br />}<br /><br /><br /><br /><br /><br /><br /><br /></p>
		</div>
<img src ="http://www.cppblog.com/qiaodong/aggbug/19284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-03-06 12:14 <a href="http://www.cppblog.com/qiaodong/archive/2007/03/06/19284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学而思，思而行　＜２＞</title><link>http://www.cppblog.com/qiaodong/archive/2007/01/30/18173.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Tue, 30 Jan 2007 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/01/30/18173.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/18173.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/01/30/18173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/18173.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/18173.html</trackback:ping><description><![CDATA[
		<font color="#808080">code：<br /></font>typedef struct<br />{<br /> SOCKET sock;<br /> LPVOID ptr;<br />}PARAMRECV;<br /><br /><font color="#808080">error msg:</font><br /><br />c:\documents and settings\tony\桌面\mysocket\tcpserver_ft.h(44) : error C2146: syntax error : missing ';' before identifier 'sock'<br /><br />这个信息其实很典型，说明SOCKET 没有被定义，所以理所当然的应该查询SOCKET 的来源，F12发现它包换于#include "winsock.h" 之中，添加以后解决问题。<br /><br /><font color="#000080">思考：<br /></font>这个问题其实并不复杂，需要注意的地方有两点：<br />1：遇到出错信息要冷静的分析，不要害怕，不要心烦。<br />2：增强DEBUG技术，不单单只是调试器上的功夫，还需要认真地思考。<br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/qiaodong/aggbug/18173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-01-30 10:44 <a href="http://www.cppblog.com/qiaodong/archive/2007/01/30/18173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学而思，思而行 &lt;1&gt;</title><link>http://www.cppblog.com/qiaodong/archive/2007/01/30/18170.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Tue, 30 Jan 2007 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/01/30/18170.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/18170.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/01/30/18170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/18170.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/18170.html</trackback:ping><description><![CDATA[一个link 2019的错误，一直没有解决思路，最后解决掉，把思路记录下<br />error msg:<br /><br />UpDlgView.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CMarkup::~CMarkup(void)" (<a href="mailto:__imp_??1CMarkup@@QAE@XZ">__imp_??1CMarkup@@QAE@XZ</a>) referenced in function "public: void __thiscall CUpDlgView::OnButtonadd(void)" (<a href="mailto:?OnButtonadd@CUpDlgView@@QAEXXZ">?OnButtonadd@CUpDlgView@@QAEXXZ</a>)<br /><br />UpDlgView.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __thiscall CMarkup::AddElem(char const *,char const *,int)" (<a href="mailto:__imp_?AddElem@CMarkup@@QAE_NPBD0H@Z">__imp_?AddElem@CMarkup@@QAE_NPBD0H@Z</a>) referenced in function "public: void __thiscall CUpDlgView::OnButtonadd(void)" (<a href="mailto:?OnButtonadd@CUpDlgView@@QAEXXZ">?OnButtonadd@CUpDlgView@@QAEXXZ</a>)<br /><br />UpDlgView.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CMarkup::CMarkup(void)" (<a href="mailto:__imp_??0CMarkup@@QAE@XZ">__imp_??0CMarkup@@QAE@XZ</a>) referenced in function "public: void __thiscall CUpDlgView::OnButtonadd(void)" (<a href="mailto:?OnButtonadd@CUpDlgView@@QAEXXZ">?OnButtonadd@CUpDlgView@@QAEXXZ</a>)<br /><br />分析：<br />错误的类别是:unresolved external symbol ,是一个没有解决的外部变量，因为一直认为第三方类不可能有错误所以一直在自己编写的代码中寻找错误，其实错误的关键在这里："__declspec(dllimport)" 这说明这是一个外部导出类，所以需要 将class  AFX_EXT_CLASS CMarkup 改为 class CMarkUp .<br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/qiaodong/aggbug/18170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-01-30 10:37 <a href="http://www.cppblog.com/qiaodong/archive/2007/01/30/18170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>演练VC中的COMMON一族 </title><link>http://www.cppblog.com/qiaodong/archive/2007/01/22/17895.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 22 Jan 2007 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/01/22/17895.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/17895.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/01/22/17895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/17895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/17895.html</trackback:ping><description><![CDATA[1.表头控制         Header Control  <br />    2.图像列表控制     Image List<br />    3.列表控制和视     List Control&amp;List View<br />    4.树控制和视       Tree Control&amp;Tree View<br />    5.标签控制和视     Tab Control&amp;Tab View<br />    6.工具条控制       Toolbar Control<br />    7.进度条控制       Progress Control<br />    8.滑动条控制      Slider Control<br />    9.旋转按钮控制    Spin Button Control<br />    10.状态条控制      Status Bar Control<br /><br /><a href="http://blog.csdn.net/wangjiwei2010/archive/2006/11/24/1412714.aspx"><br />http://blog.csdn.net/wangjiwei2010/archive/2006/11/24/1412714.aspx</a><br /><br /><br /><br /><img src ="http://www.cppblog.com/qiaodong/aggbug/17895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-01-22 17:44 <a href="http://www.cppblog.com/qiaodong/archive/2007/01/22/17895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同步异步,长连接短连接</title><link>http://www.cppblog.com/qiaodong/archive/2007/01/16/17666.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Tue, 16 Jan 2007 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/01/16/17666.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/17666.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/01/16/17666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/17666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/17666.html</trackback:ping><description><![CDATA[  同步/异步：   <br />    <br />  你去饭店吃饭，对服务员说：“来两碗牛肉盖饭”，然后就继续和lp聊天了，过了一会服务员把牛肉盖饭给你端了过来，这叫异步，你发了请求后继续做其他事情去了，服务员完成你的请求后告诉你盖饭好了   <br />    <br />  你去饭店吃饭，对服务员说：“来两碗拉面”，服务员告诉你：“拉面得自己排队去端”，你只好让lp占着座位自己去排队，这叫同步，你发了请求后必须等着师傅把面给你，不能离开，否则饭别人就拿走了<br /><br />长/短连接：   <br />    <br />  你在和mm在打电话，但mm还在做饭，然后mm对你说：“我现在洗个碗，过两分钟打给我”，又聊了一会儿，mm又说：“过3分钟打给我”，.....这是短连接，完成一件事情后离开断开，新的传输就建立新的连接   <br />    <br />  你受不了这么频繁的拨号，你说：“我不挂机....”，这是长连接，不管有没有数据要传输，连接都要保持着<img src ="http://www.cppblog.com/qiaodong/aggbug/17666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-01-16 09:34 <a href="http://www.cppblog.com/qiaodong/archive/2007/01/16/17666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CString和string的互相转换 </title><link>http://www.cppblog.com/qiaodong/archive/2007/01/15/17645.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 15 Jan 2007 09:24:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/01/15/17645.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/17645.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/01/15/17645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/17645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/17645.html</trackback:ping><description><![CDATA[CString-&gt;std::string 例子：<br /><br />CString strMfc=“test“;<br /><br />std::string strStl;<br /><br />strStl=strMfc.GetBuffer(0);<br /><br />std::string-&gt;CString  例子：<br /><br />CString strMfc；<br /><br />std::string strStl=“test“;<br /><br />strMfc=strStl.c_str(); <br /><img src ="http://www.cppblog.com/qiaodong/aggbug/17645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-01-15 17:24 <a href="http://www.cppblog.com/qiaodong/archive/2007/01/15/17645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>命名空间</title><link>http://www.cppblog.com/qiaodong/archive/2007/01/04/17248.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Thu, 04 Jan 2007 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2007/01/04/17248.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/17248.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2007/01/04/17248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/17248.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/17248.html</trackback:ping><description><![CDATA[        今天在使用池工给的一个配置设置文件类的时候总是报错,错误很奇怪,解决后很以外的发现,问题竟然在命名空间上.再次复习一下相关内容.<br />  #include   "stdafx.h"   <br />  #include   &lt;iostream&gt;   <br />  using   namespace   std;   <br />    <br />  namespace   A   <br />  {   <br />  void   f(){cout&lt;&lt;"In   A::f()   function"&lt;&lt;endl;}   <br />  }   <br />  namespace   B   <br />  {   <br />  void   f(){cout&lt;&lt;"In   B::f()   function"&lt;&lt;endl;}   <br />  }   <br />    <br />    <br />    <br />  int   main(int   argc,   char*   argv[])   <br />  {   <br />  {   <br />  using   namespace   A;   <br />  f();   <br />  }   <br />  {   <br />  using   namespace   B;   <br />  f();   <br />  }   <br />  return   0;   <br />  }  <br /><br />  结果是：   <br />  In   A::f()   function   <br />  In   B::f()   function <br /><br /><img src ="http://www.cppblog.com/qiaodong/aggbug/17248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2007-01-04 16:20 <a href="http://www.cppblog.com/qiaodong/archive/2007/01/04/17248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发心得</title><link>http://www.cppblog.com/qiaodong/archive/2006/12/21/16696.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Thu, 21 Dec 2006 09:29:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/21/16696.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16696.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/21/16696.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16696.html</trackback:ping><description><![CDATA[今天涉及到一个数据更新问题，感觉问题并不大，但是却发现了很大的学习空间，虽然问题还没有完全搞定，但是觉得这样的问题折磨自己是很不错的一件事情。<br /><br /><br />另外有一个疑问，是不是重复代码越少越好呢？我今天写的时候总是不停在复用以前写的代码，感觉有些累赘所以就写成函数，到处调用，从头审视自己的代码，发现重复的代码很多，我想这些是我需要改进的地方。<br /><br />高得纳说：不成熟的优化是万恶之源，我这样的优化是不是不成熟的优化？会不会造成一些恶果？这个我还不知道，但是我要尽快地找到答案。<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/qiaodong/aggbug/16696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-21 17:29 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/21/16696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ListCtrl的总结 </title><link>http://www.cppblog.com/qiaodong/archive/2006/12/13/16370.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Wed, 13 Dec 2006 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/13/16370.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16370.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/13/16370.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16370.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16370.html</trackback:ping><description><![CDATA[ListCtrl在工作中，常常用到，也常常看到大家发帖问怎么用这个控件，
<div class="postText"><p>故总结了一下自己的使用经验，以供参考使用。</p><p>　　先注明一下，这里，我们用m_listctrl来表示一个CListCtrl的类对象，</p><p>然后这里我们的ListCtrl都是report形式，至于其他的如什么大图标，小图标</p><p>的暂时不讲，毕竟report是大众话的使用。其次，我们这里用条款一，条款二</p><p>来描述第一点，第二点，这个是参照《Effective C++》的叫法，俺觉得这么</p><p>叫比较COOL :)</p><p>　条款一：设置ListCtrl的风格</p><p>　在CSDN上常常看到有人问怎么设置风格的，他们ListCtrl的样子是一个列表</p><p>，有横条和竖条分界线，然后选中一行，要整一行都选中，而不是只有某一列</p><p>被选中，等等，这里给一个比较全面的设置方法。</p><p>//获得原有风格<br /> DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE); <br /> dwStyle &amp;= ~(LVS_TYPEMASK);<br /> dwStyle &amp;= ~(LVS_EDITLABELS);</p><p> //设置新风格<br />    SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE, </p><p>dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);</p><p><br /> //设置扩展风格<br /> DWORD styles = </p><p>LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;</p><p> ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles, </p><p>styles );</p><p>其中LVS_EX_FULLROWSELECT　就是前面说得整行选中</p><p>LVS_EX_GRIDLINES　网格线（只适用与report风格的listctrl）</p><p>LVS_EX_CHECKBOXES　前面加个checkbox</p><p>pListCtrl-&gt;SetExtendedStyle(  m_listctrl.GetExtendedStyle()</p><p>|LVS_EX_SUBITEMIMAGES);</p><p><br />这也是一个很重要的属性，这样的话，可以在列表中加ICON，记得windows的</p><p>任务管理器吗，你想做得那样，这个属性也要加哦，这个我以后会讲的～</p><p>条款二：加入列头</p><p>　　这是一个比较实质的东西，给列表框分列，然后加上列头</p><p>　　代码说话，来了</p><p>　　TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};<br /> <br /> LV_COLUMN lvcolumn;<br /> CRect rect;<br /> m_listctrl.GetWindowRect(&amp;rect);<br /> for(int i=0;i&lt;2;i++)<br /> {<br />  　lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT <br />     　　　　　　　　 | LVCF_WIDTH | LVCF_ORDER;<br />  　lvcolumn.fmt = LVCFMT_LEFT;<br />  　lvcolumn.pszText = rgtsz[i];<br /> 　 lvcolumn.iSubItem = i;<br />  　lvcolumn.iOrder = i;<br /> 　 if(i==0)<br />  　{<br />   　　　lvcolumn.cx = rect.Width()*3/5 ; <br /> 　 }<br /> 　 else<br />   　　lvcolumn.cx = rect.Width()*2/5;<br />  　　　　</p><p>　　　m_listctrl.InsertColumn(i, &amp;lvcolumn);<br /> 　}</p><p>这是插入两列的做法，你要插入20列？？随便你，依样画葫芦～～</p><p>　lvcolumn.mask 中那个mask可以有各种属性，具体去看msdn吧，</p><p> </p><p>条款三：把记录，插入列表框中</p><p>　int nIndex = m_listctrl.GetItemCount();</p><p>  LV_ITEM   lvitemAdd = {0};<br />  lvitemAdd.mask = LVIF_TEXT;<br />  lvitemAdd.iItem = nIndex ;<br />  lvitemAdd.iSubItem = 0;<br />  lvitemAdd.pszText =_T("毛毛1");;</p><p><br />  if (m_listctrl.InsertItem(&amp;lvitemAdd) != -1)<br />  { <br />   LV_ITEM lvitem = {0};<br />   lvitem.mask = LVIF_TEXT;<br />   lvitem.iItem = nIndex ;<br />   lvitem.iSubItem = 1;<br /> <br />   lvitem.pszText =_T("毛毛2");<br />   m_listctrl.SetItem(&amp;lvitem);<br />   <br />  }</p><p>nIndex 是当前的行数，然后把新的一行，插在最下面，</p><p> </p><p>条款四：给列表中插入图标</p><p>　在report格式中，也能插入图标</p><p>　继续代码说话</p><p>　m_image是个CImageList对象</p><p>　m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);</p><p> m_listctrl.SetImageList(&amp;m_image,LVSIL_SMALL);</p><p>然后调用CImageList的成员函数int CImageList::Add( HICON hIcon );</p><p>把ICON插入到imagelist，</p><p>　然后在插入记录的时候</p><p>　lvitemAdd.mask = LVIF_TEXT;　－》　lvitemAdd.mask = </p><p>LVIF_TEXT|LVIF_IMAGE</p><p>　然后添加一个lvitemAdd.iImage = n;</p><p>　这个n是imagelist中的序号，表示是具体的哪一个图标，list么，呵呵</p><p> </p><p>条款五：　插入记录时使用额外的信息，lParam 的使用</p><p>　　　有时候，你想对于某一行，加入一些额外的信息，那么就可以使用这个</p><p>lParam </p><p>　　ｍｓｄｎ是这么描述的Specifies the 32-bit value of the item</p><p>　　我上次是为了在某一行加入一个信息，窗口句柄，然后是这么加的，</p><p>　　int nIndex = m_listctrl.GetItemCount();</p><p>  LV_ITEM   lvitemAdd = {0};<br />  lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;<br />  lvitemAdd.iItem = nIndex ;<br />  lvitemAdd.iSubItem = 0;<br />  lvitemAdd.pszText =_T("毛毛1");;</p><p>  lvitemAdd.iImage = n;<br />  lvitemAdd.lParam = (LPARAM)hwnd;(某个窗口的窗口句柄)</p><p><br />  if (m_listctrl.InsertItem(&amp;lvitemAdd) != -1)<br />  { <br />   LV_ITEM lvitem = {0};<br />   lvitem.mask = LVIF_TEXT;<br />   lvitem.iItem = nIndex ;<br />   lvitem.iSubItem = 1;<br /> <br />   lvitem.pszText =_T("毛毛2");<br />   m_listctrl.SetItem(&amp;lvitem);<br />   <br />  }</p><p>ok，这是一个比较全的例子的，又插ICON，又使用PARAM的</p><p>条款六　：　点击列表框，获取选中行信息</p><p>　　响应NM_CLICK消息，如果你有MSDN，可以看到，有专门关于listview的</p><p>NM_CLICK的介绍</p><p>void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult) <br />{<br /> // TODO: Add your control notification handler code here<br /> int nItem = -1;<br /> <br /> LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;</p><p> if(lpNMItemActivate != NULL)<br /> {<br />     nItem = lpNMItemActivate-&gt;iItem;<br /> }</p><p>} </p><p>现在nItem就是点击选中那行的index了，有了index，获取那行的信息还难吗</p><p>？</p><p>懒汉说：难，因为你还没讲，晕，那就继续说</p><p> </p><p>条款七：　根据行的index，获取该行的信息</p><p>　直接上代码吧</p><p>　LV_ITEM lvitem = {0};<br />   lvitem.iItem = nIndex;<br />   lvitem.iSubItem = 0;<br />   lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;</p><p>m_listctrl.GetItem(&amp;lvitem)</p><p>这样，就把nindex,第一列的信息取出来了，包括刚才我们加入的ICON,和那个</p><p>额外信息（窗口句柄），</p><p>比如我要获取窗口句柄，就可以hwnd = (HWND)lvitem.lParam; </p><p>mask 用来指明你想获取那些信息</p><p>具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem</p><p> </p><p>条款八：用程序选中某一行，使之选中</p><p>选中之　</p><p>m_listctrl.SetItemState</p><p>(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);</p><p>不选中，取消选中之</p><p>m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);</p><p> </p><p>条款九：获取当前所有选中的行（多选）</p><p>　　这个，俺就比较懒了，抄msdn的代码吧，反正很简单</p><p>　　</p><p>Example<br />// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem</p><p>(IDC_YOURLISTCONTROL);<br />ASSERT(pListCtrl != NULL);</p><p>POSITION pos = pList-&gt;GetFirstSelectedItemPosition();<br />if (pos == NULL)<br />   TRACE0("No items were selected!\n");<br />else<br />{<br />  while (pos)<br />  {<br />     int nItem = pList-&gt;GetNextSelectedItem(pos);<br />     TRACE1("Item %d was selected!\n", nItem);<br />     // you could do your own processing on nItem here<br />  }<br />}</p><p> </p><p>条款十：删除条款九中选中的行</p><p>　　这个相对前面九个条款是比较麻烦的，因为如果你要删除多行的话。往往要出错</p><p>　　比如，我现在要删除第0行和第1行（列表的行序列是从0开始的）</p><p>　　那么好啊。我来删了</p><p>　　m_listctrl.DeleteItem(0)</p><p>        m_listctrl.DeleteItem(1)</p><p>　　恭喜你，错了，我好开心啊　：）</p><p>　　因为你删除第0行以后，下面的行会往上移，那么原来的第1行就变成了第0行，那么你再 m_listctrl.DeleteItem(1)，那么删除的是原来的第２行，真麻烦，</p><p>　　　所以，只有从下往上删，才是安全的，先删的，不会影响后面的操作，</p><p>　　　　m_listctrl.DeleteItem(1)</p><p>        m_listctrl.DeleteItem(0)</p><p>　　但有时候，我们也不知道要删除哪些行，只知道要删除选中的那些行，像条款九中的那些</p><p>　　　如果我们还是用</p><p>　　　</p><p>POSITION pos = m_listctrl.GetFirstSelectedItemPosition();<br />if (pos == NULL)<br />   TRACE0("No items were selected!\n");<br />else<br />{<br />  while (pos)<br />  {<br />     int nItem = m_listctrl.GetNextSelectedItem(pos);<br />    </p><p>　m_listctrl.DeleteItem(nItem );</p><p>  }<br />}</p><p>你就等着收尸吧</p><p>这时候我们就要B4微软了，为虾米木有GetLastselectedItemPosition 和GetPrevSelectedItem</p><p>多写一对成员函数会死啊　:(</p><p>　没办法，办法自己想，这里有个笨办法</p><p>　POSITION  sSelPos = NULL;</p><p> while(sSelPos = m_listctrl.GetFirstSelectedItemPosition())<br /> {<br />        int nSelItem = -1;<br />         nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);</p><p>         if(nSelItem &gt;= 0 &amp;&amp; nSelItem&lt;m_listctrl.GetItemCount())<br />       {</p><p>             好了，这个nSelItem 就是我们要的DD</p><p>      }</p><p>}</p><p>GetNextSelectedItem这个函数，看msdn的用法，其实是返回第一个的index，然后走到下一个选中的行去，所以这么做也是安全的，在实际中，俺也是这么做的，测试也通过，没问题的</p><p>当然，还有个办法，先通过GetFirstSelectedItemPosition和GetNextSelectedItem</p><p>来获取所有的选中行的index，然后把这些index放到一个数组里，然后再从下往上删</p><p>唉真麻烦啊，还要不定数组，不说用new在堆上开吧，那么一个vector总是要的吧，麻烦啊</p><p>所以我暂时是用上述的办法来删除，也供大家参考，希望能找到更好的办法。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p></div><img src ="http://www.cppblog.com/qiaodong/aggbug/16370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-13 15:18 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/13/16370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>listctrl的一些问题</title><link>http://www.cppblog.com/qiaodong/archive/2006/12/13/16361.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Wed, 13 Dec 2006 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/13/16361.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16361.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/13/16361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16361.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">CListCtrl使用技巧</h2>                                       
<p><u><font color="#800080">CListCtrl使用技巧</font></u></p><div class="postText"><p>以下未经说明，listctrl默认view 风格为report<br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,102)"><span style="COLOR: rgb(153,51,0)">1. CListCtrl 风格</span></span></h3><p>      LVS_ICON: 为每个item显示大图标<br />      LVS_SMALLICON: 为每个item显示小图标<br />      LVS_LIST: 显示一列带有小图标的item<br />      LVS_REPORT: 显示item详细资料</p><p>      直观的理解：windows资源管理器，“查看”标签下的“大图标，小图标，列表，详细资料”</p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">2. 设置listctrl 风格及扩展风格</span></h3><p>      LONG lStyle;<br />      lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style<br />      lStyle &amp;= ~LVS_TYPEMASK; //清除显示方式位<br />      lStyle |= LVS_REPORT; //设置style<br />      SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style<br /> <br />      DWORD dwStyle = m_list.GetExtendedStyle();<br />      dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮（只适用与report风格的listctrl）<br />      dwStyle |= LVS_EX_GRIDLINES;//网格线（只适用与report风格的listctrl）<br />      dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件<br />      m_list.SetExtendedStyle(dwStyle); //设置扩展风格<br />  <br />      注：listview的style请查阅msdn<br />      <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp</a><br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">3. 插入数据</span></h3><p><span style="COLOR: rgb(153,51,0)"></span><span style="COLOR: rgb(153,51,0)"></span>      m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列<br />      m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );<br />      int nRow = m_list.InsertItem(0, “11”);//插入行<br />      m_list.SetItemText(nRow, 1, “jacky”);//设置数据<br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(51,102,255)"><span style="COLOR: rgb(153,51,0)">4. 一直选中item</span></span></h3><span style="FONT-WEIGHT: bold">    </span>选中style中的Show selection always，或者在上面第2点中设置LVS_SHOWSELALWAYS<br /><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">5. 选中和取消选中一行</span></h3><p>    int nIndex = 0;<br />    //选中<br />    m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);<br />    //取消选中<br />    m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);<br /> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">6. 得到listctrl中所有行的checkbox的状态</span></h3><p>      m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);<br />      CString str;<br />      for(int i=0; i&lt;m_list.GetItemCount(); i++)<br />      {<br />           if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))<br />           {<br />                str.Format(_T("第%d行的checkbox为选中状态"), i);<br />                AfxMessageBox(str);<br />           }<br />      }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">7. 得到listctrl中所有选中行的序号</span></h3><h3><span style="COLOR: rgb(153,51,0)"></span></h3><p><span style="COLOR: rgb(153,51,0)"><br /></span>      方法一：<br />      CString str;<br />      for(int i=0; i&lt;m_list.GetItemCount(); i++)<br />      {<br />           if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )<br />           {<br />                str.Format(_T("选中了第%d行"), i);<br />                AfxMessageBox(str);<br />           }<br />      }</p><p>      方法二：<br />      POSITION pos = m_list.GetFirstSelectedItemPosition();<br />      if (pos == NULL)<br />           TRACE0("No items were selected!\n");<br />      else<br />      {<br />           while (pos)<br />           {<br />                int nItem = m_list.GetNextSelectedItem(pos);<br />                TRACE1("Item %d was selected!\n", nItem);<br />                // you could do your own processing on nItem here<br />           }<br />      }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">8. 得到item的信息</span></h3><p>      TCHAR szBuf[1024];<br />      LVITEM lvi;<br />      lvi.iItem = nItemIndex;<br />      lvi.iSubItem = 0;<br />      lvi.mask = LVIF_TEXT;<br />      lvi.pszText = szBuf;<br />      lvi.cchTextMax = 1024;<br />      m_list.GetItem(&amp;lvi);</p><p>      关于得到设置item的状态，还可以参考msdn文章<br />      Q173242: Use Masks to Set/Get Item States in CListCtrl<br />               <a href="http://support.microsoft.com/kb/173242/en-us">http://support.microsoft.com/kb/173242/en-us</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(51,102,255)"><span style="COLOR: rgb(153,51,0)">9. 得到listctrl的所有列的header字符串内容</span></span></h3><p>      LVCOLUMN lvcol;<br />      char  str[256];<br />      int   nColNum;<br />      CString  strColumnName[4];//假如有4列</p><p>      nColNum = 0;<br />      lvcol.mask = LVCF_TEXT;<br />      lvcol.pszText = str;<br />      lvcol.cchTextMax = 256;<br />      while(m_list.GetColumn(nColNum, &amp;lvcol))<br />      { <br />           strColumnName[nColNum] = lvcol.pszText;<br />           nColNum++;<br />      }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">10. 使listctrl中一项可见，即滚动滚动条</span></h3>    m_list.EnsureVisible(i, FALSE);<br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">11. 得到listctrl列数</span></h3>    int nHeadNum = m_list.GetHeaderCtrl()-&gt;GetItemCount();<br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">12. 删除所有列</span></h3><p>      方法一：<br />         while ( m_list.DeleteColumn (0))<br />       因为你删除了第一列后，后面的列会依次向上移动。</p><p>      方法二：<br />      int nColumns = 4;<br />      for (int i=nColumns-1; i&gt;=0; i--)<br />          m_list.DeleteColumn (i);<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">13. 得到单击的listctrl的行列号</span></h3><p>      添加listctrl控件的NM_CLICK消息相应函数<br />      void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br />      {<br />           // 方法一：<br />           /*<br />           DWORD dwPos = GetMessagePos();<br />           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br />   <br />           m_list.ScreenToClient(&amp;point);<br />   <br />           LVHITTESTINFO lvinfo;<br />           lvinfo.pt = point;<br />           lvinfo.flags = LVHT_ABOVE;<br />     <br />           int nItem = m_list.SubItemHitTest(&amp;lvinfo);<br />           if(nItem != -1)<br />           {<br />                CString strtemp;<br />                strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);<br />                AfxMessageBox(strtemp);<br />           }<br />          */<br />   <br />          // 方法二:<br />          /*<br />           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />           if(pNMListView-&gt;iItem != -1)<br />           {<br />                CString strtemp;<br />                strtemp.Format("单击的是第%d行第%d列",<br />                                pNMListView-&gt;iItem, pNMListView-&gt;iSubItem);<br />                AfxMessageBox(strtemp);<br />           }<br />          */<br />           *pResult = 0;<br />      }<br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">14. 判断是否点击在listctrl的checkbox上</span></h3><p>      添加listctrl控件的NM_CLICK消息相应函数<br />      void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br />      {<br />           DWORD dwPos = GetMessagePos();<br />           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br />   <br />           m_list.ScreenToClient(&amp;point);<br />   <br />           LVHITTESTINFO lvinfo;<br />           lvinfo.pt = point;<br />           lvinfo.flags = LVHT_ABOVE;<br />     <br />           UINT nFlag;<br />           int nItem = m_list.HitTest(point, &amp;nFlag);<br />           //判断是否点在checkbox上<br />           if(nFlag == LVHT_ONITEMSTATEICON)<br />           {<br />                AfxMessageBox("点在listctrl的checkbox上");<br />           } <br />           *pResult = 0;<br />      }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">15. 右键点击listctrl的item弹出菜单</span></h3><p>      添加listctrl控件的NM_RCLICK消息相应函数<br />      void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)<br />      {<br />           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />           if(pNMListView-&gt;iItem != -1)<br />           {<br />                DWORD dwPos = GetMessagePos();<br />                CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br />    <br />                CMenu menu;<br />                VERIFY( menu.LoadMenu( IDR_MENU1 ) );<br />                CMenu* popup = menu.GetSubMenu(0);<br />                ASSERT( popup != NULL );<br />                popup-&gt;TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );<br />           } <br />           *pResult = 0;<br />  }<br /></p><p><br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">16. item切换焦点时(包括用键盘和鼠标切换item时)，状态的一些变化顺序</span></h3><p>      添加listctrl控件的LVN_ITEMCHANGED消息相应函数<br />      void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)<br />      {<br />           NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br />           // TODO: Add your control notification handler code here<br />    <br />           CString sTemp;<br />  <br />           if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == LVIS_FOCUSED &amp;&amp; <br />            (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == 0)<br />           {<br />                sTemp.Format("%d losted focus",pNMListView-&gt;iItem);<br />           }<br />           else if((pNMListView-&gt;uOldState &amp; LVIS_FOCUSED) == 0 &amp;&amp;<br />               (pNMListView-&gt;uNewState &amp; LVIS_FOCUSED) == LVIS_FOCUSED)<br />           {<br />                sTemp.Format("%d got focus",pNMListView-&gt;iItem);<br />           } <br />  <br />           if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == LVIS_SELECTED &amp;&amp;<br />            (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == 0)<br />           {<br />                sTemp.Format("%d losted selected",pNMListView-&gt;iItem);<br />           }<br />           else if((pNMListView-&gt;uOldState &amp; LVIS_SELECTED) == 0 &amp;&amp;<br />            (pNMListView-&gt;uNewState &amp; LVIS_SELECTED) == LVIS_SELECTED)<br />           {<br />                sTemp.Format("%d got selected",pNMListView-&gt;iItem);<br />           }<br />    <br />           *pResult = 0;<br />      }</p><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">17. 得到另一个进程里的listctrl控件的item内容</span><span style="COLOR: rgb(51,102,255)"></span></h3><h3><span style="COLOR: rgb(51,102,255)"></span></h3><span style="COLOR: rgb(51,102,255)"></span><a href="http://www.codeproject.com/threads/int64_memsteal.asp">http://www.codeproject.com/threads/int64_memsteal.asp</a><br /><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(51,102,255)"><span style="COLOR: rgb(153,51,0)">18. 选中listview中的item</span></span></h3>Q131284: How To Select a Listview Item Programmatically<br /><a href="http://support.microsoft.com/kb/131284/en-us">http://support.microsoft.com/kb/131284/en-us</a><br /><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">19. 如何在CListView中使用CListCtrl的派生类</span></h3><p><a href="http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/">http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">20. listctrl的subitem添加图标</span></h3><p>      m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);<br />      m_list.SetItem(..); //具体参数请参考msdn<br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">21. 在CListCtrl显示文件，并根据文件类型来显示图标</span></h3><p>      网上找到的代码，share<br />      BOOL CTest6Dlg::OnInitDialog()<br />      {<br />           CDialog::OnInitDialog();<br />   <br />           HIMAGELIST himlSmall;<br />           HIMAGELIST himlLarge;<br />           SHFILEINFO sfi;<br />           char  cSysDir[MAX_PATH];<br />           CString  strBuf;<br />  <br />           memset(cSysDir, 0, MAX_PATH);<br />   <br />           GetWindowsDirectory(cSysDir, MAX_PATH);<br />           strBuf = cSysDir;<br />           sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("<a href="file:///" ?="" )+1="">\\")+1</a>));<br />  <br />           himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir,  <br />                      0,  <br />                      &amp;sfi, <br />                      sizeof(SHFILEINFO),  <br />                      SHGFI_SYSICONINDEX | SHGFI_SMALLICON );<br />   <br />           himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,  <br />                      0,  <br />                      &amp;sfi,  <br />                      sizeof(SHFILEINFO),  <br />                      SHGFI_SYSICONINDEX | SHGFI_LARGEICON);<br />   <br />           if (himlSmall &amp;&amp; himlLarge)<br />           {<br />                ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<br />                             (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);<br />                ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<br />                             (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);<br />           }<br />           return TRUE;  // return TRUE  unless you set the focus to a control<br />      }<br />  <br />      void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)<br />      {<br />           int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);<br />           CString strSize;<br />           CFileFind filefind;<br />  <br />           //  get file size<br />           if (filefind.FindFile(lpszFileName))<br />           {<br />                filefind.FindNextFile();<br />                strSize.Format("%d", filefind.GetLength());<br />           }<br />           else<br />                strSize = "0";<br />   <br />           // split path and filename<br />           CString strFileName = lpszFileName;<br />           CString strPath;<br />  <br />           int nPos = strFileName.ReverseFind('\\');<br />           if (nPos != -1)<br />           {<br />                strPath = strFileName.Left(nPos);<br />                strFileName = strFileName.Mid(nPos + 1);<br />           }<br />   <br />           // insert to list<br />           int nItem = m_list.GetItemCount();<br />           m_list.InsertItem(nItem, strFileName, nIcon);<br />           m_list.SetItemText(nItem, 1, strSize);<br />           m_list.SetItemText(nItem, 2, strFileName.Right(3));<br />           m_list.SetItemText(nItem, 3, strPath);<br />      }<br />  <br />      int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)<br />      {<br />           SHFILEINFO sfi;<br />           memset(&amp;sfi, 0, sizeof(sfi));<br />   <br />           if (bIsDir)<br />           {<br />            SHGetFileInfo(lpszPath,  <br />                         FILE_ATTRIBUTE_DIRECTORY,  <br />                         &amp;sfi,  <br />                         sizeof(sfi),  <br />                         SHGFI_SMALLICON | SHGFI_SYSICONINDEX |<br />                         SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0));  <br />            return  sfi.iIcon;<br />           }<br />           else<br />           {<br />            SHGetFileInfo (lpszPath,  <br />                         FILE_ATTRIBUTE_NORMAL,  <br />                         &amp;sfi,  <br />                         sizeof(sfi),  <br />                         SHGFI_SMALLICON | SHGFI_SYSICONINDEX |  <br />                         SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));<br />            return   sfi.iIcon;<br />           }<br />           return  -1;<br />      }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">22. listctrl内容进行大数据量更新时，避免闪烁</span></h3><p>      m_list.SetRedraw(FALSE);<br />      //更新内容<br />      m_list.SetRedraw(TRUE);<br />      m_list.Invalidate();<br />      m_list.UpdateWindow();<br />  <br />或者参考 <br /></p><p><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">23. listctrl排序 </span></h3><p>Q250614：How To Sort Items in a CListCtrl in Report View<br /><a href="http://support.microsoft.com/kb/250614/en-us">http://support.microsoft.com/kb/250614/en-us</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">24. 在listctrl中选中某个item时动态改变其icon或bitmap</span></h3>Q141834: How to change the icon or the bitmap of a CListCtrl item in Visual C++<br /><a href="http://support.microsoft.com/kb/141834/en-us">http://support.microsoft.com/kb/141834/en-us</a><br /><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">25. 在添加item后，再InsertColumn()后导致整列数据移动的问题</span></h3><p>Q151897: CListCtrl::InsertColumn() Causes Column Data to Shift <br /><a href="http://support.microsoft.com/kb/151897/en-us">http://support.microsoft.com/kb/151897/en-us</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">26. 关于listctrl第一列始终居左的问题</span></h3><p>解决办法：把第一列当一个虚列，从第二列开始插入列及数据，最后删除第一列。<br />      <br />具体解释参阅   <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp</a><br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">27. 锁定column header的拖动</span></h3><p><a href="http://msdn.microsoft.com/msdnmag/issues/03/06/CQA/">http://msdn.microsoft.com/msdnmag/issues/03/06/CQA/</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3 style="COLOR: rgb(153,51,0)">28. 如何隐藏clistctrl的列</h3><p>    把需隐藏的列的宽度设为0,然后检测当该列为隐藏列时，用上面第27点的锁定column 的拖动来实现<br /><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">29. listctrl进行大数据量操作时，使用virtual list </span>   </h3><p><a href="http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/">http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/</a><br /><a href="http://www.codeproject.com/listctrl/virtuallist.asp">http://www.codeproject.com/listctrl/virtuallist.asp</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">30. 关于item只能显示259个字符的问题</span></h3><p>解决办法：需要在item上放一个edit。<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">31. 响应在listctrl的column header上的鼠标右键单击</span></h3><p>Q125694: How To Find Out Which Listview Column Was Right-Clicked<br /><a href="http://support.microsoft.com/kb/125694/en-us">http://support.microsoft.com/kb/125694/en-us</a><br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">32. 类似于windows资源管理器的listview</span></h3><p>Q234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe<br /><a href="http://support.microsoft.com/kb/234310/en-us">http://support.microsoft.com/kb/234310/en-us</a><br /></p><p> </p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3 style="COLOR: rgb(153,51,0)">33. 在ListCtrl中OnTimer只响应两次的问题</h3><p>Q200054：<br />PRB: OnTimer() Is Not Called Repeatedly for a List Control<br /><a href="http://support.microsoft.com/kb/200054/en-us">http://support.microsoft.com/kb/200054/en-us</a><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">34. 以下为一些为实现各种自定义功能的listctrl派生类</span></h3><p>          (1)    <span style="COLOR: rgb(153,51,0)">拖放</span>        <br />                   <a href="http://www.codeproject.com/listctrl/dragtest.asp">http://www.codeproject.com/listctrl/dragtest.asp</a></p><p>                   <span style="COLOR: rgb(153,51,0)">在CListCtrl和CTreeCtrl间拖放</span><br />                   <a href="http://support.microsoft.com/kb/148738/en-us">http://support.microsoft.com/kb/148738/en-us</a><br />  <br />          (2)    <span style="COLOR: rgb(153,51,0)">多功能listctrl</span><br />                   支持subitem可编辑，图标，radiobutton，checkbox，字符串改变颜色的类<br />                   <a href="http://www.codeproject.com/listctrl/quicklist.asp">http://www.codeproject.com/listctrl/quicklist.asp</a><br />  <br />                   <span style="COLOR: rgb(153,51,0)">支持排序，subitem可编辑，subitem图标，subitem改变颜色的类</span><br />                   <a href="http://www.codeproject.com/listctrl/ReportControl.asp">http://www.codeproject.com/listctrl/ReportControl.asp</a></p><p>          (3)    <span style="COLOR: rgb(153,51,0)">subitem中显示超链接</span><br />                   <a href="http://www.codeproject.com/listctrl/CListCtrlLink.asp">http://www.codeproject.com/listctrl/CListCtrlLink.asp</a></p><p>          (4)    <span style="COLOR: rgb(153,51,0)">subitem的tooltip提示</span><br />                   <a href="http://www.codeproject.com/listctrl/ctooltiplistctrl.asp">http://www.codeproject.com/listctrl/ctooltiplistctrl.asp</a></p><p>          (5)   <span style="COLOR: rgb(153,51,0)"> subitem中显示进度条</span>    <br />                   <a href="http://www.codeproject.com/listctrl/ProgressListControl.asp">http://www.codeproject.com/listctrl/ProgressListControl.asp</a><br />                   <a href="http://www.codeproject.com/listctrl/napster.asp">http://www.codeproject.com/listctrl/napster.asp</a><br />                   <a href="http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/">http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/</a></p><p>          (6)    <span style="COLOR: rgb(153,51,0)">动态改变subitem的颜色和背景色</span><br />                    <a href="http://www.codeproject.com/listctrl/highlightlistctrl.asp">http://www.codeproject.com/listctrl/highlightlistctrl.asp</a><br />                    <a href="http://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/">http://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/</a><br /> <br />          (7)    <span style="COLOR: rgb(153,51,0)">类vb属性对话框</span><br />                    <a href="http://www.codeproject.com/listctrl/propertylistctrl.asp">http://www.codeproject.com/listctrl/propertylistctrl.asp</a><br />                    <a href="http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/">http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/</a><br />                    <a href="http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/">http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/</a><br />  <br />          (8)    <span style="COLOR: rgb(153,51,0)">选中subitem(只高亮选中的item)</span><br />                    <a href="http://www.codeproject.com/listctrl/SubItemSel.asp">http://www.codeproject.com/listctrl/SubItemSel.asp</a><br />                    <a href="http://www.codeproject.com/listctrl/ListSubItSel.asp">http://www.codeproject.com/listctrl/ListSubItSel.asp</a><br />  <br />          (9)    <span style="COLOR: rgb(153,51,0)">改变行高</span><br />                    <a href="http://www.codeproject.com/listctrl/changerowheight.asp">http://www.codeproject.com/listctrl/changerowheight.asp</a><br />  <br />          (10)   <span style="COLOR: rgb(153,51,0)">改变行颜色</span><br />                    <a href="http://www.codeproject.com/listctrl/coloredlistctrl.asp">http://www.codeproject.com/listctrl/coloredlistctrl.asp</a><br />  <br />          (11)   <span style="COLOR: rgb(153,51,0)">可编辑subitem的listctrl</span><br />                    <a href="http://www.codeproject.com/listctrl/nirs2000.asp">http://www.codeproject.com/listctrl/nirs2000.asp</a><br />                    <a href="http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp">http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp</a><br />  <br />          (12)   <span style="COLOR: rgb(153,51,0)">subitem可编辑，插入combobox，改变行颜色，subitem的tooltip提示</span><br />                    <a href="http://www.codeproject.com/listctrl/reusablelistcontrol.asp">http://www.codeproject.com/listctrl/reusablelistcontrol.asp</a><br />  <br />          (13)   <span style="COLOR: rgb(153,51,0)">header 中允许多行字符串</span><br />                    <a href="http://www.codeproject.com/listctrl/headerctrlex.asp">http://www.codeproject.com/listctrl/headerctrlex.asp</a><br />  <br />          (14)   <span style="COLOR: rgb(153,51,0)">插入combobox</span><br />                    <a href="http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/">http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/</a><br />  <br />          (15)   <span style="COLOR: rgb(153,51,0)">添加背景图片</span><br />                    <a href="http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/">http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/</a><br />                    <a href="http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/">http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/</a><br />                    <a href="http://www.vchelp.net/vchelp/archive.asp?type_id=9&amp;class_id=1&amp;cata_id=1&amp;article_id=1088&amp;search_term">http://www.vchelp.net/vchelp/archive.asp?type_id=9&amp;class_id=1&amp;cata_id=1&amp;article_id=1088&amp;search_term</a>=<br />    <br />          (16)  <span style="COLOR: rgb(153,51,0)">自适应宽度的listctrl</span><br />                    <a href="http://www.codeproject.com/useritems/AutosizeListCtrl.asp">http://www.codeproject.com/useritems/AutosizeListCtrl.asp</a><br /></p>          (17)  <span style="COLOR: rgb(153,51,0)">改变ListCtrl高亮时的颜色(默认为蓝色)</span><br />                   处理<code><font face="新宋体"> NM_CUSTOMDRAW <br />           </font><a href="http://www.codeproject.com/listctrl/lvcustomdraw.asp"><font face="新宋体">http://www.codeproject.com/listctrl/lvcustomdraw.asp</font></a></code></div><img src ="http://www.cppblog.com/qiaodong/aggbug/16361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-13 11:44 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/13/16361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OnClose和OnDestroy</title><link>http://www.cppblog.com/qiaodong/archive/2006/12/11/16287.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 11 Dec 2006 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/11/16287.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16287.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/11/16287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16287.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16287.html</trackback:ping><description><![CDATA[
		<p>OnClose()：消息响应函数，响应WM_CLOSE消息，当"关闭"按钮被单击的时候（而不是我们眼睛所见的对话框从屏幕上消失时），该函数被调用，用户在响应OnOk()或者OnCancel()函数之后，不会发送WM_CLOSE消息</p>
		<p>OnDestroy()：消息响应函数，响应WM_DESTROY消息，当一个窗口即将被销毁时，被发送</p>
		<p>在单视图程序中,根据&lt;&lt;深入浅出MFC&gt;&gt;所讲,程序退出时执行的操作顺序为<br />(1)用户点击退出按钮,发送了WM_CLOSE消息<br />(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()<br />(3)在DestroyWindow()中发送了WM_DESTROY消息<br />(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环</p>
		<p>综上，程序先调用OnClose()（也可能不调用），然后调用OnDestroy()（必调用），所以，如果要进行程序结束时的清理工作，应该在OnDestroy（）中，而不是在OnClose()，否则就有可能会出现内存泄漏的危险了！</p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/16287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-11 21:29 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/11/16287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UpdateData (FALSE) (TRUE)</title><link>http://www.cppblog.com/qiaodong/archive/2006/12/11/16284.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 11 Dec 2006 12:41:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/11/16284.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16284.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/11/16284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16284.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16284.html</trackback:ping><description><![CDATA[当你使用了ClassWizard建立了控件和变量之间的联系后：当你修改了变量的值，而希望对话框控件更新显示，就应该在修改变量后调用UpdateData(FALSE)；如果你希望知道用户在对话框中到底输入了什么，就应该在访问变量前调用UpdateData(TRUE)。<img src ="http://www.cppblog.com/qiaodong/aggbug/16284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-11 20:41 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/11/16284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>string table</title><link>http://www.cppblog.com/qiaodong/archive/2006/12/07/16087.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Thu, 07 Dec 2006 06:38:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/07/16087.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16087.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/07/16087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16087.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16087.html</trackback:ping><description><![CDATA[
		<p>一个可以给人很多方便也能制造麻烦的家伙,今天我被他折腾的不轻,加错一个就有出错的危险.<br /><br />事后:<br />这个事情给我的教育很深刻,细致而烦琐的简单工作更加重要,因为一个疏忽造成的结果,有时候是无法<br />承担的.</p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/16087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-07 14:38 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/07/16087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CRECT</title><link>http://www.cppblog.com/qiaodong/archive/2006/12/07/16077.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Thu, 07 Dec 2006 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/12/07/16077.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/16077.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/12/07/16077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/16077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/16077.html</trackback:ping><description><![CDATA[CRECT(left,top,right,bottom)<br />左上右下,第二和第四参数决定上下位置,第一和第三参数决定左右位置.<img src ="http://www.cppblog.com/qiaodong/aggbug/16077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-12-07 10:39 <a href="http://www.cppblog.com/qiaodong/archive/2006/12/07/16077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unicode   Debug和Debug有什么区别？ </title><link>http://www.cppblog.com/qiaodong/archive/2006/11/30/15816.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Thu, 30 Nov 2006 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/11/30/15816.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/15816.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/11/30/15816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/15816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/15816.html</trackback:ping><description><![CDATA[Unicode   Debug和Debug有什么区别？ <br /><br />Unicode   Debug是宽字符(UNICODE)版本，每个字符占用两个字节的存储空间   普通的Debug是单字(MBCS)版本，一个是unicode工程，另一是ansi工程。<br /><br /> 相对于ASCII，Unicode为双字节长的字符集，到目前已定义了世界上绝大多数文字的常用字，ASCII字符集是它的子集，即Unicode字符集兼容ASCII字符集。使用Unicode最大的好处是可以使应用程序方便地实现多语言支持，不再基于CODEPAGE。微软的IE   5.0、WINDOWS   2000，OFFICE   97以上版都是基于UICODE的。   <br />            关于使用UNICODE的问题：因WINDOWS   95、98   不支持UNICODE，WINDOWS   NT、2000，完全支持，若要使基于UNICODE的应用程序在上述OS上运行，那是个较麻烦的问题，请参考微软经典书籍：&lt;&lt;DEVELOPING   INTERNATIONAL   SOFTWARE   FOR   WINDOWS   95   AND   WINDOWS   NT&gt;&gt;   ---   NADINE   KANO   <img src ="http://www.cppblog.com/qiaodong/aggbug/15816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-11-30 16:13 <a href="http://www.cppblog.com/qiaodong/archive/2006/11/30/15816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>listctrl的菜单</title><link>http://www.cppblog.com/qiaodong/archive/2006/11/29/15770.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Wed, 29 Nov 2006 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/11/29/15770.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/15770.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/11/29/15770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/15770.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/15770.html</trackback:ping><description><![CDATA[
		<p>
				<br />void   dialog5::OnRclickList1(NMHDR*   pNMHDR,   LRESULT*   pResult)     <br />  {   <br />  //   TODO:   Add   your   control   notification   handler   code   here   <br />  CMenu   menu1,*menu2;   <br />  CPoint   point1;   <br />  menu1.LoadMenu(IDR_MENU1);   <br />  menu2=menu1.GetSubMenu(0);   <br />  ::GetCursorPos(&amp;point1);   <br />  menu2-&gt;TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,   <br />  point1.x,point1.y,this);   <br />    <br />  *pResult   =   0;   <br />  }   </p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/15770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-11-29 10:48 <a href="http://www.cppblog.com/qiaodong/archive/2006/11/29/15770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于结构体的问题</title><link>http://www.cppblog.com/qiaodong/archive/2006/11/20/15449.html</link><dc:creator>乔栋</dc:creator><author>乔栋</author><pubDate>Mon, 20 Nov 2006 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/qiaodong/archive/2006/11/20/15449.html</guid><wfw:comment>http://www.cppblog.com/qiaodong/comments/15449.html</wfw:comment><comments>http://www.cppblog.com/qiaodong/archive/2006/11/20/15449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qiaodong/comments/commentRss/15449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qiaodong/services/trackbacks/15449.html</trackback:ping><description><![CDATA[
		<p>#include&lt;stdio.h&gt;</p>
		<p>struct a<br />{<br /> int b;<br />};<br />struct b<br />{<br />    int a;<br />};<br />void main()<br />{<br /> a A;<br /> A.b = NULL;<br /> A.b = 1;<br /> <br /> b a;<br /> a.a = 3;<br />}</p>
		<p>在C的环境下，会报错，在C++的情况，这样的操作就是允许的。<br />在C++的编译器中，允许将结构体名作为一个变量名来对待。</p>
<img src ="http://www.cppblog.com/qiaodong/aggbug/15449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qiaodong/" target="_blank">乔栋</a> 2006-11-20 10:54 <a href="http://www.cppblog.com/qiaodong/archive/2006/11/20/15449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>