??xml version="1.0" encoding="utf-8" standalone="yes"?>51久久夜色精品国产,少妇熟女久久综合网色欲,久久精品国产亚洲AV嫖农村妇女http://www.shnenglu.com/qiaodong/category/2993.html耶\撒冷对你来说意味着什么?zh-cnTue, 20 May 2008 07:17:19 GMTTue, 20 May 2008 07:17:19 GMT60Cstring and char *http://www.shnenglu.com/qiaodong/archive/2007/08/03/29310.html乔栋乔栋Fri, 03 Aug 2007 09:05:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/08/03/29310.htmlhttp://www.shnenglu.com/qiaodong/comments/29310.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/08/03/29310.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/29310.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/29310.html   
  若将char*转换成CStringQ除?jin)直接赋值外Q还可用CString::formatq行。例如:(x)  
  char   chArray[]   =   "This   is   a   test";  
  char   *   p   =   "This   is   a   test";  
   
  ? 
   
  LPSTR   p   =   "This   is   a   test";   或在已定义Unicode应的用程序中  
   
  TCHAR   *   p   =   _T("This   is   a   test");   ? 
   
  LPTSTR   p   =   _T("This   is   a   test");  
  CString   theString   =   chArray;  
  theString.format(_T("%s"),   chArray);  
  theString   =   p;  
   
  2、CString转换成char*  
   
  若将CStringc{换成char*(LPSTR)cdQ常怋用下列三U方法:(x)  
   
  Ҏ(gu)一Q用强制{换。例如:(x)  
   
  CString   theString(   "This   is   a   test"   );  
  LPTSTR   lpsz   =(LPTSTR)(LPCTSTR)theString;   Ҏ(gu)二,使用strcpy。例如:(x)  
   
  CString   theString(   "This   is   a   test"   );  
  LPTSTR   lpsz   =   new   TCHAR[theString.GetLength()+1];  
  _tcscpy(lpsz,   theString);   需要说明的是,strcpy(或可UdUnicode/MBCS的_tcscpy)的第二个参数?  const   wchar_t*   (Unicode)或const   char*   (ANSI)Q系l编译器会(x)自动对其q行转换? 
   
  Ҏ(gu)三,使用CString::GetBuffer。例如:(x)  
   
  CString   s(_T("This   is   a   test   "));  
  LPTSTR   p   =   s.GetBuffer();  
  //   在这里添加用p的代? 
  if(p   !=   NULL)   *p   =   _T('\0');  
  s.ReleaseBuffer();   //   使用完后?qing)时释放Q以便能使用其它的CString成员函数  


乔栋 2007-08-03 17:05 发表评论
]]>
socket 初始?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/07/22/28582.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/28582.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/07/22/28582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/28582.html</wfw:commentRss><trackback:ping>http://www.shnenglu.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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">  WORD   wVersionRequested   </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">   MAKEWORD(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,   </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);       <br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  WSADATA   wsaData;     <br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">   err   </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">   WSAStartup(wVersionRequested,   </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">wsaData);     <br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">   (err   </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">   </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)     <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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>  </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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_179_205_Open_Text><span style="COLOR: #000000">{   <br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>  WSACleanup();   <br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>  }</span></span><span style="COLOR: #000000">  </span></div> <img src ="http://www.shnenglu.com/qiaodong/aggbug/28582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-07-22 20:56 <a href="http://www.shnenglu.com/qiaodong/archive/2007/07/22/28582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获得控g内容http://www.shnenglu.com/qiaodong/archive/2007/06/04/25528.html乔栋乔栋Mon, 04 Jun 2007 15:18:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/06/04/25528.htmlhttp://www.shnenglu.com/qiaodong/comments/25528.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/06/04/25528.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/25528.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/25528.htmlEdit<输入?/span>>   
    
  
1.(CWnd   *)GetDlgItem(IDC_EDIT_1))->SetWindowText("0");   
    
  
2.int   n=GetDlgItemInt(IDC_EDIT_1,   NULL,true);     
    
  
3.(CWnd   *)GetDlgItem(IDC_EDIT_1))->GetWindowText(cs);   
    
  Combox
<下拉?/span>>   
    
  
1.((CComboBox   *)GetDlgItem(IDC_COMB_1))->SetCurSel(1);   
    
  
2.   GetDlgItemText(IDC_COMB_1,   cs,   50);   
    
  
3.int   i=m_COM.GetCurSel();     
      m_COM.GetLBText(i,cs);     
    
  
4.m_COM.AddString(cs);m_COM.DeleteString(0);m_COM.SetCurSel(0);   
      
    
      
    
  Radio
<单选按?/span>>     
  
1.((CButton   *)GetDlgItem(IDC_RADIO_1))->SetCheck(true);   
    
  
2.if   (((CButton   *)GetDlgItem(IDC_RADIO_1))->GetCheck())   {}   
    
  
3.((CButton   *)GetDlgItem(IDC_RADIO_1))->SetCheck(true);   
      
    
      
    
  List   Control
<列表>   
    
  
1.m_list2.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);       m_list2.InsertColumn(0,"TagID",LVCFMT_LEFT,60);   
      m_list2.InsertColumn(
1,"TagType",LVCFMT_CENTER,120);   
      m_list2.InsertItem(i,cs1);     
      m_list2.SetItemText(i,
1,cs2);   
    
  
2.if(m_list2.GetSelectedItem()!=-1)   
        
{   
            
int   i=m_list2.GetSelectionMark();   
            cs
=m_list2.GetItemText(i,0);   
        }
     
    
  
3.int   i=m_List2.GetItemCount();     
    
  
4.m_list2.DeleteItem(i);m_list2.DeleteAllItems();   
      
    
      
    
  ListBox
<列表?/span>>   
    
  
1.((CListBox   *)listBox)->InsertString(0,   str);   
      
    
      
    
  Button
<按钮>   
    
  
1.((CWnd   *)GetDlgItem(IDC_BUTTON_1))->ShowWindow(true);   
    
  
2.((CWnd   *)GetDlgItem(IDC_BUTTON_1))->EnableWindow(true);   
      


乔栋 2007-06-04 23:18 发表评论
]]>
资源打成DLLhttp://www.shnenglu.com/qiaodong/archive/2007/04/24/22712.html乔栋乔栋Tue, 24 Apr 2007 04:00:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/04/24/22712.htmlhttp://www.shnenglu.com/qiaodong/comments/22712.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/04/24/22712.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/22712.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/22712.html阅读全文

乔栋 2007-04-24 12:00 发表评论
]]>
VC中动态添加控?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/04/23/22640.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/22640.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/04/23/22640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/22640.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/22640.html</trackback:ping><description><![CDATA[<strong>动态控件是指在需要时由Create()创徏的控Ӟq与预先在对话框中放|的控g是不同的?<br><br>  一、创建动态控Ӟ(x)<br><br>  Z(jin)对照Q我们先来看一下静(rn)态控件的创徏?br><br>  攄?rn)态控件时必须先徏立一个容器,一般是对话框,q时我们在对话框~辑H口中,从工L(fng)口中拖出所需控g攑֜对话框中卛_Q再适当修改控gIDQ设|控件属性,一个静(rn)态控件就创徏好了(jin)Q当对话框被昄Ӟ其上的控件也?x)显C?br><br>  ?rn)态控件不需要调用Create()函数来创建?br><br>  而创建动态控件有很大不同Q以下以按钮ZQ看一下动态控件的创徏q程Q?br><br>  1.建立控gIDP(x)<br><br>  IDh控g的标识,创徏控g前必d为它讄一个ID受?br><br>  打开资源中的“String Table”Q在I白行上双击鼠标Q这时会(x)弹出一个ID属性对话框Q在其中的ID~辑框中输入IDQ如QIDC_MYBUTTONQ在Caption中输入控件标题或注解Q注QCaption框不能ؓ(f)I,为空?x)导致创建失败?j)Q这里我输入的是按钮上要昄的文?-动态按钮?br><br>  2.建立控g对象Q?br><br>  不同U类的控件应创徏不同的类对象Q?br><br>  ·按钮控g CButton Q包括普通按钮、单选按钮和复选按钮)(j)<br>  ·~辑控g CEdit<br>  ·?rn)态文本控?CStatic<br>  ·标签控g CTabCtrl<br>  ·旋{控g CSpinButtonCtrl<br>  ·滑标控g CSliderCtrl<br>  ·多信息编辑控?CRichEditCtrl<br>  ·q度条控?CProgressCtrl<br>  ·滚动条控?CSrcollBar<br>  ·l合框控?CComboBox<br>  ·列表框控?CListBox<br>  ·囑փ列表控g CImageCtrl<br>  ·?wi)状控g CTreeCtrl<br>  ·动画控g CAnimateCtrl<br><br>  本例中我们创Z个CButtoncȝ普通按钮。注意不能直接定义CButton对象Q如QCButton m_MyBut;q种定义只能用来l静(rn)态控件定义控制变量,不能用于动态控件?br><br>  正确做法是用new调用CButton构造函数生成一个实例:(x)<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>  然后用CButtoncȝCreate()函数创徏Q该函数原型如下Q?br><br> <table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tbody> <tr> <td>BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );</td> </tr> </tbody> </table> <br>  lpszCaption是按钮上昄的文本;dwStyle指定按钮风格Q可以是按钮风格与窗口风格的l合Q取值有Q?br><br>  H口风格Q?br><br>  ·WS_CHILD 子窗口,必须?br>  ·WS_VISIBLE H口可见Q一般都?br>  ·WS_DISABLED 用H口Q创建初始状态ؓ(f)灰色不可用的按钮时?br>  ·WS_TABSTOP 可用Tab键选择<br>  ·WS_GROUP 成组Q用于成l的单选按钮中的第一个按?br><br>  按钮风格Q?br><br>  ·BS_PUSHBUTTON 下压式按钮,也即普通按?br>  ·BS_AUTORADIOBUTTON 含自动选中状态的单选按?br>  ·BS_RADIOBUTTON 单选按钮,不常?br>  ·BS_AUTOCHECKBOX 含自动选中状态的复选按?br>  ·BS_CHECKBOX 复选按钮,不常?br>  ·BS_AUTO3STATE 含自动选中状态的三态复选按?br>  ·BS_3STATE 三态复选按钮,不常?br> <br>  以上风格指定?jin)创建的按钮cdQ不能同时用,但必L其一?br><br>  ·BS_BITMAP 按钮上将昄位图<br>  ·BS_DEFPUSHBUTTON 讄为默认按钮,只用于下压式按钮Q一个对话框中只能指定一个默认按?br>  ·rect指定按钮的大和位置Q?br>  ·pParentWnd指示拥有按钮的父H口Q不能ؓ(f)NULLQ?br>  ·nID指定与按钮关联的IDP用上一步创建的ID受?br><br>  不同控gcȝCreate()函数略有不同Q可参考相兌料?br><br>  例:(x)p_MyBut->Create( "动态按?, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );<br>q样Q我们就在当前对话框中的(20,10)处创Z(jin)?0Q高30Q按钮文字ؓ(f)“动态按?#8221;的下压式按钮?br><br>  Z(jin)使创E更方便易用Q我定义?jin)如下函敎ͼ?x)<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->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 )是从字符串表中读取按钮文本,q样在创建按钮IDӞ应该把文本设|好Q参数nStyle为除必须风格外的额外风格?br><br>  以下Q我调用该函数创Z个按钮,q指定第一个按钮ؓ(f)默认按钮Q按钮的ID已预先设|好?jin)?x)<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>Q?br><br>  动态控件的响应函数不能用ClassWizarddQ只能手动添加。仍以上面的按钮ZQ我们制作按钮的单击响应函数?br><br>  1.在MESSAGE_MAP中添加响应函敎ͼ(x)<br><br>  MESSAGE_MAP表中定义?jin)消息响应函敎ͼ其格式?f)Q消息名(ID,函数?Q当我们用ClassWizardd函数Ӟ?x)自动添加在AFX_MSG_MAP括v的区间内Q如Q?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>  手工d时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不能正常工作Q如Q?<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是按钮单?yn)L息?br><br>  2.在头文g中添加函数定义:(x)<br><br>  用ClassWizardd函数Ӟ?x)在头文件的AFX_MSG区间内添加函数定义,如:(x) <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>  我们模仿q种形式Q只是把函数定义d到AFX_MSG区间外就行了(jin)Q?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.~写消息响应函数Q?br><br>  以上是把消息和函数关联v来了(jin)Q具体在单击按钮后应做的工作在函C完成Q?<br><br> <table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tbody> <tr> <td>void CTextEditorView::OnMybut1()<br>{<br>MessageBox( "哈!你单M(jin)动态按钮? );<br>}<br>void CTextEditorView::OnMybut2()<br>{<br>……<br>}<br>void CTextEditorView::OnMybut3()<br>{<br>……<br>} </td> </tr> </tbody> </table> <br>  除了(jin)按钮的响应函数外Q你q可以用上面获得的指针访问按钮,如:(x)<br><br>  修改按钮的大和位置Qp_MyBut[0]->MoveWindow(……);<br><br>  修改按钮文本Qp_MyBut[0]->SetWindowText(……);<br><br>  昄/隐藏按钮Qp_MyBut[0]->ShowWindow(……);{等?br>三、回收资源:(x)<br><br>  ׃动态控件对象是由new生成的,它不?x)被E序自动释放Q所以需手工释放。在控g不再使用时可以删除它Q?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>  以上是按钮控g动态生成的Ҏ(gu)。下面,再看一下单选按钮的动态生成问题?四、实例:(x)单选按钮组的动态生?br><br>  单选按钮也属于CButtonc,但由于单选按钮L成组使用的,所以它在制作和使用上与普通按钮有一定区别?br><br>  假设有三个单选按钮组成一l,初始ӞW一个单选按钮处于选中状态?br><br>  我们先来看静(rn)态制作方法:(x)在对话框中放|三个单选按钮,讄属性如下:(x)<br><br>  ·Radio1属性:(x)Visible、Group、Tab stop、Auto<br>  ·Radio2属性:(x)Visible、Tab stop、Auto<br>  ·Radio3属性:(x)Visible、Tab stop、Auto<br><br>  q样的属性设|就把三个单选按钮分成了(jin)一l,它们一ơ只能有一个被选中Q若对话框中q有其它成组的单选按钮,使用时也?x)互不干扰。但q时q没有ɽW一个按钮处于选中状态?br><br>  接着qClassWizardl单选按钮添加变量,q里只需为第一个单选按钮添加变量即可。设变量名ؓ(f)m_RadioQ类型选ؓ(f)int型。在构造函CClassWizard把m_Radio的D|ؓ(f)-1Q我们把它改?Q这样在q行E序时可以看到第一个单选按钮处于选中状态了(jin)。之后,q应该用ClassWizardZ个单选按钮添加单d应函敎ͼ在里面修改m_Radio的值对应三个单选按钮就可以?jin)?br><br>  以上是通常制作单选按钮组的办法,现我们欲改ؓ(f)动态生成,主要要解x(chng)钮分l和单击控制问题。以下ؓ(f)制作步骤Q?br><br>  1.定义三个单选按钮的IDQ?br><br>  打开资源中的“String Table”Q在其中d三个ID|(x)<br><br>  ·W一个:(x)ID为IDC_MYRADIO1QCaption为单?<br>  ·W二个:(x)ID为IDC_MYRADIO2QCaption为单?<br>  ·W三个:(x)ID为IDC_MYRADIO3QCaption为单?<br><br>  其中Caption为按钮上要显C的文字Q可Ҏ(gu)需要设|?br><br>  2.用CButtoncȝCreate()函数生成三个单选按钮:(x)<br><br>  为方便v见,先定义一个函数生成单选按钮:(x) <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->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”中读取按钮文本,Create()函数中设定了(jin)单选按钮必ȝ属性,其中包括了(jin)Visible、Tab stop、Auto属性?br><br>  参数nID为单选按钮IDPrect为单选按钮尺寸,nStyle为除必要属性外的其它属性。返回gؓ(f)指向新徏按钮的指针?br><br>  有了(jin)q个函数后,创徏单选按钮组时只要依ơ调用该函数卛_Q其中单选按钮组的第一个单选按钮必L定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.定义单选按钮组的控制变量,讄W一个单选按钮ؓ(f)选中状态:(x)<br><br>  q里不能用ClassWizardd变量Q也不要在DoDataExchange()中添加控制变量,因ؓ(f)动态控件一开始ƈ不存在,在DoDataExchange()中添加控制变量会(x)造成q行错误。这里我们只需在头文g中随意定义一个int型变量作为控制变量即可,如:(x)<br><br> <table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tbody> <tr> <td>int m_SelRadio;</td> </tr> </tbody> </table> <br>  在构造函C讄其初gؓ(f)0Qm_SelRadio = 0;<br><br>  在上面的创徏按钮的语句中Q用SetCheck()函数讄初始选中的按钮:(x)<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]->SetCheck(1); //讄W一个单选ؓ(f)选中状?</td> </tr> </tbody> </table> <br>  在SetCheck()函数中,参数?表示讄为选中状态,?表示未选中状态?br><br>  4.d鼠标单击响应函数Q?br><br>  鼠标单击某单选按钮后Q其状态已l能自动改变Q这里我们还需修改控制变量m_SelRadio的|以便跟踪选中的单选按钮?br><br>  首先在MESSAGE_MAP中把鼠标单击消息与响应函数联pv来:(x) <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) //单选按?<br>ON_BN_CLICKED(IDC_MYRADIO2, OnMyRadio2) //单选按?<br>ON_BN_CLICKED(IDC_MYRADIO3, OnMyRadio3) //单选按?<br>END_MESSAGE_MAP() </td> </tr> </tbody> </table> <br>  然后在头文g的MESSAGE_MAP中定义单d敎ͼ(x)<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(); //单选按?<br>afx_msg void OnMyRadio2(); //单选按?<br>afx_msg void OnMyRadio3(); //单选按?<br>DECLARE_MESSAGE_MAP() </td> </tr> </tbody> </table> <br>  q里注意不要把函数加在AFX_MSG区间内,以防影响ClassWizard的用?br><br>  定义具体的响应函敎ͼq里是用手工加入的,不是用ClassWizard加入的)(j)Q?br><br> <table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tbody> <tr> <td>//单击单选按? void CTextEditorView::OnMyRadio1() <br>{<br>m_SelRadio=0;<br>} <br><br>//单击单选按? void CTextEditorView::OnMyRadio2() <br>{<br>m_SelRadio=1;<br>} <br><br>//单击单选按? void CTextEditorView::OnMyRadio3() <br>{<br>m_SelRadio=2;<br>}</td> </tr> </tbody> </table> <br>  5.回收资源Q?br><br>  在析构函CQ回收创建的单选按钮(也可以在不用单选按钮时立即回收Q:(x)<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<3; i++)<br>{<br>if(p_MyRadio[i])<br>delete p_MyRadio[i];<br>}<br>}</td> </tr> </tbody> </table> <br>  以上是动态控件的生成和响应方法,各种不同的控件做法略有不同,但思\和步骤都是类似的Q希望以上实例对你能够有所帮助?<br><br><br><br><br> <img src ="http://www.shnenglu.com/qiaodong/aggbug/22640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-04-23 14:44 <a href="http://www.shnenglu.com/qiaodong/archive/2007/04/23/22640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用ITaskbarList接口操纵Windowsd栏程序按钮的状?http://www.shnenglu.com/qiaodong/archive/2007/04/22/22606.html乔栋乔栋Sun, 22 Apr 2007 14:45:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/04/22/22606.htmlhttp://www.shnenglu.com/qiaodong/comments/22606.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/04/22/22606.html#Feedback1http://www.shnenglu.com/qiaodong/comments/commentRss/22606.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/22606.htmlclass CXDlg : public CDialog
{
    ......
    public:
        typedef ITaskbarList *LPITaskbarList;
        LPITaskbarList pTaskbar;
    ......
};

Step 2: 初始?d栏COM 对象

BOOL CXDlg::OnInitDialog()
{
    ......
    // Initializes the Component Object Model(COM)
    CoInitialize(0);
    // We call below function since we only need to create one object
    CoCreateInstance(
        CLSID_TaskbarList,
        0,
        CLSCTX_INPROC_SERVER,
        IID_ITaskbarList,
        (void**)&pTaskbar
    );
    // Below function will initialize the taskbar list object
    pTaskbar->HrInit();
    ......
}

Step 3: 使用Q删?昄 d栏程序按?/u>

void CXDlg::OnBnClickedButtonHide()
{
    pTaskbar->DeleteTab(this->GetSafeHwnd());
}

void CXDlg::OnBnClickedButtonShow()
{
    pTaskbar->AddTab(this->GetSafeHwnd());
}






乔栋 2007-04-22 22:45 发表评论
]]>
应用E序从Q务管理器中消?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/04/09/21533.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/21533.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/04/09/21533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/21533.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/21533.html</trackback:ping><description><![CDATA[[问题]<br>通常我们按下CTRL+ATL+DELl合键后Q可以看到正在运行的E序或者进E,有没有办法让E序从CTRL+ATL+DEL消失掉呢Q也是说让正在q行的程序对CTRL+ATL+DEL不可见?br>[解答]<br>{案是肯定的Q办法如下:(x)<br>使用Win32 API 函数RegisterServiceProcessQ但是这个API函数的文档你是很难找到的。这里我们要用一下汇~?br><br>#include <windows.h><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>  CADInit(); //加蝲 DLL q创Z指向它指?br>  HideApp(); //隐藏E序<br>  //ShowApp(); //昄E序<br><br>  //其他处理或调?br>  <br>  CADClean(); //卸蝲 DLL<br>  return 0; //retrun 0 因ؓ(f)没有q入消息循环<br>}<br><br>void CADInit(void)<br>{<br>  //加蝲 kernel32.dll<br>  hLibrary = LoadLibrary("kernel32.dll");<br>  //获取函数RegisterServiceProcess的地址<br>  regproc = GetProcAddress(hLibrary, "RegisterServiceProcess");<br>}<br><br>void HideApp(void)<br>{<br>  //实现E序的隐?br>  __asm<br>  {<br>   push 1<br>   push 0<br>   call regproc<br>  }<br>  return;<br>}<br><br>void ShowApp(void)<br>{<br>  //恢复状?br>  __asm<br>  {<br>      push 0<br>      push 0<br>      call regproc<br>  }<br>  return;<br>}<br><br>void CADClean(void)<br>{<br>  //卸蝲 DLL<br>  FreeLibrary(hLibrary);<br>  return;<br>}<br>本程序在W2K和W(xu)in9x试通过? <img src ="http://www.shnenglu.com/qiaodong/aggbug/21533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-04-09 14:51 <a href="http://www.shnenglu.com/qiaodong/archive/2007/04/09/21533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ON_NOTIFY 消息http://www.shnenglu.com/qiaodong/archive/2007/04/09/21513.html乔栋乔栋Mon, 09 Apr 2007 02:12:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/04/09/21513.htmlhttp://www.shnenglu.com/qiaodong/comments/21513.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/04/09/21513.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/21513.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/21513.html问题:
对buttonQ我直接用WM_COMMAND是可以的?nbsp;现在我想试使用VC的ON_NOTIFYQ怎么试也不v作用?br>
解答:
ON_NOTIFY是针对WM_NOTIFY的消息宏Q而W(xu)M_NOTIFY是针?nbsp;
ListCtrl,TreeCtrl,TabCtrl{通用控g使用的消?nbsp;
buttonQlistbox{基本控件是不会(x)用到q个消息?nbsp;.

 



乔栋 2007-04-09 10:12 发表评论
]]>
VC中用map来定位错误代?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/03/26/20592.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/20592.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/03/26/20592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/20592.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/20592.html</trackback:ping><description><![CDATA[ <span id="2ame86o" class="content">作ؓ(f)E序员,qx(chng)最担心(j)见到的事情就是程序发生了(jin)崩溃Q无论是指针界q是非法操作Q都给我们的应用系l造成巨大的损失。但在一个大型系l的试q程中,初期出现E序崩溃g成了(jin)不可避免的事。其实测试中出现E序崩溃q不可怕,反而是试的成功。我们更为关?j)的是程序中的哪一行导致了(jin)pȝ崩溃Q这h们才能有针对性的q行Ҏ(gu)?br />  在VC中,我们可以利用出现E序崩溃时VC的自动蟩转,定位到出错代码行。但在大量的压力试Ӟ其是多U程试Ӟ同时出现几十个错Q这时VC本n的出错蟩转往(xin)往(xin)?x)失c(din)?br />  在这里我们介l一U辅助查扄序崩溃代码行的好Ҏ(gu)Q它的核?j)就是利用编译时生成MAP文g中的信息来定位代码行?br />下面开始我们的介绍?br />  首先我们必须生成E序的MAP文g。那么什么是 MAP 文g呢?单地Ԍ MAP 文g是程序的全局W号、源文g和代码行号信息的唯一的文本表C方法,是整个程序工E信息的?rn)态文本。它可以在Q何地斏VQ何时候用,不需要有额外的程序进行支持,仅仅通过一个文本阅d具如Ultra Edit可以打开?jin)。而且Q这是唯一能找出程序崩溃代码行的救星?br />  那么我们应该如何生成MAP文g呢??VC 中,我们可以按下 Alt+F7Q打开“Project Settings”选项,选择 C/C++ 选项卡,q在最下面?Project Options 里面输入Q?Zd Q然后要选择 Link 选项卡,选中“Generate mapfile”复选框Qƈ在最下面?Project Options 里面输入Q?mapinfo:linesQ表C生?MAP 文gӞ加入行信息。最后按?F7 来编译生?EXE 可执行文件和 MAP 文gQ此时可以在工程的Debug目录下找到刚刚生成的MAP文gQ文件名为“工E名.map”?br />  通过上面的步骤,已经得到?MAP 文gQ那么我们该如何利用它呢Q让我们从一个简单的实例入手Q一步一步演CZ用MAP文g定位E序崩溃行的q程?br />首先假设我们的VC工程中有下面q个文gQ?br />//*****************************************************<br />// E序名称Q演C如何通过崩溃地址扑և源代码的出错?br />// 作者:(x)刘可<br />// 日期Q?003-6-19<br />// 本程序会(x)产生“除0错误”,所以会(x)D<br />// E序崩溃Q弹出“非法操作”对话框?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 />很显然本E序有“除0错误”,?Debug 方式下编译,q行时会(x)产生“非法操作”。我们记录下产生崩溃的地址——在我的机器上是 0x0040102f 。这个在不同的机器上可能地址不同Q但Cq个地址我们下面要使用?br />我们打开它的 MAP 文gQ(q里列出我们比较兛_(j)的内容,其他的就略过?jin)?j)<br /><br />abortQ工E名Q?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 q栏Q我们可以发现第一个比崩溃地址 0x0040102f 大的函数地址?0x0040103c Q所以在 0x0040103c q个地址之前的那个入口就是生崩溃的函数Q也是q行Q?br /><br />0001:00000020 ?crashtest@@YAHHH@Z 00401020 f main.obj<br /><br />  因此Q发生崩溃的函数是 ?crashtest@@YAHHH@ZQ所有以问号开头的函数名称都是 C++ 修饰的名U。所以在我们的源E序中,q个发生崩溃的函数就?crashtest ()Q?br /><br />  现在我们便轻而易丑֜知道?jin)发生崩溃的函数名称。把它记下来Q然后我们将要直接定位发生崩溃的代码行了(jin)。我们注?MAP 文g的最后部分——代码行信息QLine numbers informationQ,它是以这L(fng)形式昄的:(x)<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 />  W一个数字代表在源代码中的代码行PW二个数是该代码行在所属的代码D中的偏U量。如果要查找代码行号Q需要用下面的公式做一些十六进制的减法q算Q?br /><br />崩溃行偏U?= 崩溃地址QCrash AddressQ- 基地址QImageBase AddressQ- 0x1000<br /><br />  Z么要q样做呢Q因为我们得到的崩溃地址都是?偏移地址QRvaQ? 基地址QBaseQ得来的Q所以在计算行号的时候要把基地址减去。一般情况下Q基地址的值是 0x00400000 。另外,׃一般的 PE 文g的代码段都是?0x1000 偏移开始的Q所以也必须减去 0x1000 ?br />  所以我们的Q崩溃行偏移 = 0x0040102f - 0x00400000 - 0x1000 = 0x2f<br />我们在MAP 文g的中的代码行信息里查找不过计算l果0x2fQ但却最接近的数。发现是 main.cpp 文g中的Q?br /><br />14 0001:0000002b<br /><br />  也就意味着在源代码中的W?14 行!让我们来看看源代码,注意注释行和I也要计算在内Q程序的W?4行ؓ(f)Q?br /><br />c = a/b;<br /><br />果然是W?14 行啊Q它发生?jin)“除0异常”!<br /><br />  Ҏ(gu)已经介绍完了(jin)Q从今以后,我们可以精地定位到源代码中的崩溃行,而且只要~译器可以生?MAP 文gQ无论在WINq_q是UNIXq_Q本Ҏ(gu)都是适用的?br />  本文我们只是列D?jin)一个非常简单的“除0异常”例子,使用MAP文g的效力或许还?sh)十分明显。但怿在我们的大型应用pȝ调试中,使用MAP文g的辅助方法来快速定位发生程序崩溃的函数以及(qing)代码行,会(x)为我们的E序调试工作节省大量旉和精力,提高我们的调试质量。我们甚臛_以要求远地用L(fng)接提供程序崩溃的地址Q然后就可以在自己机器上利用MAP文g?rn)态地扑ֈ出错的那行,q在E序中进行相应修正了(jin)?br /><br />&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&<br /><br />VC7下运行OK.<br /><br /><br /></span> <img src ="http://www.shnenglu.com/qiaodong/aggbug/20592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-03-26 10:37 <a href="http://www.shnenglu.com/qiaodong/archive/2007/03/26/20592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自我反省http://www.shnenglu.com/qiaodong/archive/2007/03/25/20575.html乔栋乔栋Sun, 25 Mar 2007 14:57:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/03/25/20575.htmlhttp://www.shnenglu.com/qiaodong/comments/20575.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/03/25/20575.html#Feedback2http://www.shnenglu.com/qiaodong/comments/commentRss/20575.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/20575.html
从前的我,热衷于收集网l上所有我可能?x)用到的技?qؓ(f)能在自己的作品中出现q样的技巧而兴奋不?

现在的我,热衷于看别h写下的文?q尝试理解它的意?q速的记录下来,q且更加q速的忘掉.

来的我......

我想,来应该试d一些这L(fng)文章,M一个书写者的角度来观感别人的作品,或许更有收获.


从前的我,不知道自己是不是能当一个好E序?

现在的我,知道自己可以作一个好E序?但是不知道下来怎么?

来的我.......

不知?

从前的我,热衷C交,喜欢琢磨I着饮食.

现在的我,更加喜欢耐脏而朴素的衣服,更加口健康的食?当然,廉仯?br />
来的我.......

也许,?x)追求时装?x)品位食,也可能会(x)更喜Ƣ朴素的衣服,和健庯(g)廉L(fng)食品.

从前,我没有这L(fng)文字.

现在,我尝试将q样劈ؓ(f)横枝竖条的烂木头一h字组合v?却ؓ(f)其蘪然倒塌而沮丧不?

来,我会(x)写出更好的更满意的文字去记录q些历程,像大厦一样坚?

乔栋 2007-03-25 22:57 发表评论
]]>
VC 界面?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/03/21/20272.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/20272.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/03/21/20272.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/20272.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/20272.html</trackback:ping><description><![CDATA[ <p>GuiToolkit(开源,cMVisual Studio 2003风格)<br /><a >http://www.beyondata.com/default.htm</a></p> <p>GardenUI(免费Q界面效果挺好的,XMLQ代?界面 分离)<br /><a >http://www.gardenui.com/</a></p> <p>CJLib(开源,免费QUNICODE~码,是xtreme toolkit的前生,但xtreme toolkit收费?<br /><a >http://www.codejock.com/</a></p> <p>LibUIDK(部分免费Q不开源,效果?适合贴图)<br /><a >http://www.iuishop.com/download.htm</a></p> <p>BCGControlBar(收费Q界面感觉和OfficecM)<br /><a >http://www.bcgsoft.com</a></p> <p>SKin++(收费Q界面很好看Q从它的截图上可以看?<br /><a >http://www.uipower.com/</a></p> <p>SkinMagic(收费Q看h像Office)<br /><a >http://appspeed.com/html/download.html</a></p> <p>ActiveSkin(未知)<br /><a >http://www.softshape.com/software/develop/</a></p> <p>SYGUI(收费,cMOffice)<br /><a >http://www.sygui.com/</a><br /><br /><br /><br /><br /><br /><br /></p> <img src ="http://www.shnenglu.com/qiaodong/aggbug/20272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-03-21 10:42 <a href="http://www.shnenglu.com/qiaodong/archive/2007/03/21/20272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也许有用(也谈VC中ModifyStyle&ModifyStyleEx无法改变控g的Style)http://www.shnenglu.com/qiaodong/archive/2007/03/19/20153.html乔栋乔栋Mon, 19 Mar 2007 10:30:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/03/19/20153.htmlhttp://www.shnenglu.com/qiaodong/comments/20153.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/03/19/20153.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/20153.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/20153.html (tng)
 (tng) (tng) (tng) (tng) 一个View中用C(jin)一个CListCtrlQ在OnInitialUpdate函数里面他调用了(jin)m_listCtrl.ModifyStyleEx(0, LVS_EX_FULLROWSELECT);但是l果是ƈ没有改变View中这个ListCtrl的效果?/div>
 (tng)
 (tng) (tng) (tng) (tng) 仔细的查阅了(jin)MSDN的关于ModifyStyleEx的说明,发现没什么可以的地方Q调试几遍发C没异常,最后在|上一搜烦(ch)ModifyStyleExQ结果发现碰到这个问题的朋友q真不少Q有一遍关于ModifyStyle和ModifyStyleEx无法改变样式的解x(chng)法的文章被{载得到处都是Q不仅感慨现在的互联|信息重复程度~~l果看完文章很失望,他完全是重新Create?jin)一个控件?/div>
 (tng)
 (tng) (tng) (tng) (tng) 最后经q努力,发现使用SetExtendStyle函数可以实现改变Style的功能?/div>
 (tng)
 (tng) (tng) (tng) (tng) 有一Ҏ(gu)可以肯定圎ͼ如果你重构一个控件(h)承自CListCtrlQ那么你可以在该控g的OnCreate中用ModifyStyle或者ModifyStyleExQ这都是可以辑ֈ目的的,但是如果控g的一个实例是另一个窗口的成员变量Q那么你在这个窗口的初始化函C调用该控件的ModifyStyle或者ModifyStyleEx是不能达到目的的Q有些关联的一个说明是SetWindowLong?x)因为控件和调用者不在同一q程而失败(ModifyStyle和ModifyStyleEx函数中有调用SetWindowLongQ?







乔栋 2007-03-19 18:30 发表评论
]]>About ' DLL ' something (孙鑫VC 19?DLL)http://www.shnenglu.com/qiaodong/archive/2007/03/15/19894.html乔栋乔栋Thu, 15 Mar 2007 07:11:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/03/15/19894.htmlhttp://www.shnenglu.com/qiaodong/comments/19894.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/03/15/19894.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/19894.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/19894.html 动态链接库的连接方? 昑ּ链接,隐式链接

在命令行下运行当前目录下(如C:\Documents and Settings\Tony\桌面\dll1\Debug),q行命o(h)dumpbin,如果不能q行,说明环境扑ֈ损坏,利用vcvars32.bat(VC87 / VC7 目录下Bin 文g夹直接拖入然后运?. q行dumpbin -exports dll1.dll可以看到DLL中到处函数名.

Code:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dll1.cpp:

_declspec(dllexport) int add(int a, int b )
{
 (tng) (tng) (tng) (tng) (tng) (tng) (tng)return a+b;
}

_declspec(dllexport)int subtract(int a, int b)
{
 (tng) (tng) (tng) (tng) (tng) (tng) (tng)return a-b;
}
_declspec(dllexport)表示为导出函?可供应用E序调用?extern C"表示,可以使用其他~程语言讉Kdll中的函数.

~译后可以得到DLL1.DLL文g.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

dlltest.dlg

extern int add(int x,int y);
extern int subtract(int x,int y);
//_declspec(dllimport) int add(int a, int b )
//_declspec(dllimport)int subtract(int a, int b) (tng) (tng) //q样的方法告诉编译器q些函数是从一个dll中调用的函数.~译器就能调用相应的lib文g,提高q行效率

extern可以|于变量或?/font>函数前,以标C变量或?/font>函数的定义在别的文g中,提示~译器遇到此变量?/font>函数时在其他模块中寻扑օ定义

 (tng)CString str;
 (tng)str.Format("3+5=%d",add(3,5));
 (tng)MessageBox(str);

~译器工E属性LINK-->input-->additional dependencies d相应的lib文g,LINK-->input-->Module defintion fileddef文g.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如何昑ּ的加载一个动态链接库
动态加载不需要lib文g,只需要dll文g卛_
HINSTANCE与HMODULE可以通用

HInstance hinst;
hinst = Loadlibrary("dll2.dll"); (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //昑ּ加蝲
typedef int (*ADDPROC)(int a , int b); (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //定义一个函数指?br />ADDPROC Add = (ADDPROC)getprocAdress(hinst, "add"); (tng) (tng) (tng) //获得函数指针
if(!add)
{
 (tng) (tng) (tng)messagebox("fail");
}
else
{
 (tng) (tng) (tng) (tng)CString str;
 (tng) (tng) (tng) (tng)str.Format("3+5=%d",add(3,5));
 (tng) (tng) (tng) (tng)MessageBox(str);

}










乔栋 2007-03-15 15:11 发表评论
]]>
【高效排序?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/03/06/19284.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/19284.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/03/06/19284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/19284.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/19284.html</trackback:ping><description><![CDATA[ <div class="qeg6y64" id="msgcns!62FB2A0D08BE727B!174"> <p dir="ltr">Sort(int a[],int left,int right)<br />{<br /> (tng) (tng) int value,l,r,temp;<br /> (tng)  (tng)l=left;<br /> (tng)  (tng)r=right;<br /> (tng)  (tng)value = a[(left+right)/2];<br /> (tng) (tng) while(l<r)<br /> (tng)  (tng){<br /> (tng) (tng) (tng) (tng) (tng) while(a[l]<value)<br /> (tng) (tng) (tng) (tng) (tng)  (tng)l++;<br /> (tng) (tng) (tng) (tng)  (tng)while(a[r]>value)<br /> (tng) (tng) (tng) (tng) (tng)  (tng)r--;<br /> (tng) (tng) (tng)  (tng) (tng)if(l>=r)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng)  (tng)break;<br /> (tng) (tng) (tng) (tng) (tng) temp = a[l];<br /> (tng) (tng) (tng) (tng)  (tng)a[l] = a[r];<br /> (tng) (tng) (tng) (tng) (tng) a[r] = temp;<br /> (tng) (tng) (tng) (tng)  (tng)l++;<br /> (tng) (tng) (tng) (tng)  (tng)r--;</p> <p> (tng) (tng) }<br /> (tng) (tng) if(l==r)<br /> (tng) (tng) (tng)  (tng) (tng)l++;<br /> (tng)  (tng)if(left<r)<br /> (tng) (tng) (tng) (tng) (tng) Sort(a,left,l-1);<br /> (tng) (tng) if(l<right)<br /> (tng) (tng) (tng) (tng)  (tng)Sort(a,r+1,right);<br />}<br /><br /><br /><br /><br /><br /><br /><br /></p> </div> <img src ="http://www.shnenglu.com/qiaodong/aggbug/19284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-03-06 12:14 <a href="http://www.shnenglu.com/qiaodong/archive/2007/03/06/19284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学而思,思而行 Q2Q?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2007/01/30/18173.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/18173.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2007/01/30/18173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/18173.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/18173.html</trackback:ping><description><![CDATA[ <font color="#808080">codeQ?br /></font>typedef struct<br />{<br /> (tng)SOCKET sock;<br /> (tng)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 />q个信息其实很典型,说明SOCKET 没有被定义,所以理所当然的应该查询SOCKET 的来源,F12发现它包换于#include "winsock.h" 之中Q添加以后解决问题?br /><br /><font color="#000080">思考:(x)<br /></font>q个问题其实q不复杂Q需要注意的地方有两点:(x)<br />1Q遇到出错信息要冷静(rn)的分析,不要x(chng),不要?j)?ch)?br />2Q增强DEBUG技术,不单单只是调试器上的功夫Q还需要认真地思考?br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.shnenglu.com/qiaodong/aggbug/18173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2007-01-30 10:44 <a href="http://www.shnenglu.com/qiaodong/archive/2007/01/30/18173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学而思,思而行 <1>http://www.shnenglu.com/qiaodong/archive/2007/01/30/18170.html乔栋乔栋Tue, 30 Jan 2007 02:37:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/01/30/18170.htmlhttp://www.shnenglu.com/qiaodong/comments/18170.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/01/30/18170.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/18170.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/18170.htmlerror msg:

UpDlgView.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CMarkup::~CMarkup(void)" (__imp_??1CMarkup@@QAE@XZ) referenced in function "public: void __thiscall CUpDlgView::OnButtonadd(void)" (?OnButtonadd@CUpDlgView@@QAEXXZ)

UpDlgView.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __thiscall CMarkup::AddElem(char const *,char const *,int)" (__imp_?AddElem@CMarkup@@QAE_NPBD0H@Z) referenced in function "public: void __thiscall CUpDlgView::OnButtonadd(void)" (?OnButtonadd@CUpDlgView@@QAEXXZ)

UpDlgView.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CMarkup::CMarkup(void)" (__imp_??0CMarkup@@QAE@XZ) referenced in function "public: void __thiscall CUpDlgView::OnButtonadd(void)" (?OnButtonadd@CUpDlgView@@QAEXXZ)

分析Q?br />错误的类别是:unresolved external symbol ,是一个没有解决的外部变量Q因Z直认为第三方cM可能有错误所以一直在自己~写的代码中L错误Q其实错误的关键在这里:(x)"__declspec(dllimport)" q说明这是一个外部导出类Q所以需要?tng)将class (tng) AFX_EXT_CLASS CMarkup (tng)改ؓ(f) class CMarkUp .










乔栋 2007-01-30 10:37 发表评论
]]>
演练VC中的COMMON一?http://www.shnenglu.com/qiaodong/archive/2007/01/22/17895.html乔栋乔栋Mon, 22 Jan 2007 09:44:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/01/22/17895.htmlhttp://www.shnenglu.com/qiaodong/comments/17895.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/01/22/17895.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/17895.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/17895.html (tng) (tng) (tng) (tng)2.囑փ列表控制 (tng) (tng) (tng) (tng) (tng)I(yng)mage (tng)List
 (tng) (tng) (tng) (tng)3.列表控制和视 (tng) (tng) (tng) (tng) (tng)List (tng)Control&List (tng)View
 (tng) (tng) (tng) (tng)4.?wi)控制和视 (tng) (tng) (tng) (tng) (tng) (tng) (tng)Tree (tng)Control&Tree (tng)View
 (tng) (tng) (tng) (tng)5.标签控制和视 (tng) (tng) (tng) (tng) (tng)Tab (tng)Control&Tab (tng)View
 (tng) (tng) (tng) (tng)6.工具条控制?tng) (tng) (tng) (tng) (tng) (tng) (tng)Toolbar (tng)Control
 (tng) (tng) (tng) (tng)7.q度条控制?tng) (tng) (tng) (tng) (tng) (tng) (tng)Progress (tng)Control
 (tng) (tng) (tng) (tng)8.滑动条控制?tng) (tng) (tng) (tng) (tng) (tng)Slider (tng)Control
 (tng) (tng) (tng) (tng)9.旋{按钮控制 (tng) (tng) (tng) (tng)Spin (tng)Button (tng)Control
 (tng) (tng) (tng) (tng)10.状态条控制 (tng) (tng) (tng) (tng) (tng) (tng)Status (tng)Bar (tng)Control


http://blog.csdn.net/wangjiwei2010/archive/2006/11/24/1412714.aspx






乔栋 2007-01-22 17:44 发表评论
]]>
同步异步,长连接短q接http://www.shnenglu.com/qiaodong/archive/2007/01/16/17666.html乔栋乔栋Tue, 16 Jan 2007 01:34:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/01/16/17666.htmlhttp://www.shnenglu.com/qiaodong/comments/17666.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/01/16/17666.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/17666.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/17666.html (tng)  (tng)
 (tng) 你去饭店吃饭Q对服务员说Q“来两碗牛肉盖饭”,然后q(h)l和lp聊天?jin),q了(jin)一?x)服务员把牛肉盖饭给你端了(jin)过来,q叫异步Q你发了(jin)h后(h)l做其他事情M(jin)Q服务员完成你的h后告诉你盖饭好了(jin)  (tng)
 (tng)  (tng)
 (tng) 你去饭店吃饭Q对服务员说Q“来两碗拉面”,服务员告诉你Q“拉面得自己排队ȝ”,你只好让lp占着座位自己L队,q叫同步Q你发了(jin)h后必ȝ着师傅把面l你Q不能离开Q否则饭别h拿C(jin)

?短连接:(x)  (tng)
 (tng)  (tng)
 (tng) 你在和mm在打?sh)话Q但mmq在做饭Q然后mm对你_(d)(x)“我现在z个,q两分钟打给我”,又聊?jin)一?x)儿Qmm又说Q“过3分钟打给我”,.....q是短连接,完成一件事情后d断开Q新的传输就建立新的q接  (tng)
 (tng)  (tng)
 (tng) 你受不了(jin)q么频繁的拨P你说Q“我不挂?...”,q是长连接,不管有没有数据要传输Q连接都要保持着

乔栋 2007-01-16 09:34 发表评论
]]>
CString和string的互相{?http://www.shnenglu.com/qiaodong/archive/2007/01/15/17645.html乔栋乔栋Mon, 15 Jan 2007 09:24:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/01/15/17645.htmlhttp://www.shnenglu.com/qiaodong/comments/17645.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/01/15/17645.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/17645.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/17645.html
CString strMfc=“test?

std::string strStl;

strStl=strMfc.GetBuffer(0);

std::string->CString (tng) (tng)例子Q?br />
CString strMfcQ?br />
std::string strStl=“test?

strMfc=strStl.c_str();


乔栋 2007-01-15 17:24 发表评论
]]>
命名I间http://www.shnenglu.com/qiaodong/archive/2007/01/04/17248.html乔栋乔栋Thu, 04 Jan 2007 08:20:00 GMThttp://www.shnenglu.com/qiaodong/archive/2007/01/04/17248.htmlhttp://www.shnenglu.com/qiaodong/comments/17248.htmlhttp://www.shnenglu.com/qiaodong/archive/2007/01/04/17248.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/17248.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/17248.html (tng) #include  (tng) "stdafx.h"  (tng)
 (tng) #include  (tng) <iostream>  (tng)
 (tng) using  (tng) namespace  (tng) std;  (tng)
 (tng)  (tng)
 (tng) namespace  (tng) A  (tng)
 (tng) {  (tng)
 (tng) void  (tng) f(){cout<<"In  (tng) A::f()  (tng) function"<<endl;}  (tng)
 (tng) }  (tng)
 (tng) namespace  (tng) B  (tng)
 (tng) {  (tng)
 (tng) void  (tng) f(){cout<<"In  (tng) B::f()  (tng) function"<<endl;}  (tng)
 (tng) }  (tng)
 (tng)  (tng)
 (tng)  (tng)
 (tng)  (tng)
 (tng) int  (tng) main(int  (tng) argc,  (tng) char*  (tng) argv[])  (tng)
 (tng) {  (tng)
 (tng) {  (tng)
 (tng) using  (tng) namespace  (tng) A;  (tng)
 (tng) f();  (tng)
 (tng) }  (tng)
 (tng) {  (tng)
 (tng) using  (tng) namespace  (tng) B;  (tng)
 (tng) f();  (tng)
 (tng) }  (tng)
 (tng) return  (tng) 0;  (tng)
 (tng) } (tng) (tng)

 (tng) l果是:(x)  (tng)
 (tng) In  (tng) A::f()  (tng) function  (tng)
 (tng) In  (tng) B::f()  (tng) function



乔栋 2007-01-04 16:20 发表评论
]]>
开发心(j)?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2006/12/21/16696.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/16696.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2006/12/21/16696.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/16696.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/16696.html</trackback:ping><description><![CDATA[今天涉及(qing)C个数据更新问题,感觉问题q不大,但是却发C(jin)很大的学?fn)空_(d)虽然问题q没有完全搞定,但是觉得q样的问题折自己是很不错的一件事情?br /><br /><br />另外有一个疑问,是不是重复代码越越好呢Q我今天写的时候L不停在复用以前写的代码,感觉有些累赘所以就写成函数Q到处调用,从头审视自己的代码,发现重复的代码很多,我想q些是我需要改q的地方?br /><br />高得UQ不成熟的优化是万恶之源Q我q样的优化是不是不成熟的优化Q会(x)不会(x)造成一些恶果?q个我还?sh)知道,但是我要快地找到答案?br /><br /><br /><br /><br /><img src ="http://www.shnenglu.com/qiaodong/aggbug/16696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2006-12-21 17:29 <a href="http://www.shnenglu.com/qiaodong/archive/2006/12/21/16696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ListCtrl的ȝ http://www.shnenglu.com/qiaodong/archive/2006/12/13/16370.html乔栋乔栋Wed, 13 Dec 2006 07:18:00 GMThttp://www.shnenglu.com/qiaodong/archive/2006/12/13/16370.htmlhttp://www.shnenglu.com/qiaodong/comments/16370.htmlhttp://www.shnenglu.com/qiaodong/archive/2006/12/13/16370.html#Feedback1http://www.shnenglu.com/qiaodong/comments/commentRss/16370.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/16370.html

故ȝ?jin)一下自q使用l验Q以供参考用?/p>

  先注明一下,q里Q我们用m_listctrl来表CZ个CListCtrl的类对象Q?/p>

然后q里我们的ListCtrl都是report形式Q至于其他的如什么大图标Q小图标

的暂时不Ԍ毕竟report是大众话的用。其ơ,我们q里用条ƾ一Q条ƾ二

来描q第一点,W二点,q个是参照《Effective C++》的叫法Q俺觉得q么

叫比较COOL :)

 条款一Q设|ListCtrl的风?/p>

 在CSDN上常常看到有人问怎么讄风格的,他们ListCtrl的样子是一个列?/p>

Q有横条和竖条分界线Q然后选中一行,要整一行都选中Q而不是只有某一?/p>

被选中Q等{,q里l一个比较全面的讄Ҏ(gu)?/p>

//获得原有风格
 (tng)DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);
 (tng)dwStyle &= ~(LVS_TYPEMASK);
 (tng)dwStyle &= ~(LVS_EDITLABELS);

 (tng)//讄新风?br /> (tng) (tng) (tng) SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,

dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);


 (tng)//讄扩展风格
 (tng)DWORD styles =

LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;

 (tng)ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles,

styles );

其中LVS_EX_FULLROWSELECT 是前面说得整行选中

LVS_EX_GRIDLINES |格U(只适用与report风格的listctrlQ?/p>

LVS_EX_CHECKBOXES 前面加个checkbox

pListCtrl->SetExtendedStyle( (tng) m_listctrl.GetExtendedStyle()

|LVS_EX_SUBITEMIMAGES);


q也是一个很重要的属性,q样的话Q可以在列表中加I(yng)CONQ记得windows?/p>

d理器吗Q你惛_得那Pq个属性也要加哦,q个我以后会(x)讲的?/p>

条款二:(x)加入列头

  q是一个比较实质的东西Q给列表框分列,然后加上列头

  代码说话Q来?/p>

  TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};
 (tng)
 (tng)LV_COLUMN lvcolumn;
 (tng)CRect rect;
 (tng)m_listctrl.GetWindowRect(&rect);
 (tng)for(int i=0;i<2;i++)
 (tng){
 (tng)  lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT
 (tng) (tng) (tng) (tng)          | LVCF_WIDTH | LVCF_ORDER;
 (tng)  lvcolumn.fmt = LVCFMT_LEFT;
 (tng)  lvcolumn.pszText = rgtsz[i];
 (tng)  lvcolumn.iSubItem = i;
 (tng)  lvcolumn.iOrder = i;
 (tng)  if(i==0)
 (tng)  {
 (tng) (tng)    lvcolumn.cx = rect.Width()*3/5 ;
 (tng)  }
 (tng)  else
 (tng) (tng)   lvcolumn.cx = rect.Width()*2/5;
 (tng)     

   m_listctrl.InsertColumn(i, &lvcolumn);
 (tng) }

q是插入两列的做法,你要插入20列?Q随便你Q依L(fng)葫芦~~

 lvcolumn.mask 中那个mask可以有各U属性,具体ȝmsdn吧,

 (tng)

条款三:(x)把记录,插入列表框中

 int nIndex = m_listctrl.GetItemCount();

 (tng) LV_ITEM (tng) (tng) lvitemAdd = {0};
 (tng) lvitemAdd.mask = LVIF_TEXT;
 (tng) lvitemAdd.iItem = nIndex ;
 (tng) lvitemAdd.iSubItem = 0;
 (tng) lvitemAdd.pszText =_T("毛毛1");;


 (tng) if (m_listctrl.InsertItem(&lvitemAdd) != -1)
 (tng) {
 (tng) (tng) LV_ITEM lvitem = {0};
 (tng) (tng) lvitem.mask = LVIF_TEXT;
 (tng) (tng) lvitem.iItem = nIndex ;
 (tng) (tng) lvitem.iSubItem = 1;
 (tng)
 (tng) (tng) lvitem.pszText =_T("毛毛2");
 (tng) (tng) m_listctrl.SetItem(&lvitem);
 (tng) (tng)
 (tng) }

nIndex 是当前的行数Q然后把新的一行,插在最下面Q?/p>

 (tng)

条款四:(x)l列表中插入图标

 在report格式中,也能插入图标

 l箋(hu)代码说话

 m_image是个CImageList对象

 m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);

 (tng)m_listctrl.SetImageList(&m_image,LVSIL_SMALL);

然后调用CImageList的成员函数int CImageList::Add( HICON hIcon );

把ICON插入到imagelistQ?/p>

 然后在插入记录的时?/p>

 lvitemAdd.mask = LVIF_TEXT; Q》 lvitemAdd.mask =

LVIF_TEXT|LVIF_IMAGE

 然后d一个lvitemAdd.iImage = n;

 q个n是imagelist中的序号Q表C是具体的哪一个图标,list么,呵呵

 (tng)

条款五:(x) 插入记录时用额外的信息QlParam 的?/p>

   有时候,你想对于某一行,加入一些额外的信息Q那么就可以使用q个

lParam

  msdn是这么描q的Specifies the 32-bit value of the item

  我上ơ是Z(jin)在某一行加入一个信息,H口句柄Q然后是q么加的Q?/p>

  int nIndex = m_listctrl.GetItemCount();

 (tng) LV_ITEM (tng) (tng) lvitemAdd = {0};
 (tng) lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
 (tng) lvitemAdd.iItem = nIndex ;
 (tng) lvitemAdd.iSubItem = 0;
 (tng) lvitemAdd.pszText =_T("毛毛1");;

 (tng) lvitemAdd.iImage = n;
 (tng) lvitemAdd.lParam = (LPARAM)hwnd;(某个H口的窗口句?


 (tng) if (m_listctrl.InsertItem(&lvitemAdd) != -1)
 (tng) {
 (tng) (tng) LV_ITEM lvitem = {0};
 (tng) (tng) lvitem.mask = LVIF_TEXT;
 (tng) (tng) lvitem.iItem = nIndex ;
 (tng) (tng) lvitem.iSubItem = 1;
 (tng)
 (tng) (tng) lvitem.pszText =_T("毛毛2");
 (tng) (tng) m_listctrl.SetItem(&lvitem);
 (tng) (tng)
 (tng) }

okQ这是一个比较全的例子的Q又揺CONQ又使用PARAM?/p>

条款六 Q 点击列表框,获取选中行信?/p>

  响应NM_CLICK消息Q如果你有MSDNQ可以看刎ͼ有专门关于listview?/p>

NM_CLICK的介l?/p>

void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult)
{
 (tng)// TODO: Add your control notification handler code here
 (tng)int nItem = -1;
 (tng)
 (tng)LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;

 (tng)if(lpNMItemActivate != NULL)
 (tng){
 (tng) (tng) (tng) (tng) nItem = lpNMItemActivate->iItem;
 (tng)}

}

现在nItem是点击选中那行的index?jin),有?jin)indexQ获取那行的信息q难?/p>

Q?/p>

懒汉_(d)(x)难,因ؓ(f)你还没讲Q晕Q那q(h)l说

 (tng)

条款七:(x) Ҏ(gu)行的indexQ获取该行的信息

 直接上代码吧

 LV_ITEM lvitem = {0};
 (tng) (tng) lvitem.iItem = nIndex;
 (tng) (tng) lvitem.iSubItem = 0;
 (tng) (tng) lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;

m_listctrl.GetItem(&lvitem)

q样Q就把nindex,W一列的信息取出来了(jin)Q包括刚才我们加入的ICON,和那?/p>

额外信息Q窗口句柄)(j)Q?/p>

比如我要获取H口句柄Q就可以hwnd = (HWND)lvitem.lParam;

mask 用来指明你想获取那些信息

具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem

 (tng)

条款八:(x)用程序选中某一行,使之选中

选中之 

m_listctrl.SetItemState

(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);

不选中Q取消选中?/p>

m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);

 (tng)

条款?ji)?x)获取当前所有选中的行Q多选)(j)

  q个Q俺比较懒?jin),抄msdn的代码吧Q反正很?/p>

  

Example
// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem

(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL);

POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
 (tng) (tng) TRACE0("No items were selected!\n");
else
{
 (tng) while (pos)
 (tng) {
 (tng) (tng) (tng) (tng) int nItem = pList->GetNextSelectedItem(pos);
 (tng) (tng) (tng) (tng) TRACE1("Item %d was selected!\n", nItem);
 (tng) (tng) (tng) (tng) // you could do your own processing on nItem here
 (tng) }
}

 (tng)

条款十:(x)删除条款?ji)中选中的行

  q个相对前面?ji)个条款是比较麻烦(ch)的Q因为如果你要删除多行的话。往(xin)往(xin)要出?/p>

  比如Q我现在要删除第0行和W?行(列表的行序列是从0开始的Q?/p>

  那么好啊。我来删?/p>

  m_listctrl.DeleteItem(0)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_listctrl.DeleteItem(1)

  恭喜你,错了(jin)Q我好开?j)啊 Q)(j)

  因ؓ(f)你删除第0行以后,下面的行?x)往(xin)上移Q那么原来的W?行就变成?jin)?行,那么你再 m_listctrl.DeleteItem(1)Q那么删除的是原来的W2行,真麻?ch)?/p>

   所以,只有从下往(xin)上删Q才是安全的Q先删的Q不?x)?jing)响后面的操作Q?/p>

    m_listctrl.DeleteItem(1)

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_listctrl.DeleteItem(0)

  但有时候,我们也不知道要删除哪些行Q只知道要删除选中的那些行Q像条款?ji)中的那?/p>

   如果我们q是?/p>

   

POSITION pos = m_listctrl.GetFirstSelectedItemPosition();
if (pos == NULL)
 (tng) (tng) TRACE0("No items were selected!\n");
else
{
 (tng) while (pos)
 (tng) {
 (tng) (tng) (tng) (tng) int nItem = m_listctrl.GetNextSelectedItem(pos);
 (tng) (tng) (tng)

 m_listctrl.DeleteItem(nItem );

 (tng) }
}

你就{着收尸?/p>

q时候我们就要B4微Y?jin),cx(chng)有GetLastselectedItemPosition 和GetPrevSelectedItem

多写一Ҏ(gu)员函C(x)d :(

 没办法,办法自己惻Iq里有个W办?/p>

 POSITION (tng) sSelPos = NULL;

 (tng)while(sSelPos = m_listctrl.GetFirstSelectedItemPosition())
 (tng){
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nSelItem = -1;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(nSelItem >= 0 && nSelItem<m_listctrl.GetItemCount())
 (tng) (tng) (tng) (tng) (tng) (tng) {

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 好了(jin)Q这个nSelItem 是我们要的DD

 (tng) (tng) (tng) (tng) (tng) }

}

GetNextSelectedItemq个函数Q看msdn的用法,其实是返回第一个的indexQ然后走C一个选中的行去,所以这么做也是安全的,在实际中Q俺也是q么做的Q测试也通过Q没问题?/p>

当然Q还有个办法Q先通过GetFirstSelectedItemPosition和GetNextSelectedItem

来获取所有的选中行的indexQ然后把q些index攑ֈ一个数l里Q然后再从下往(xin)上删

唉真ȝ(ch)啊,q要不定数组Q不说用new在堆上开吧,那么一个vectorL要的吧,ȝ(ch)?/p>

所以我暂时是用上述的办法来删除Q也供大家参考,希望能找到更好的办法?br />












乔栋 2006-12-13 15:18 发表评论
]]>listctrl的一些问?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2006/12/13/16361.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/16361.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2006/12/13/16361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/16361.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/16361.html</trackback:ping><description><![CDATA[ <h2 class="diaryTitle">CListCtrl使用技?/h2> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <p><u><font color="#800080">CListCtrl使用技?/font></u></p><div id="8ccswgw" class="postText"><p>以下未经说明Qlistctrl默认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> (tng) (tng) (tng) (tng) (tng) LVS_ICON: 为每个item昄大图?br /> (tng) (tng) (tng) (tng) (tng) LVS_SMALLICON: 为每个item昄图?br /> (tng) (tng) (tng) (tng) (tng) LVS_LIST: 昄一列带有小图标的item<br /> (tng) (tng) (tng) (tng) (tng) LVS_REPORT: 昄item详细资料</p><p> (tng) (tng) (tng) (tng) (tng) 直观的理解:(x)windows资源理器,“查看”标{下的“大图标Q小图标Q列表,详细资料?/p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">2. 讄listctrl 风格?qing)扩展风?/span></h3><p> (tng) (tng) (tng) (tng) (tng) LONG lStyle;<br /> (tng) (tng) (tng) (tng) (tng) lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前H口style<br /> (tng) (tng) (tng) (tng) (tng) lStyle &= ~LVS_TYPEMASK; //清除昄方式?br /> (tng) (tng) (tng) (tng) (tng) lStyle |= LVS_REPORT; //讄style<br /> (tng) (tng) (tng) (tng) (tng) SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//讄style<br /> (tng)<br /> (tng) (tng) (tng) (tng) (tng) DWORD dwStyle = m_list.GetExtendedStyle();<br /> (tng) (tng) (tng) (tng) (tng) dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高?sh)(只适用与report风格的listctrlQ?br /> (tng) (tng) (tng) (tng) (tng) dwStyle |= LVS_EX_GRIDLINES;//|格U(只适用与report风格的listctrlQ?br /> (tng) (tng) (tng) (tng) (tng) dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控g<br /> (tng) (tng) (tng) (tng) (tng) m_list.SetExtendedStyle(dwStyle); //讄扩展风格<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) 注:(x)listview的styleh阅msdn<br /> (tng) (tng) (tng) (tng) (tng) <a >http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp</a><br /></p><p> (tng)</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> (tng) (tng) (tng) (tng) (tng) m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入?br /> (tng) (tng) (tng) (tng) (tng) m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );<br /> (tng) (tng) (tng) (tng) (tng) int nRow = m_list.InsertItem(0, ?1?;//插入?br /> (tng) (tng) (tng) (tng) (tng) m_list.SetItemText(nRow, 1, “jacky?;//讄数据<br /></p><p> (tng)</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"> (tng) (tng) (tng) </span>选中style中的Show selection alwaysQ或者在上面W?点中讄LVS_SHOWSELALWAYS<br /><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">5. 选中和取消选中一?/span></h3><p> (tng) (tng) (tng) int nIndex = 0;<br /> (tng) (tng) (tng) //选中<br /> (tng) (tng) (tng) m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);<br /> (tng) (tng) (tng) //取消选中<br /> (tng) (tng) (tng) m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);<br /> (tng)</p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">6. 得到l(f)istctrl中所有行的checkbox的状?/span></h3><p> (tng) (tng) (tng) (tng) (tng) m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);<br /> (tng) (tng) (tng) (tng) (tng) CString str;<br /> (tng) (tng) (tng) (tng) (tng) for(int i=0; i<m_list.GetItemCount(); i++)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str.Format(_T("W?d行的checkbox为选中状?), i);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox(str);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">7. 得到l(f)istctrl中所有选中行的序号</span></h3><h3><span style="COLOR: rgb(153,51,0)"></span></h3><p><span style="COLOR: rgb(153,51,0)"><br /></span> (tng) (tng) (tng) (tng) (tng) Ҏ(gu)一Q?br /> (tng) (tng) (tng) (tng) (tng) CString str;<br /> (tng) (tng) (tng) (tng) (tng) for(int i=0; i<m_list.GetItemCount(); i++)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) str.Format(_T("选中?jin)?d?), i);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox(str);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) }</p><p> (tng) (tng) (tng) (tng) (tng) Ҏ(gu)二:(x)<br /> (tng) (tng) (tng) (tng) (tng) POSITION pos = m_list.GetFirstSelectedItemPosition();<br /> (tng) (tng) (tng) (tng) (tng) if (pos == NULL)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) TRACE0("No items were selected!\n");<br /> (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while (pos)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nItem = m_list.GetNextSelectedItem(pos);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) TRACE1("Item %d was selected!\n", nItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // you could do your own processing on nItem here<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">8. 得到item的信?/span></h3><p> (tng) (tng) (tng) (tng) (tng) TCHAR szBuf[1024];<br /> (tng) (tng) (tng) (tng) (tng) LVITEM lvi;<br /> (tng) (tng) (tng) (tng) (tng) lvi.iItem = nItemIndex;<br /> (tng) (tng) (tng) (tng) (tng) lvi.iSubItem = 0;<br /> (tng) (tng) (tng) (tng) (tng) lvi.mask = LVIF_TEXT;<br /> (tng) (tng) (tng) (tng) (tng) lvi.pszText = szBuf;<br /> (tng) (tng) (tng) (tng) (tng) lvi.cchTextMax = 1024;<br /> (tng) (tng) (tng) (tng) (tng) m_list.GetItem(&lvi);</p><p> (tng) (tng) (tng) (tng) (tng) 关于得到讄item的状态,q可以参考msdn文章<br /> (tng) (tng) (tng) (tng) (tng) Q173242: Use Masks to Set/Get Item States in CListCtrl<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >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. 得到l(f)istctrl的所有列的header字符串内?/span></span></h3><p> (tng) (tng) (tng) (tng) (tng) LVCOLUMN lvcol;<br /> (tng) (tng) (tng) (tng) (tng) char (tng) str[256];<br /> (tng) (tng) (tng) (tng) (tng) int (tng) (tng) nColNum;<br /> (tng) (tng) (tng) (tng) (tng) CString (tng) strColumnName[4];//假如??/p><p> (tng) (tng) (tng) (tng) (tng) nColNum = 0;<br /> (tng) (tng) (tng) (tng) (tng) lvcol.mask = LVCF_TEXT;<br /> (tng) (tng) (tng) (tng) (tng) lvcol.pszText = str;<br /> (tng) (tng) (tng) (tng) (tng) lvcol.cchTextMax = 256;<br /> (tng) (tng) (tng) (tng) (tng) while(m_list.GetColumn(nColNum, &lvcol))<br /> (tng) (tng) (tng) (tng) (tng) { <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strColumnName[nColNum] = lvcol.pszText;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) nColNum++;<br /> (tng) (tng) (tng) (tng) (tng) }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">10. 使listctrl中一可见,x(chng)动滚动条</span></h3> (tng) (tng) (tng) m_list.EnsureVisible(i, FALSE);<br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">11. 得到l(f)istctrl列数</span></h3> (tng) (tng) (tng) int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();<br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">12. 删除所有列</span></h3><p> (tng) (tng) (tng)  (tng) Ҏ(gu)一Q?br /> (tng) (tng) (tng) (tng)  (tng) (tng) (tng) while ( m_list.DeleteColumn (0))<br /> (tng) (tng) (tng)  (tng) (tng) 因ؓ(f)你删除了(jin)W一列后Q后面的列会(x)依次向上Ud?/p><p> (tng) (tng) (tng)  (tng) Ҏ(gu)二:(x)<br /> (tng) (tng) (tng) (tng) (tng) int nColumns = 4;<br /> (tng) (tng) (tng) (tng) (tng) for (int i=nColumns-1; i>=0; i--)<br /> (tng) (tng) (tng) (tng) (tng)  (tng) (tng) (tng) 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> (tng) (tng) (tng) (tng) (tng) dlistctrl控g的NM_CLICK消息相应函数<br /> (tng) (tng) (tng) (tng) (tng) void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // Ҏ(gu)一Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) /*<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DWORD dwPos = GetMessagePos();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_list.ScreenToClient(&point);<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) LVHITTESTINFO lvinfo;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) lvinfo.pt = point;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) lvinfo.flags = LVHT_ABOVE;<br /> (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nItem = m_list.SubItemHitTest(&lvinfo);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(nItem != -1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString strtemp;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strtemp.Format("单击的是W?d行第%d?, lvinfo.iItem, lvinfo.iSubItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox(strtemp);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) */<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // Ҏ(gu)?<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) /*<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(pNMListView->iItem != -1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString strtemp;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strtemp.Format("单击的是W?d行第%d?,<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) pNMListView->iItem, pNMListView->iSubItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox(strtemp);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) */<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) *pResult = 0;<br /> (tng) (tng) (tng) (tng) (tng) }<br /></p><p> (tng)</p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">14. 判断是否点击在listctrl的checkbox?/span></h3><p> (tng) (tng) (tng) (tng) (tng) dlistctrl控g的NM_CLICK消息相应函数<br /> (tng) (tng) (tng) (tng) (tng) void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DWORD dwPos = GetMessagePos();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_list.ScreenToClient(&point);<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) LVHITTESTINFO lvinfo;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) lvinfo.pt = point;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) lvinfo.flags = LVHT_ABOVE;<br /> (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) UINT nFlag;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nItem = m_list.HitTest(point, &nFlag);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //判断是否点在checkbox?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(nFlag == LVHT_ONITEMSTATEICON)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) AfxMessageBox("点在listctrl的checkbox?);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) *pResult = 0;<br /> (tng) (tng) (tng) (tng) (tng) }<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> (tng) (tng) (tng) (tng) (tng) dlistctrl控g的NM_RCLICK消息相应函数<br /> (tng) (tng) (tng) (tng) (tng) void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(pNMListView->iItem != -1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) DWORD dwPos = GetMessagePos();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CPoint point( LOWORD(dwPos), HIWORD(dwPos) );<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CMenu menu;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) VERIFY( menu.LoadMenu( IDR_MENU1 ) );<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CMenu* popup = menu.GetSubMenu(0);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ASSERT( popup != NULL );<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) *pResult = 0;<br /> (tng) }<br /></p><p><br /></p><p> (tng)</p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">16. item切换焦点?包括用键盘和鼠标切换item?Q状态的一些变化顺?/span></h3><p> (tng) (tng) (tng) (tng) (tng) dlistctrl控g的LVN_ITEMCHANGED消息相应函数<br /> (tng) (tng) (tng) (tng) (tng) void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // TODO: Add your control notification handler code here<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString sTemp;<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (pNMListView->uNewState & LVIS_FOCUSED) == 0)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sTemp.Format("%d losted focus",pNMListView->iItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sTemp.Format("%d got focus",pNMListView->iItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } <br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (pNMListView->uNewState & LVIS_SELECTED) == 0)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sTemp.Format("%d losted selected",pNMListView->iItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sTemp.Format("%d got selected",pNMListView->iItem);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) *pResult = 0;<br /> (tng) (tng) (tng) (tng) (tng) }</p><br /><br /><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">17. 得到另一个进E里的listctrl控g的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 >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 >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 >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的subitemd图标</span></h3><p> (tng) (tng) (tng) (tng) (tng) m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);<br /> (tng) (tng) (tng) (tng) (tng) m_list.SetItem(..); //具体参数请参考msdn<br /></p><p> (tng)</p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">21. 在CListCtrl昄文gQƈҎ(gu)文gcd来显C图?/span></h3><p> (tng) (tng) (tng) (tng) (tng) |上扑ֈ的代码,share<br /> (tng) (tng) (tng) (tng) (tng) BOOL CTest6Dlg::OnInitDialog()<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CDialog::OnInitDialog();<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) HIMAGELIST himlSmall;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) HIMAGELIST himlLarge;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHFILEINFO sfi;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) char (tng) cSysDir[MAX_PATH];<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString (tng) strBuf;<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) memset(cSysDir, 0, MAX_PATH);<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) GetWindowsDirectory(cSysDir, MAX_PATH);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strBuf = cSysDir;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("<a href="file:///" ?="" )+1="">\\")+1</a>));<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 0, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) &sfi, <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sizeof(SHFILEINFO), (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGFI_SYSICONINDEX | SHGFI_SMALLICON );<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 0, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) &sfi, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sizeof(SHFILEINFO), (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGFI_SYSICONINDEX | SHGFI_LARGEICON);<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (himlSmall && himlLarge)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return TRUE; (tng) // return TRUE (tng) unless you set the focus to a control<br /> (tng) (tng) (tng) (tng) (tng) }<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString strSize;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CFileFind filefind;<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // (tng) get file size<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (filefind.FindFile(lpszFileName))<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) filefind.FindNextFile();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strSize.Format("%d", filefind.GetLength());<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strSize = "0";<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // split path and filename<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString strFileName = lpszFileName;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) CString strPath;<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nPos = strFileName.ReverseFind('\\');<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (nPos != -1)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strPath = strFileName.Left(nPos);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) strFileName = strFileName.Mid(nPos + 1);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) // insert to list<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int nItem = m_list.GetItemCount();<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_list.InsertItem(nItem, strFileName, nIcon);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_list.SetItemText(nItem, 1, strSize);<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_list.SetItemText(nItem, 2, strFileName.Right(3));<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) m_list.SetItemText(nItem, 3, strPath);<br /> (tng) (tng) (tng) (tng) (tng) }<br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)<br /> (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHFILEINFO sfi;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) memset(&sfi, 0, sizeof(sfi));<br /> (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (bIsDir)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGetFileInfo(lpszPath, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) FILE_ATTRIBUTE_DIRECTORY, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) &sfi, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sizeof(sfi), (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGFI_SMALLICON | SHGFI_SYSICONINDEX |<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0)); (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (tng) sfi.iIcon;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) {<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGetFileInfo (lpszPath, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) FILE_ATTRIBUTE_NORMAL, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) &sfi, (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sizeof(sfi), (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGFI_SMALLICON | SHGFI_SYSICONINDEX | (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (tng) (tng) sfi.iIcon;<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return (tng) -1;<br /> (tng) (tng) (tng) (tng) (tng) }<br /></p><p><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">22. listctrl内容q行大数据量更新Ӟ避免闪烁</span></h3><p> (tng) (tng) (tng) (tng) (tng) m_list.SetRedraw(FALSE);<br /> (tng) (tng) (tng) (tng) (tng) //更新内容<br /> (tng) (tng) (tng) (tng) (tng) m_list.SetRedraw(TRUE);<br /> (tng) (tng) (tng) (tng) (tng) m_list.Invalidate();<br /> (tng) (tng) (tng) (tng) (tng) m_list.UpdateWindow();<br /> (tng) <br />或者参?<br /></p><p><a >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>Q250614QHow To Sort Items in a CListCtrl in Report View<br /><a >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 >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 >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. 关于listctrlW一列始l居左的问题</span></h3><p>解决办法Q把W一列当一个虚列,从第二列开始插入列?qing)数据,最后删除第一列?br /> (tng) (tng) (tng) (tng) (tng) <br />具体解释参阅 (tng) (tng) <a >http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp</a><br /></p><p> (tng)</p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">27. 锁定column header的拖?/span></h3><p><a >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> (tng) (tng) (tng) 把需隐藏的列的宽度设?,然后(g)当该列为隐藏列Ӟ用上面第27点的锁定column 的拖动来实现<br /><br /></p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3><span style="COLOR: rgb(153,51,0)">29. listctrlq行大数据量操作Ӟ使用virtual list (tng)</span> (tng) (tng) </h3><p><a >http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/</a><br /><a >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个字W的问题</span></h3><p>解决办法Q需要在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 >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. cM于windows资源理器的listview</span></h3><p>Q234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe<br /><a >http://support.microsoft.com/kb/234310/en-us</a><br /></p><p> (tng)</p><hr style="WIDTH: 100%; HEIGHT: 2px" /><h3 style="COLOR: rgb(153,51,0)">33. 在ListCtrl中OnTimer只响应两ơ的问题</h3><p>Q200054Q?br />PRB: OnTimer() Is Not Called Repeatedly for a List Control<br /><a >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. 以下Z些ؓ(f)实现各种自定义功能的listctrlzc?/span></h3><p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (1) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">拖放</span> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/dragtest.asp</a></p><p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">在CListCtrl和CTreeCtrl间拖?/span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://support.microsoft.com/kb/148738/en-us</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (2) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">多功能listctrl</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 支持subitem可编辑,图标QradiobuttonQcheckboxQ字W串改变颜色的类<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/quicklist.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">支持排序Qsubitem可编辑,subitem图标Qsubitem改变颜色的类</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/ReportControl.asp</a></p><p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (3) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">subitem中显C链接</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/CListCtrlLink.asp</a></p><p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (4) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">subitem的tooltip提示</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/ctooltiplistctrl.asp</a></p><p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (5) (tng) (tng) (tng)<span style="COLOR: rgb(153,51,0)"> subitem中显C度条</span> (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/ProgressListControl.asp</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/napster.asp</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/</a></p><p> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (6) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">动态改变subitem的颜色和背景?/span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/highlightlistctrl.asp</a><br /> (tng) (tng) (tng)  (tng) (tng) (tng)  (tng) (tng) (tng)  (tng) (tng) (tng)  (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/</a><br /> (tng)<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (7) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">cvb属性对话框</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/propertylistctrl.asp</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (8) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">选中subitem(只高?sh)选中的item)</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/SubItemSel.asp</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/ListSubItSel.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (9) (tng) (tng) (tng) <span style="COLOR: rgb(153,51,0)">改变行高</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/changerowheight.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (10) (tng) (tng) <span style="COLOR: rgb(153,51,0)">改变行颜?/span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/coloredlistctrl.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (11) (tng) (tng) <span style="COLOR: rgb(153,51,0)">可编辑subitem的listctrl</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/nirs2000.asp</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (12) (tng) (tng) <span style="COLOR: rgb(153,51,0)">subitem可编辑,插入comboboxQ改变行颜色Qsubitem的tooltip提示</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/reusablelistcontrol.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (13) (tng) (tng) <span style="COLOR: rgb(153,51,0)">header 中允许多行字W串</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/listctrl/headerctrlex.asp</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (14) (tng) (tng) <span style="COLOR: rgb(153,51,0)">插入combobox</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/</a><br /> (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (15) (tng) (tng) <span style="COLOR: rgb(153,51,0)">d背景囄</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/</a><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.vchelp.net/vchelp/archive.asp?type_id=9&class_id=1&cata_id=1&article_id=1088&search_term</a>=<br /> (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (16) (tng) <span style="COLOR: rgb(153,51,0)">自适应宽度的listctrl</span><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <a >http://www.codeproject.com/useritems/AutosizeListCtrl.asp</a><br /></p> (tng) (tng) (tng)  (tng) (tng)  (tng) (tng) (17) (tng) <span style="COLOR: rgb(153,51,0)">改变ListCtrl高(sh)时的颜色(默认?</span><br /> (tng) (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng)  (tng) (tng) 处理<code><font face="新宋(hu)?> NM_CUSTOMDRAW <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) </font><a ><font face="新宋(hu)?>http://www.codeproject.com/listctrl/lvcustomdraw.asp</font></a></code></div><img src ="http://www.shnenglu.com/qiaodong/aggbug/16361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2006-12-13 11:44 <a href="http://www.shnenglu.com/qiaodong/archive/2006/12/13/16361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OnClose和OnDestroyhttp://www.shnenglu.com/qiaodong/archive/2006/12/11/16287.html乔栋乔栋Mon, 11 Dec 2006 13:29:00 GMThttp://www.shnenglu.com/qiaodong/archive/2006/12/11/16287.htmlhttp://www.shnenglu.com/qiaodong/comments/16287.htmlhttp://www.shnenglu.com/qiaodong/archive/2006/12/11/16287.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/16287.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/16287.htmlOnClose()Q消息响应函敎ͼ响应WM_CLOSE消息Q当"关闭"按钮被单ȝ时候(而不是我们眼睛所见的对话框从屏幕上消失时Q,该函数被调用Q用户在响应OnOk()或者OnCancel()函数之后Q不?x)发送WM_CLOSE消息

OnDestroy()Q消息响应函敎ͼ响应WM_DESTROY消息Q当一个窗口即被销毁时Q被发?/p>

在单视图E序?Ҏ(gu)<<深入出MFC>>所?E序退出时执行的操作顺序ؓ(f)
(1)用户点击退出按?发送了(jin)WM_CLOSE消息
(2)在WM_CLOSE消息的处理函C,调用DestroyWindow()
(3)在DestroyWindow()中发送了(jin)WM_DESTROY消息
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,l束消息循环

lgQ程序先调用OnClose()Q也可能不调用)(j)Q然后调用OnDestroy()Q必调用Q,所以,如果要进行程序结束时的清理工作,应该在OnDestroyQ)(j)中,而不是在OnClose()Q否则就有可能会(x)出现内存泄漏的危险了(jin)Q?/p>

乔栋 2006-12-11 21:29 发表评论
]]>
UpdateData (FALSE) (TRUE)http://www.shnenglu.com/qiaodong/archive/2006/12/11/16284.html乔栋乔栋Mon, 11 Dec 2006 12:41:00 GMThttp://www.shnenglu.com/qiaodong/archive/2006/12/11/16284.htmlhttp://www.shnenglu.com/qiaodong/comments/16284.htmlhttp://www.shnenglu.com/qiaodong/archive/2006/12/11/16284.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/16284.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/16284.html

乔栋 2006-12-11 20:41 发表评论
]]>
string tablehttp://www.shnenglu.com/qiaodong/archive/2006/12/07/16087.html乔栋乔栋Thu, 07 Dec 2006 06:38:00 GMThttp://www.shnenglu.com/qiaodong/archive/2006/12/07/16087.htmlhttp://www.shnenglu.com/qiaodong/comments/16087.htmlhttp://www.shnenglu.com/qiaodong/archive/2006/12/07/16087.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/16087.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/16087.html一个可以给人很多方便也能制造麻?ch)的家?今天我被他折腄不轻,加错一个就有出错的危险.

事后:
q个事情l我的教育很深刻,l致而烦(ch)琐的单工作更加重?因ؓ(f)一个疏忽造成的结?有时候是无法
承担?



乔栋 2006-12-07 14:38 发表评论
]]>
CRECThttp://www.shnenglu.com/qiaodong/archive/2006/12/07/16077.html乔栋乔栋Thu, 07 Dec 2006 02:39:00 GMThttp://www.shnenglu.com/qiaodong/archive/2006/12/07/16077.htmlhttp://www.shnenglu.com/qiaodong/comments/16077.htmlhttp://www.shnenglu.com/qiaodong/archive/2006/12/07/16077.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/16077.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/16077.html左上右下,W二和第四参数决定上下位|?W一和第三参数决定左右位|?

乔栋 2006-12-07 10:39 发表评论
]]>
Unicode Debug和Debug有什么区别? http://www.shnenglu.com/qiaodong/archive/2006/11/30/15816.html乔栋乔栋Thu, 30 Nov 2006 08:13:00 GMThttp://www.shnenglu.com/qiaodong/archive/2006/11/30/15816.htmlhttp://www.shnenglu.com/qiaodong/comments/15816.htmlhttp://www.shnenglu.com/qiaodong/archive/2006/11/30/15816.html#Feedback0http://www.shnenglu.com/qiaodong/comments/commentRss/15816.htmlhttp://www.shnenglu.com/qiaodong/services/trackbacks/15816.html
Unicode  (tng) Debug是宽字符(UNICODE)版本Q每个字W占用两个字节的存储I间 (tng) (tng) (tng)普通的Debug是单?MBCS)版本Q一个是unicode工程Q另一是ansi工程?br />
 (tng)相对于ASCIIQUnicode为双字节长的字符集,到目前已定义?jin)世界上l大多数文字的常用字QASCII字符集是它的子集Q即Unicode字符集兼容ASCII字符集。用Unicode最大的好处是可以应用E序方便地实现多语言支持Q不再基于CODEPAGE。微软的IE  (tng) 5.0、WINDOWS  (tng) 2000QOFFICE  (tng) 97以上版都是基于UICODE的? (tng)
 (tng)  (tng)  (tng)  (tng)  (tng)  (tng) 关于使用UNICODE的问题:(x)因WINDOWS  (tng) 95?8  (tng) 不支持UNICODEQW(xu)INDOWS  (tng) NT?000Q完全支持,若要使基于UNICODE的应用程序在上述OS上运行,那是个较ȝ(ch)的问题,请参考微软经怹c:(x)<<DEVELOPING  (tng) INTERNATIONAL  (tng) SOFTWARE  (tng) FOR  (tng) WINDOWS  (tng) 95  (tng) AND  (tng) WINDOWS  (tng) NT>>  (tng) ---  (tng) NADINE  (tng) KANO (tng) (tng)

乔栋 2006-11-30 16:13 发表评论
]]>
listctrl的菜?/title><link>http://www.shnenglu.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.shnenglu.com/qiaodong/archive/2006/11/29/15770.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/15770.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2006/11/29/15770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/15770.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/15770.html</trackback:ping><description><![CDATA[ <p> <br />void  (tng) dialog5::OnRclickList1(NMHDR*  (tng) pNMHDR,  (tng) LRESULT*  (tng) pResult)  (tng)  (tng) <br /> (tng) {  (tng) <br /> (tng) //  (tng) TODO:  (tng) Add  (tng) your  (tng) control  (tng) notification  (tng) handler  (tng) code  (tng) here  (tng) <br /> (tng) CMenu  (tng) menu1,*menu2;  (tng) <br /> (tng) CPoint  (tng) point1;  (tng) <br /> (tng) menu1.LoadMenu(IDR_MENU1);  (tng) <br /> (tng) menu2=menu1.GetSubMenu(0);  (tng) <br /> (tng) ::GetCursorPos(&point1);  (tng) <br /> (tng) menu2->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,  (tng) <br /> (tng) point1.x,point1.y,this);  (tng) <br /> (tng)  (tng) <br /> (tng) *pResult  (tng) =  (tng) 0;  (tng) <br /> (tng) } (tng) (tng) </p> <img src ="http://www.shnenglu.com/qiaodong/aggbug/15770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2006-11-29 10:48 <a href="http://www.shnenglu.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.shnenglu.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.shnenglu.com/qiaodong/archive/2006/11/20/15449.html</guid><wfw:comment>http://www.shnenglu.com/qiaodong/comments/15449.html</wfw:comment><comments>http://www.shnenglu.com/qiaodong/archive/2006/11/20/15449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qiaodong/comments/commentRss/15449.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qiaodong/services/trackbacks/15449.html</trackback:ping><description><![CDATA[ <p>#include<stdio.h></p> <p>struct a<br />{<br /> (tng)int b;<br />};<br />struct b<br />{<br /> (tng) (tng) (tng) int a;<br />};<br />void main()<br />{<br /> (tng)a A;<br /> (tng)A.b = NULL;<br /> (tng)A.b = 1;<br /> (tng)<br /> (tng)b a;<br /> (tng)a.a = 3;<br />}</p> <p>在C的环境下Q会(x)报错Q在C++的情况,q样的操作就是允许的?br />在C++的编译器中,允许结构体名作Z个变量名来对待?/p> <img src ="http://www.shnenglu.com/qiaodong/aggbug/15449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qiaodong/" target="_blank">乔栋</a> 2006-11-20 10:54 <a href="http://www.shnenglu.com/qiaodong/archive/2006/11/20/15449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.atbook.cn" target="_blank">þ˽˹ƷvA </a>| <a href="http://www.dgwbcc.cn" target="_blank">þù</a>| <a href="http://www.122v.cn" target="_blank">ھƷ˾þþþվ</a>| <a href="http://www.ogus.cn" target="_blank">97þþþ</a>| <a href="http://www.kyxu.cn" target="_blank">Ƶþ</a>| <a href="http://www.gmxd.net.cn" target="_blank">޹뾫ƷŮ˾þþò </a>| <a href="http://www.t2tt.cn" target="_blank">˾þô߽鶹</a>| <a href="http://www.facz.cn" target="_blank">þĻר</a>| <a href="http://www.umw.net.cn" target="_blank">޹ۺϾþ</a>| <a href="http://www.bjxisaa.cn" target="_blank">ٸŮþۺɫ</a>| <a href="http://www.hifistudio.cn" target="_blank">þþŷղAV</a>| <a href="http://www.hrbsyyy.cn" target="_blank">þùɫavѿ</a>| <a href="http://www.zzxsyh.cn" target="_blank">þþþþùƷ</a>| <a href="http://www.yhlj.net.cn" target="_blank">91Ƶ91þþ</a>| <a href="http://www.transeurope.com.cn" target="_blank">ĻۺϾþ2</a>| <a href="http://www.dysky.cn" target="_blank">þþƷ</a>| <a href="http://www.dui46.cn" target="_blank">ɫþ</a>| <a href="http://www.puhb.cn" target="_blank">vaþþþͬ</a>| <a href="http://www.fengdingjun.cn" target="_blank">þ99ƷСѼ</a>| <a href="http://www.iceplaza.cn" target="_blank">þ97Ʒþþþþþò</a>| <a href="http://www.muxi365.cn" target="_blank">þseƷһӰԺ</a>| <a href="http://www.hedv.com.cn" target="_blank">Ⱦþԭɫwww</a>| <a href="http://www.youk6.cn" target="_blank">vĻþ þһ ľþþþר </a>| <a href="http://www.caoguowan.cn" target="_blank">þþþ99оƷ10</a>| <a href="http://www.ihkd.cn" target="_blank">ɫ͵͵88888ŷƷþþ</a>| <a href="http://www.buniss.cn" target="_blank">޾Ʒھþ</a>| <a href="http://www.zambak.cn" target="_blank">ƷþþþþҰ</a>| <a href="http://www.desktx.cn" target="_blank">޹ƷۺϾþһ</a>| <a href="http://www.baojingqi88.org.cn" target="_blank">޾þһ</a>| <a href="http://www.sifubaimeng.cn" target="_blank">þ96Ʒþþ</a>| <a href="http://www.hrtravel.cn" target="_blank">ާѡþþþƷ</a>| <a href="http://www.hhh328.cn" target="_blank">þ99ƷþֻоƷ</a>| <a href="http://www.orzdream.cn" target="_blank">ŮһaëƬþw</a>| <a href="http://www.qi-pin.cn" target="_blank">˾Ʒþþþ7777</a>| <a href="http://www.znaw.cn" target="_blank">һaƬþëƬ</a>| <a href="http://www.itiptong.cn" target="_blank">ձɫվWWWþ</a>| <a href="http://www.sh-yd.com.cn" target="_blank">þۺϸϾþù</a>| <a href="http://www.duange.com.cn" target="_blank">պþþþƷӰԺҳ</a>| <a href="http://www.leiyaojidian.cn" target="_blank">þþþƷþþþӰԺ</a>| <a href="http://www.xygree.cn" target="_blank">þ޾ƷĻ</a>| <a href="http://www.yinxingcun.com.cn" target="_blank">޹ۺϾþ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>