又黄又www的网站_青青草.com_在线亚洲美日韩_九九九国产视频_√天堂8资源中文在线_一区二区三区免费网站_久久久久国产一区二区三区_人妻激情偷乱视频一区二区三区_一本到在线视频

C語言輔導:可編輯子項的CListCtrl類

發布時間:2011-08-29 共1頁

  一、說明
  家都知道在MFC中通過給CListCtrl設置LVS_EDITLABELS屬性,并且在程序中響應控件的LVN_ENDLABELEDIT消息可以修改列表控件每一行的第一項,也就是主項(Item)。代碼如下:
  void CEditListCtrlSampleDlg::OnEndlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult)
  {
  LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  // TODO: Add your control notification handler code here
  *pResult = TRUE;  //TRUE值表示可以修改主項,FALSE值表示不修改主項
  }但是讓人郁悶的是,微軟留了一手,CListCtrl不支持直接修改子項(SubItem)。無奈之下只好自力更生,對CListCtrl進行擴展。>_<!!!!
  二、原理
  通過在浩如煙海的互聯網上查找資料(當然包括了名鼎鼎的VCKBASE),發現現有的實現都是對子項鼠標單擊一次就可以編輯。但本人對CListCtrl的單擊一次高亮文本,再單擊一次才開始編輯的操作模式感覺比較喜歡,所以就有了這篇文章的誕生。
  要想實現高亮文本也就是對文本進行著色處理,這可以通過對NM_CUSTOMDRAW消息進行處理實現,提示類向導中沒有這個消息映射只能進行手工添加。
  要想編輯文本則可以通過EditLabel(int nItem)成員函數以及對LVN_BEGINLABELEDIT和LVN_ENDLABELEDIT的消息處理實現。
  三、實現
  本文最終實現的CEditListCtrl擴展類在盡量符合CListCtrl操作步驟的情況下實現對主項及子項的可編輯。
  成員變量說明:
  int m_iItem; //主項標識符
  int m_iSubItem; //子項標識符
  BOOL m_bFocus; //是否繪制項文本焦點框
  BOOL m_bHighLight; //是否高亮項文本
  CItemEdit m_edtItemEdit; //用于子類化EditLabel函數返回的CEdit*指針
  列表控件中所有項文本的繪制以及特效(焦點框、高亮)都在NM_CUSTOMDRAW消息處理中實現:
  void CEditListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  {
  NMLVCUSTOMDRAW* pNMLVCustomDraw = (NMLVCUSTOMDRAW*)pNMHDR;
  // Take the default processing unless we set this to something else below.
  *pResult = CDRF_DODEFAULT;
  // First thing - check the draw stage. If it's the control's prepaint
  // stage, then tell Windows we want messages for every item.
  if (pNMLVCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
  {
  *pResult = CDRF_NOTIFYITEMDRAW;
  }
  else if (pNMLVCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
  {
  // This is the notification message for an item. We'll request
  // notifications before each subitem's prepaint stage.
  *pResult = CDRF_NOTIFYSUBITEMDRAW;
  }
  else if (pNMLVCustomDraw->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
  {
  //當前要繪制的主項標識符和子項標識符
  int iItem = (int)pNMLVCustomDraw->nmcd.dwItemSpec;
  int iSubItem = pNMLVCustomDraw->iSubItem;
  CDC* pDC = CDC::FromHandle(pNMLVCustomDraw->nmcd.hdc);
  CString strItemText = GetItemText(iItem, iSubItem);
  CRect rcItem, rcText;
  GetSubItemRect(iItem, iSubItem, LVIR_LABEL, rcItem);
  rcText = rcItem;
  CSize size = pDC->GetTextExtent(strItemText);
  if(strItemText == _T(""))
  {
  size.cx = 41;
  }
  //設置文本高亮矩形
  rcText.left += 4;
  rcText.right = rcText.left + size.cx + 6;
  if(rcText.right > rcItem.right)
  {
  rcText.right = rcItem.right;
  }
  COLORREF crOldTextColor = pDC->GetTextColor();
  //繪制項焦點/高亮效果
  if(m_bFocus)
  {
  if((m_iItem == iItem) && (m_iSubItem == iSubItem))
  {if(m_bHighLight)
  {pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  pDC->FillSolidRect(&rcText, ::GetSysColor(COLOR_HIGHLIGHT));
  }
  pDC->DrawFocusRect(&rcText);
  }}
  //繪制項文本
  rcItem.left += 6;
  pDC->DrawText(strItemText, &rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOCLIP);
  pDC->SetTextColor(crOldTextColor);
  *pResult = CDRF_SKIPDEFAULT;// We've painted everything.
  }}單擊一次文本高亮,再單擊一次文本開始編輯在WM_LBUTTONDOWN消息處理中實現:void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  {
  m_bFocus = TRUE;
  LVHITTESTINFO lvhit;
  lvhit.pt = point;
  int item = SubItemHitTest(&lvhit);
  //if (over a item/subitem)
  if (item != -1 && (lvhit.flags & LVHT_ONITEM))
  {
  CListCtrl::OnLButtonDown(nFlags, point);
  if(m_bHighLight && m_iItem == lvhit.iItem && m_iSubItem == lvhit.iSubItem)
  {
  //第二次單擊
  EditLabel(m_iItem);
  return;
  }
  else
  {
  //第一次單擊
  m_iItem = lvhit.iItem;
  m_iSubItem = lvhit.iSubItem;
  m_bHighLight = TRUE;
  }
  }
  else
  {
  if(m_edtItemEdit.m_hWnd == NULL)
  {
  //未出現文本編輯框時
  m_bHighLight = FALSE;
  }
  CListCtrl::OnLButtonDown(nFlags, point);
  }
  Invalidate(); //強制重繪控件
  }關鍵的一步,對項文本進行編輯。在以上代碼中當執行到EditLabel時將會產生一個編輯框,這時需要將它進行子類化處理,以控制它出現的位置。void CEditListCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
  {
  LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  if (m_iSubItem >= 0)
  {
  ASSERT(m_iItem == pDispInfo->item.iItem);
  CRect rcSubItem;
  GetSubItemRect( pDispInfo->item.iItem, m_iSubItem, LVIR_BOUNDS, rcSubItem);
  //get edit control and subclass
  HWND hWnd= (HWND)SendMessage(LVM_GETEDITCONTROL);
  ASSERT(hWnd != NULL);
  VERIFY(m_edtItemEdit.SubclassWindow(hWnd));
  //move edit control text 4 pixel to the right of org label,
  //as Windows does it...編輯框定位
  m_edtItemEdit.m_iXPos = rcSubItem.left + 4;
  m_edtItemEdit.SetWindowText(GetItemText(pDispInfo->item.iItem, m_iSubItem));
  }
  *pResult = 0;
  }
  void CEditListCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
  {
  LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  LV_ITEM*plvItem = &pDispInfo->item;
  if (m_iSubItem >= 0)
  {
  if (plvItem->pszText != NULL )
  {
  SetItemText(plvItem->iItem,m_iSubItem, plvItem->pszText);
  }
  VERIFY(m_edtItemEdit.UnsubclassWindow()!=NULL);*pResult = 0;
  }
  //編輯文本時對控件父窗口操作(如單擊其它控件)引發"OnEndlabeledit"時刷新控件
  CRect rect;
  GetWindowRect(&rect);
  CPoint point;
  ::GetCursorPos(&point);
  if(!rect.PtInRect(point))
  {
  m_iItem = -1;
  m_iSubItem = -1;
  m_bFocus = FALSE;
  m_bHighLight = FALSE;
  }
  }通過以上三個步驟體實現了本文要達到的目的,但是還不能放松。接下來還要進行一些顯示細節方面的處理。這包括對WM_PAINT、WM_SETFOCUS和WM_KILLFOCUS消息的處理,限于篇幅,就不進行細講了,有興趣的朋友可以查看本文提供的源代碼。

百分百考試網 考試寶典

立即免費試用
国产精品久久久av久久久| 日本最新中文字幕| 亚洲国产一区二区久久| 国产精品成人观看视频免费| 久久亚洲精品爱爱| 精品无码一区二区三区爱欲| 免费欧美电影| 国产精品美女主播在线观看纯欲| av电影不卡在线观看| 少妇高潮久久77777| 亚洲国产一二三区| 久久夜色精品一区| 亚洲 欧美 中文字幕| 91麻豆精品国产91久久久资源速度| hs网站在线观看| 久久九九全国免费精品观看| 日韩电影免费观看| 欧美日韩国产一区在线| 天堂视频免费在线观看| 国产亚洲精品久久久久动| 国产网友自拍电影在线| 免费看毛片的网址| 亚洲视频精选在线| 福利成人在线观看| 日本性高潮视频| 国产欧美日韩精品一区| 日韩中文字幕观看| 欧美日韩久久不卡| 少妇高潮爽到全身痉挛抽搐 | 日韩一区av| 欧美精品乱码久久久久久| 色窝窝无码一区二区三区| 日韩精品专区在线| 99久久亚洲国产日韩美女| 国产中文字幕免费观看| 国产综合网站| 一级爱爱免费视频| 在线中文字幕日韩| 国产丰满美女做爰| 久久国产精品久久久久久久久久 | 狂野欧美xxxx韩国少妇| 欧美深性狂猛ⅹxxx深喉| 欧美日韩激情网| 久色视频网站| 久久噜噜噜精品国产亚洲综合| 特级毛片在线| 免费人成自慰网站| 国产乱人伦偷精品视频免下载 | 1024免费在线视频| 国产97在线观看| 国产美女高潮在线观看| 蜜桃999成人看片在线观看| 爽爽淫人综合网网站| 国产精品色综合| 欧美日韩一区二区三区四区五区 | av大片在线| wwwww在线观看| 欧美日韩一区二区三区不卡| 黄网站在线播放| www.av片| 亚洲国产精品ⅴa在线观看| 天堂视频在线| 国产伦精品一区二区三区四区免费 | 激情五月综合网| 日本少妇xxx| 成人久久18免费网站麻豆| 99草在线视频| 国产成人精品自拍| 久久只精品国产| chinesemodel无套啪啪| 91在线无精精品一区二区| 99麻豆久久久国产精品免费| 在线看黄色av| 精品国产黄色片| 老子影院午夜伦不卡大全| 中文字幕综合一区| 国产91综合网| av高清一区| www深夜成人a√在线| 久久五月天色综合| 外国成人毛片| 少妇喷水在线观看| 成人动漫网站在线观看| 日韩精品五月天| 中文字幕在线影视资源| 国产四区在线观看| 91蜜桃免费观看视频| 成人高清免费观看mv| 黄色小视频在线免费看| 国产精品久久久久久久久久三级| 日本成人中文字幕| 亚洲午夜一二三区视频| 97在线观看播放| 91手机在线观看| 国产精品成人在线观看| 国产一二在线观看| 亚洲日本伊人| 999精品视频在线观看播放| 777av视频| 91九色蝌蚪嫩草| 日韩av一卡二卡| 91免费国产在线观看| 欧美videos粗暴| 天堂av中文字幕| 快播日韩欧美| 久久综合狠狠综合久久综合88| 成人影音在线| 国产午夜性春猛交ⅹxxx| 天堂一区二区三区| 一区二区三区日韩欧美精品| 中文字幕97| 91传媒理伦片在线观看| 欧洲亚洲女同hd| 丝袜亚洲另类欧美重口| 国产片一区二区三区| 91福利在线尤物| 国产视频一区二区三区四区五区| 日韩欧美国产电影| 国产成人aaa| 猛性xxxxx| 中文字幕天堂网| 国产免费高清一区| 在线播放日韩导航| 国产欧美一区二区精品仙草咪| 日韩成人伦理电影在线观看| 国产精品亚洲片在线播放| 成人av色网站| av在线app| 2018狠狠干| 成人黄色激情视频| 玩弄japan白嫩少妇hd| 在线色欧美三级视频| 欧美国产1区2区| 欧美成人高清| 乱人伦视频在线| www.天天操.com| 男人的天堂a在线| 男人的天堂免费| xxxxxxxxx欧美| www.66久久| 欧美黄色a视频| 乳奴隷乳フ辱julia在线观看| 亚洲欧美日韩色| 成人激情视频免费在线| 欧美日本一道本| 国产精品综合二区| 牛牛影视久久网| 黄色av网站在线| 激情综合丝袜美女一区二区| 午夜在线观看一区| 哪个网站能看毛片| 国产精品欧美激情在线观看| 国产一区二区视频免费在线观看| 日韩精品视频在线观看视频| 色综合久久久久久久久五月| 欧美孕妇与黑人孕交| 欧美日韩免费一区二区三区视频| 亚洲国产激情| 精品在线91| 1区2区3区在线| 三上悠亚在线免费观看| 中国人体摄影一区二区三区| 国语精品一区| 全部孕妇毛片丰满孕妇孕交| 激情四射综合网| 欧美日韩性生活片| 欧美激情欧美狂野欧美精品| 亚洲精品v日韩精品| 一区二区三区四区五区精品视频| 欧美××××黑人××性爽| 四色成人av永久网址| 狂野欧美性猛交xxxx乱大交| 污视频在线免费观看| 日本一区二区三区免费视频| 成人午夜免费剧场| 日韩欧美电影一区二区| 国产精品高清在线观看| 日韩精品一区二区三区中文精品 | 亚洲欧美综合| 国模视频一区二区三区| 在线观看一二三区| 国语产色综合| 性欧美xxxx交| av在线亚洲天堂| 五月开心六月丁香综合色啪| 97在线视频一区| 午夜久久久久久久久久| 午夜国产欧美理论在线播放| 奇门遁甲1982国语版免费观看高清 | 欧美日韩一区二区视频在线| 天堂在线观看视频观看www| 国产在线精品视频| 视频一区三区| 高潮白浆视频| 亚洲视频中文字幕| 婷婷激情小说网| 中文在线免费视频| 亚洲毛片在线观看.| 毛片视频网站在线观看| 欧美电影《睫毛膏》|