当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 各位大虾: 我想制作一个带有小精灵的的东东送给我女朋友,谁知道,麻烦告诉我一声. 我的qq:106864312,小弟再这里谢过了. ......
 ·activx控件屏蔽右键菜单    »显示摘要«
    摘要: 我使用 autodesk 的 voloview控件想用delphi做一个浏览dwg文件的小工具,可是由于他是英文软件,右键菜单是英文的,我想弹出自己的中文菜单,屏蔽原来的菜单. 可是,这个控件没有rightbuttondown的事件,只有mousedown的事件,在这里,我判断是否右键按下,如果是就弹出菜单.结果是成功的,但是,当我在弹出该自定义菜单后,如果没有选择菜单上的内容,而是直接用......


如何让CListCtrl中选中的行高亮显示

rt,还有就是如何设置选中的行?

NO.1   作者: sogh

VC6.0中的CListCtrl控件,当你选择某一栏时并不能全行加亮显示,下面将告诉你怎样来实现全行加亮显示  
   
  派生一个新类,其基类为CListCtrl,并手工加入DrawItem函数。  
   
  void   BListCtrl::DrawItem(LPDRAWITEMSTRUCT   lpDrawItemStruct)  
  {  
  CDC   *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);    
  CRect   rcItem(lpDrawItemStruct->rcItem);  
  int   nItem=lpDrawItemStruct->itemID;  
   
  int   nBakupDC=pDC->SaveDC();//保存DC   的状态  
   
  LV_ITEM   lvi;  
  lvi.mask=LVIF_IMAGE|LVIF_STATE;  
  lvi.iItem=nItem;  
  lvi.iSubItem=0;  
  lvi.stateMask=0xffff;//获取所有的状态标志  
  GetItem(&lvi);  
  //判断是否需要加亮显示  
   
   
  BOOL   bHighlight=(lvi.state   &   LVIS_DROPHILITED)   ||((lvi.state   &   LVIS_SELECTED)   &&   ((GetFocus()==this)   ||(GetStyle()   &   LVS_SHOWSELALWAYS)));  
   
  CRect   rcBounds,rcLabel,rcIcon;  
  //如果想知道下面三个调用获得的区域位置,可以用CDC的FillRect函数显示看一下  
  GetItemRect(nItem,&rcBounds,LVIR_BOUNDS);  
  GetItemRect(nItem,&rcLabel,LVIR_LABEL);  
  GetItemRect(nItem,&rcIcon,LVIR_ICON);  
  //需要按照顺序显示,首先绘制背景  
  if(bHighlight)  
  {  
  pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));  
  pDC->FillRect(rcBounds,&CBrush(::GetSysColor(COLOR_HIGHLIGHT)));  
  }  
  else  
  {  
  pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));  
  pDC->FillRect(rcBounds,&CBrush(::GetSysColor(COLOR_WINDOW)));  
  }  
  CString   strItem;  
  LV_COLUMN   lvc;  
  UINT   uJustify=DT_LEFT;  
  lvc.mask=LVCF_FMT|LVCF_WIDTH;  
  //背景绘制完后输出文字  
  strItem=GetItemText(nItem,0);  
  pDC->DrawText(strItem,-1,rcLabel,uJustify   |DT_SINGLELINE|   DT_NOPREFIX   |   DT_VCENTER   |DT_END_ELLIPSIS);  
   
  for(int   i=1;GetColumn(i,&lvc);i++)  
  {  
  switch(lvc.fmt   &   LVCFMT_JUSTIFYMASK)  
  {  
  case   LVCFMT_RIGHT:  
  uJustify=DT_RIGHT;  
  break;  
  case   LVCFMT_CENTER:  
  uJustify=DT_CENTER;  
  break;  
  default:  
  break;  
  }  
  rcLabel.left=rcLabel.right;  
  rcLabel.right=rcLabel.left   +   lvc.cx;  
  strItem=GetItemText(nItem,i);  
  pDC->DrawText(strItem,-1,rcLabel,uJustify   |DT_SINGLELINE|   DT_NOPREFIX   |   DT_VCENTER   |DT_END_ELLIPSIS);  
  }  
   
  pDC->RestoreDC(nBakupDC);//恢复原来的DC状态  
   
  }  
   
   
   
     
 

NO.2   作者: AplusMartin

我這有一個例子,你試一下...我是可以的  
  class   CListCtrlEx   :   public   CListCtrl  
  {  
  //   Construction  
  public:  
  CListCtrlEx();  
   
  //   Attributes  
  public:  
  int m_iClickItemID;  
  CPoint m_ClickPoint;  
   
  long m_lChannelType;  
   
  static   CPhonic   * s_pDevCtrl;  
  static   CPhonicView   * s_pView;  
   
  CObArray m_ChannelArray;  
   
  //   Operations  
  public:  
  void CloseList(void);  
   
  virtual   int GetColmunCount()   =   0;  
  virtual   int GetColmunID(EListColumn   eColumn)   =   0;  
  virtual   int GetColmunWidth(EListColumn   eColumn)   =   0;  
  virtual   LPCTSTR GetColmunTitle(EListColumn   eColumn)   =   0;  
   
  virtual   void InitList(   CPhonic   *   pDev,   long   channelType   );  
  virtual   void InitPcm(long   pcmID){;}  
   
  virtual   CChannelObject   *   CreateChannelObject(CListCtrlEx   *   pHostList,   long   channelType,   long   channelID);  
   
  virtual   void SetColumnText(   int   idx,   EListColumn   eColumn,   LPCTSTR   text   );  
   
  CChannelObject   *   GetChannelObject(   int   index   );  
  //   Overrides  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CFieldListCtrl)  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  public:  
  virtual   ~CListCtrlEx();  
   
  //   Generated   message   map   functions  
  protected:  
  //{{AFX_MSG(CFieldListCtrl)  
  void   OnLButtonDown(UINT   nFlags,   CPoint   point);  
  //}}AFX_MSG  
   
  DECLARE_MESSAGE_MAP()  
  };  
   
  ListCtrlEx::CListCtrlEx()  
  {  
  m_iClickItemID   =   -1;  
  }  
   
   
  CListCtrlEx::~CListCtrlEx()  
  {  
  CloseList();  
  }  
   
  void  
  CListCtrlEx::CloseList(void)  
  {  
  CObject   *   pObj;  
   
  while(m_ChannelArray.GetSize()   )  
  {  
  pObj   =   m_ChannelArray.GetAt(0);  
  if(   pObj   )  
  {  
  delete   pObj;  
  }  
  m_ChannelArray.RemoveAt(0);  
  }  
  }  
   
   
  BEGIN_MESSAGE_MAP(CListCtrlEx,   CListCtrl)  
  //{{AFX_MSG_MAP(CListCtrlEx)  
  ON_WM_LBUTTONDOWN()  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CListCtrlEx   message   handlers  
   
  void   CListCtrlEx::OnLButtonDown(UINT   nFlags,   CPoint   point)    
  {  
  //   what   item   did   we   select  
  UINT   flags;  
  m_iClickItemID   =   HitTest(point,   &flags);  
  m_ClickPoint =   point;  
   
  CListCtrl::OnLButtonDown(nFlags,   point)   ;  
  }  
   
   
  void  
  CListCtrlEx::InitList(   CPhonic   *   pDev,   long   channelType   )  
  {  
  m_lChannelType =   channelType;  
   
   
   
  CChannelObject   * pObj;  
  long lChannelNum   =   s_pDevCtrl->GetChannelCount(m_lChannelType);  
  for(   int   i=0;   i<lChannelNum;   i++   )  
  {  
  pObj   =   CreateChannelObject(   this,   m_lChannelType,   i   );  
  m_ChannelArray.Add(pObj);  
  }  
  for   (int   nNum   =   0;   nNum   <   columnMax;   nNum++)  
  {  
  if(   GetColmunID((EListColumn)nNum)   >=   0   )  
  {  
  InsertColumn(GetColmunID((EListColumn)nNum),    
  GetColmunTitle((EListColumn)nNum),  
  (nNum==0)?LVCFMT_LEFT:LVCFMT_CENTER,    
  GetColmunWidth((EListColumn)nNum)   );  
  }  
  }  
   
  CString str;  
  for(   i=0;   i<m_ChannelArray.GetSize();   i++   )  
  {  
  pObj   =   (CChannelObject   *)m_ChannelArray.GetAt(i);  
  ASSERT(pObj!=NULL);  
   
  str.Format("%d",   i);  
  InsertItem(i,   (LPCTSTR)str);  
   
  if(   GetColmunID(columnChannelID)   >=   0   )  
  {  
  str.Format("%d",   pObj->m_lChannelID);  
  SetItem(i,  
  GetColmunID(columnChannelID)   ,    
  LVIF_TEXT,    
  (LPCTSTR)str,    
  -1,   0,   0,   0);  
  }  
  pObj->ShowChannel();  
  }  
  }  
   
   
  CChannelObject   *    
  CListCtrlEx::CreateChannelObject(CListCtrlEx   *   pHostList,   long   channelType,   long   channelID   )  
  {  
  return   new   CChannelObject(pHostList,   channelType,   channelID);  
  }  
   
   
  CChannelObject   *    
  CSlicList::CreateChannelObject(CListCtrlEx   *   pHostList,   long   channelType,   long   channelID   )  
  {  
  if(   channelType   ==   CH_INTERIOR_SLIC   )  
  {  
  return   new   CIntChannel(pHostList,   channelType,   channelID);  
  }  
  else   if(channelType   ==   CH_EXTERIOR_SLIC   )  
  {  
  return   new   CExtChannel(pHostList,   channelType,   channelID);  
  }  
  else  
  {  
  return   new   CHighImpedanceChannel(pHostList,   channelType,   channelID);  
  }  
   
   
  }  
   
  int  
  CSlicList::GetColmunWidth(EListColumn   eColumn)  
  {  
  switch(eColumn)  
  {  
  case   columnChannelID: return   30;  
  case   columnType: return   40;  
  case   columnState: return   70;  
  case   columnNumber: return   0;  
  case   columnTask: return   0;  
  case   columnCallerID: return   80;  
  case   columnCallee: return   80;  
  case   columnDtmf: return   80;  
  break;  
  }  
  return   0;  
  }  
   
  LPCTSTR  
  CSlicList::GetColmunTitle(EListColumn   eColumn)  
  {  
  switch(eColumn)  
  {  
  case   columnChannelID: return   "ID";  
  case   columnType: return   "TYPE";  
  case   columnNumber: return   "NUM";  
  case   columnState: return   "STATE";  
  case   columnTask: return   "TASK";  
  case   columnCallerID: return   "CALLER";  
  case   columnCallee: return   "PHONE";  
  case   columnDtmf: return   "DTMF";  
  break;  
  }  
  return   "";  
  }  
  如果可以的話,記得給分啊


 ·关于记录指针问题    »显示摘要«
    摘要: 删除记录时,我按如下方法实现: cstring str; for(int i = 0; i < (int)nrecordcount; i++) { m_pset->getfieldvalue(0, str); if(str == "1") { m_pset->delete if(m_pset->iseof()) ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE