青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

2013年11月18日

轉(zhuǎn)載~~~~~~~~~~~~源地址忘記了~~~~~~
禁止ListCtrl表頭拖動(dòng)(Prevent CListCtrl column resizing)
/*The header control in the ListView control sends notification to the parent window (e.i. the ListView) before it begins resizing a column. We can override the OnNotify() function in the CListCtrl derived class to handle this notification. The code below prevents resizing of all columns. Note that the resize cursor still shows up. */
BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
switch (((NMHDR*)lParam)->code)
{
case HDN_BEGINTRACKW:
case HDN_BEGINTRACKA:
*pResult = TRUE; // disable tracking
return TRUE; // Processed message
}

return CListCtrl::OnNotify(wParam, lParam, pResult);
}  
/*
If you want to prevent resizing of only one column, you should check for the value in iItem field of the HD_NOTIFY structure. The code below stops only the first column from being resized. */

BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam;

if((pHDN->hdr.code == HDN_BEGINTRACKW || pHDN->hdr.code == HDN_BEGINTRACKA)
&& pHDN->iItem == 0) // Prevent only first (col# 0) from resizing
{
*pResult = TRUE; // disable tracking
return TRUE; // Processed message
}

return CListCtrl::OnNotify(wParam, lParam, pResult);

posted @ 2013-11-18 09:33 Mumoo 閱讀(1557) | 評(píng)論 (1)編輯 收藏

2013年10月23日

向已存在的文件中插入首行
BOOL AddTitleColumn(CString &sTxtFile)
{
 CStdioFile stdFile;
 if ( stdFile.Open(sTxtFile,  CFile::modeCreate | CFile::modeNoTruncate
  | CFile::modeReadWrite|CFile::shareExclusive) )
 {
  CIni ini(CCommonFun::GetExecutablePath() +"Config.ini");
  CString sTitleRow = ini.GetString("ListCtrl", "ViewColumName");

  CStringArray arrLines;
  arrLines.Add(sTitleRow);

  stdFile.SeekToBegin();
  CString str;
  while(stdFile.ReadString(str))
  {
   arrLines.Add(str);
  }

  stdFile.SeekToBegin();
  int nCount = arrLines.GetSize();
  for ( int i = 0; i < nCount; i++ )
  {
   CString sContent;
   if (i > 0)
   {
    sContent.Format("%d,%s", i, arrLines[i]);
   }
   else
   {
    sContent = arrLines[i];
   }

   stdFile.WriteString (sContent);
   stdFile.WriteString ("\n");
  }

  stdFile.Close();
  return TRUE;
 }
 return FALSE;
}

生成一個(gè)帶標(biāo)題的文件

BOOL CBarView::ExportDataFile(CString sDataFile/*, CStringArray &arsWriteString*/)
{
 CStdioFile stdFile;
 if ( stdFile.Open(sDataFile,  CFile::modeCreate | CFile::modeNoTruncate
  | CFile::modeReadWrite|CFile::shareExclusive) )
 {
  CString sTitleRow = "序號(hào),文件名,份數(shù),頁(yè)數(shù)";
  stdFile.WriteString (sTitleRow);
  stdFile.WriteString ("\n");

  for (int i = 0; i < (int)m_data.data.size(); i++)
  {
   CString sLineData;
   for (int j = 0; j < (int)m_data.data.at(i).size(); j++)
   {
    CString sData = m_data.data.at(i).at(j);
    if (j != 0)
    {
     sData.Format(", %s", sData);
    }
    else
    {
     sData.Format("%s", sData);
    }

    sLineData += sData;
   }

   CString sLine;
   sLine.Format("%d, %s", (i+1), sLineData);
   stdFile.WriteString (sLine);
   stdFile.WriteString ("\n");
  }

  stdFile.Close();
  return TRUE;
 }

 LOG("創(chuàng)建文件 %s 失敗", sDataFile);
 return FALSE;
}

posted @ 2013-10-23 09:56 Mumoo 閱讀(797) | 評(píng)論 (0)編輯 收藏

2013年10月10日

獲取總列數(shù):int columns = m_listCtrl->GetHeaderCtrl()->GetItemCount();
刪除所有列數(shù):while(m_listCtrl->DeleteColumn(0));
posted @ 2013-10-10 10:51 Mumoo 閱讀(452) | 評(píng)論 (0)編輯 收藏

2013年4月15日

在網(wǎng)上查找的ListCtrl方法

以下未經(jīng)說(shuō)明,listctrl默認(rèn)view風(fēng)格為report
-------------------------------------------------------------------------------
1. CListCtrl 風(fēng)格
LVS_ICON: 為每個(gè)item顯示大圖標(biāo)
LVS_SMALLICON: 為每個(gè)item顯示小圖標(biāo)
LVS_LIST: 顯示一列帶有小圖標(biāo)的item
LVS_REPORT: 顯示item詳細(xì)資料
直觀(guān)的理解:windows資源管理器,"查看"標(biāo)簽下的"大圖標(biāo),小圖標(biāo),列表,詳細(xì)資料
--------------------------------------------------------------------------------
2. 設(shè)置listctrl風(fēng)格及擴(kuò)展風(fēng)格
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當(dāng)前窗口style
lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
lStyle |= LVS_REPORT; //設(shè)置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//設(shè)置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風(fēng)格的listctrl
dwStyle |= LVS_EX_GRIDLINES;//網(wǎng)格線(xiàn)(只適用與report風(fēng)格的listctrl
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //設(shè)置擴(kuò)展風(fēng)格
注:listviewstyle請(qǐng)查閱msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3. 插入數(shù)據(jù)
m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );

//新插入的在上面
int nRow = m_list.InsertItem(0, "11");// 插入行
m_list.SetItemText(nRow, 1, "jacky");//設(shè)置其它列數(shù)據(jù)

//新插入的數(shù)據(jù)在下面

int nIndex = m_list.GetItemCount();
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT ;
lvItem.iItem = nIndex; //行數(shù)
lvItem.iSubItem = 0;
lvItem.pszText = (char*)(LPCTSTR)strCount; //第一列
//在最后一行插入記錄值.
m_list.InsertItem(&lvItem);
//插入其它列
m_list.SetItemText(nIndex,1,strLat);

--------------------------------------------------------------------------------
4. 一直選中item
選中style中的Show selection always,或者在上面第2點(diǎn)中設(shè)置LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
5. 選中和取消選中一行
int nIndex = 0;
//選中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消選中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------
6. 得到listctrl中所有行的checkbox的狀態(tài)
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("%d行的checkbox為選中狀態(tài)"), i);
AfxMessageBox(str);
}
}
--------------------------------------------------------------------------------
7. 得到listctrl中所有選中行的序號(hào)
方法一:
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("選中了第%d"), i);
AfxMessageBox(str);
}
}
方法二:
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
Else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
--------------------------------------------------------------------------------
8. 得到item的信息
TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);
關(guān)于得到設(shè)置item的狀態(tài),還可以參考msdn文章
Q173242: Use Masks to Set/Get Item States in ClistCtrl
http://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9. 得到listctrl的所有列的header字符串內(nèi)容
LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[4];//假如有4
nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
--------------------------------------------------------------------------------
10. 使listctrl中一項(xiàng)可見(jiàn),即滾動(dòng)滾動(dòng)條
m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到listctrl列數(shù)
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12. 刪除所有列
方法一:
while ( m_list.DeleteColumn (0))
因?yàn)槟銊h除了第一列后,后面的列會(huì)依次向上移動(dòng)。
方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
--------------------------------------------------------------------------------
13. 得到單擊的listctrl的行列號(hào)
添加listctrl控件的NM_CLICK消息相應(yīng)函數(shù)
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// 方法一:
/*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d", lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*/
// 方法二:
/*
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult = 0;
}
--------------------------------------------------------------------------------
14. 判斷是否點(diǎn)擊在listctrlcheckbox
添加listctrl控件的NM_CLICK消息相應(yīng)函數(shù)
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
UINT nFlag;
int nItem = m_list.HitTest(point, &nFlag);
//判斷是否點(diǎn)在checkbox
if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("點(diǎn)在listctrlcheckbox");
}
*pResult = 0;
}
--------------------------------------------------------------------------------
15. 右鍵點(diǎn)擊listctrlitem彈出菜單
添加listctrl控件的NM_RCLICK消息相應(yīng)函數(shù)
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
*pResult = 0;
}

16. item切換焦點(diǎn)時(shí)(包括用鍵盤(pán)和鼠標(biāo)切換item時(shí)),狀態(tài)的一些變化順序
添加listctrl控件的LVN_ITEMCHANGED消息相應(yīng)函數(shù)
void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CString sTemp;
if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && (pNMListView->uNewState & LVIS_FOCUSED) == 0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}
if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
(pNMListView->uNewState & LVIS_SELECTED) == 0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_SELECTED) == 0 && (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}
*pResult = 0;
--------------------------------------------------------------------------------
17. 得到另一個(gè)進(jìn)程里的listctrl控件的item內(nèi)容
http://www.codeproject.com/threads/int64_memsteal.asp

--------------------------------------------------------------------------------
18. 選中listview中的item
Q131284: How To Select a Listview Item Programmatically
http://support.microsoft.com/kb/131284/en-us

--------------------------------------------------------------------------------
19. 如何在CListView中使用CListCtrl的派生類(lèi)
http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/

--------------------------------------------------------------------------------
20. listctrlsubitem添加圖標(biāo)
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_list.SetItem(..); //具體參數(shù)請(qǐng)參考msdn


}

str.Format("你雙擊了:%d行,%d列",pList->iItem,pList->iSubItem);
MessageBox(str);

*pResult = 0;
}


常用操作:
1、添加列標(biāo)題頭:InsertColumn
2、獲取與設(shè)置列寬:GetColumnWidth、SetColumnWidth
3、添加一行:InsertItem、SetItemText
4、獲取與設(shè)置單元文本:GetItemText、SetItemText
5、允許多行選中時(shí),獲取選中的行數(shù):GetSelectedCount
6、單行選中時(shí),獲取選中的行:GetSelectionMark
7、選中某行:SetItemState(n, LVIS_SELECTED, LVIS_SELECTED);取消選中的行SetItemState(n,0,-1);使用此函數(shù)前需要先調(diào)用SetFocus();
8、獲取某行的狀態(tài)是否為選中:GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED
9、刪除所有行:DeleteAllItems
10、刪除指定列:DeleteColumn
11、刪除指定行:DeleteItem
12、獲取與設(shè)置列表控件的背景色:GetBkColor、SetBkColor
13、獲取與設(shè)置文字背景色:GetTextBkColor、SetTextBkColor
14、獲取與設(shè)置文字前景色:GetTextColor、SetTextColor
15、獲取與設(shè)置Check:GetCheck、SetCheck,使用前需要設(shè)置控件屬性SetExtendedStyle(LVS_EX_CHECKBOXES);使控件有勾選功能
16、獲取與設(shè)置圖標(biāo)列表:GetImageList、SetImageList
17、獲取與設(shè)置行附加數(shù)據(jù):GetItemData、SetItemData
18、獲取與設(shè)置擴(kuò)展風(fēng)格樣式:GetExtendedStyle、SetExtendedStyle
19、設(shè)置正行選中與網(wǎng)格線(xiàn):SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
20、讓ListCtrl支持編輯的功能:
①、將屬性中的 Edit Labels 設(shè)置為 True;
②、響應(yīng)控件的 LVN_EDNLABELEDIT 消息,添加如下代碼:
CString strText;
m_ListCtrl.GetEditControl()->GetWindowText(strText);
m_ListCtrl.SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, strText);

21、多行可選時(shí),跳到第一個(gè)被選中的行,即使第一個(gè)被選中的行可視。

POSITION pos = pView->GetListCtrl().GetFirstSelectedItemPosition();
int nFirstSel = pView->GetListCtrl().GetNextSelectedItem(pos);
if (nFirstSel != -1)
{
pView->GetListCtrl().EnsureVisible(nFirstSel,FALSE);
}

 

列表中添加圖標(biāo)代碼:

UINT nIconID[] = {IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4,IDI_ICON5};//圖標(biāo)ID
m_ImageList.Create(16,16,ILC_COLOR24,sizeof(nIconID)/sizeof(UINT),0);//初始化CImageList類(lèi),sizeof(nIconID)/sizeof(UINT)為圖標(biāo)個(gè)數(shù),后面的0表示CImageList在sizeof(nIconID)/sizeof(UINT)個(gè)圖標(biāo)個(gè)數(shù)的基礎(chǔ)上可再添加多少個(gè)圖標(biāo)。
m_ImageList.SetBkColor(RGB(255,255,255));//設(shè)置背景色為白色
for(int i = 0; i < sizeof(nIconID)/sizeof(UINT); i++)
{
m_ImageList.Add(AfxGetApp()->LoadIcon(nIconID[i]));//將圖標(biāo)添加到CImageList
}
m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);//設(shè)置列表控件顯示圖標(biāo)

m_ListCtrl.InsertColumn(0,_T("第1列"),0,100);
m_ListCtrl.InsertColumn(1,_T("第2列"),0,100);
m_ListCtrl.InsertColumn(2,_T("第3列"),0,100);
m_ListCtrl.InsertItem(0,_T("數(shù)據(jù)1"),0);//后面的0表示添加CImageList中的第0個(gè)圖標(biāo)
m_ListCtrl.InsertItem(1,_T("數(shù)據(jù)2"),1);//后面的1表示添加CImageList中的第1個(gè)圖標(biāo)
m_ListCtrl.InsertItem(2,_T("數(shù)據(jù)3"),2);
m_ListCtrl.SetItemText(0,1,_T("01"));
m_ListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);//設(shè)置控件有勾選功能
DWORD dwStyle = m_ListCtrl.GetExtendedStyle();
m_ListCtrl.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT);設(shè)置控件選中行的功能

 

遍歷文件夾并顯示文件名與圖標(biāo):

CFileFind fileFind;
CString szDir("D:\\Tools");
BOOL bRet = fileFind.FindFile(szDir+"\\*.*");
while(bRet)
{
bRet = fileFind.FindNextFile();
if(fileFind.IsDots())
continue;
if(!fileFind.IsDirectory())
{
SHFILEINFO shfi;
SHGetFileInfo(fileFind.GetFilePath(),FILE_ATTRIBUTE_NORMAL,&shfi,sizeof(shfi),SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME);
int nImageID = m_ImageList.Add(shfi.hIcon);
m_ListCtrl.InsertItem(m_ListCtrl.GetItemCount(),fileFind.GetFileName(),nImageID);
}
}

 

復(fù)制列表內(nèi)容

void CXXXView::OnCopydataToClipboard()
{
int nSelectCount = GetListCtrl().GetSelectedCount();
int nSelect = -1;
CString strData = _T("");
for (int i = 0; i < nSelectCount; i++)
{
//找到選擇的行號(hào)
nSelect = GetListCtrl().GetNextItem(nSelect,LVNI_ALL | LVNI_SELECTED);
//列數(shù)
int nColumnCount = GetListCtrl().GetHeaderCtrl()->GetItemCount();
for (int j = 0; j < nColumnCount; j++)
{
CString text;
text = GetListCtrl().GetItemText(nSelect,j);
if (j != 0)
strData += "\t";
strData += text;
}
//用\r\n來(lái)控制回車(chē)和換行
if (i != nSelectCount - 1)
strData += "\r\n";
}

//復(fù)制到剪貼板
HGLOBAL clipbordBuf = GlobalAlloc(GMEM_DDESHARE,2*(strData.GetLength() + 1));
TCHAR *pBuf = (TCHAR*)GlobalLock(clipbordBuf);
lstrcpy((LPTSTR)pBuf,(LPCTSTR)strData);
GlobalUnlock(clipbordBuf);

OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_TEXT,pBuf);
CloseClipboard();
}

 

 

在非第一列中添加圖標(biāo)

m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES);

 

m_List.SetItem(0,1,LVIF_TEXT|LVIF_IMAGE,“aaa”,0,0,0,0);//在第一行第二列加入第1個(gè)圖標(biāo)

m_List.SetItem(i,1,LVIF_TEXT|LVIF_IMAGE,szBuffer,i,0,0,0);


posted @ 2013-04-15 17:20 Mumoo 閱讀(1674) | 評(píng)論 (0)編輯 收藏
 

 

CStringList類(lèi)成員
構(gòu)造

構(gòu)造一個(gè)空的CString對(duì)象列表

首/尾訪(fǎng)問(wèn)

GetHead
返回此列表(不能是空的)中頭部的元素
GetTail 返回此列表(不能是空的)中尾部的元素

操作

RemoveHead
從列表的頭部刪除元素
RemoveTail 從列表的尾部刪除元素
AddHead 在列表的頭部添加一個(gè)元素(或者是另一個(gè)列表中的所有元素),即產(chǎn)生一個(gè)新的頭部
AddTail 在列表的尾部添加一個(gè)元素(或者是另一個(gè)列表中的所有元素),即產(chǎn)生一個(gè)新的尾部
RemoveAll 刪除此列表中的所有元素

重復(fù)

GetHeadPosition
返回列表中的頭部元素的位置
GetTailPosition 返回列表中尾部元素的位置
GetNext 獲取用于重復(fù)的下一個(gè)元素
GetPrev 獲取用于重復(fù)的前一個(gè)元素

獲取/修改

獲取給定位置處的元素
SetAt 設(shè)置給定位置處的元素
RemoveAt 從此列表中刪除由位置指定的一個(gè)元素

插入

InsertBefore
在一個(gè)給定位置之前插入一個(gè)新元素
InsertAfter 在一個(gè)給定位置之后插入一個(gè)新元素

搜索

獲取由字符串值指定的元素的位置
FindIndex 獲取由一個(gè)從零開(kāi)始的索引指定的元素的位置

狀態(tài)

返回此列表中的元素個(gè)數(shù)
IsEmpty 測(cè)試列表是否為空(沒(méi)有元素)

CStringList是CString鏈表,在MFC編程中STL之外的另一選擇,用起來(lái)更加簡(jiǎn)潔.

插入數(shù)據(jù):AddTail();AddHead()

刪除數(shù)據(jù):RemoveAll();RemoveAt();RemoveHead();RemoveTail()

取得元素個(gè)數(shù):GetCount()

取得某個(gè)元素值:GetAt(cstringList.FindIndex(index))//index為整數(shù)

取得頭尾元素:GetHead() ;GetTail(),

遍歷最好用上面的方式,不要用POSITION變量,用FindIndex可以了。

初始化:

 

CStringList listFileName;
listFileName.RemoveAll();

 

 

添加操作:

 

listFileName.AddTail(szFullPathName);

 

遍歷操作:

 

POSITION rPos;
rPos = listFileName.GetHeadPosition();
while (rPos != NULL)
{
strFileName = listFileName.GetNext(rPos);
strLog += "/r/n" + strFileName;
}

posted @ 2013-04-15 16:28 Mumoo 閱讀(15952) | 評(píng)論 (0)編輯 收藏

2013年4月12日

MessageBox(NULL, "警示框", "提示框", \
  MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "信息提示框", "提示框", \
  MB_OK|MB_ICONASTERISK|MB_SYSTEMMODAL|MB_SETFOREGROUND);
 MessageBox(NULL, "信息框", "提示框", \
  MB_OK|MB_ICONINFORMATION|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "錯(cuò)誤框", "提示框", \
  MB_OK|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "句柄框", "提示框", \
  MB_OK|MB_ICONHAND|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "提問(wèn)框", "提示框", \
  MB_OKCANCEL|MB_ICONQUESTION|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "停止框", "提示框", \
  MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "添加幫助框", "提示框", \
  MB_HELP|MB_ICONWARNING|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "YESNO Cancel,添加默認(rèn)選項(xiàng)", "提示框", \
  MB_YESNOCANCEL|MB_ICONWARNING|MB_DEFBUTTON1|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "RETRYCANCEL", "提示框", \
  MB_RETRYCANCEL|MB_ICONWARNING|MB_DEFBUTTON2|MB_SYSTEMMODAL|MB_SETFOREGROUND);

 MessageBox(NULL, "CANCELTRYCONTINUE", "提示框", \
  MB_CANCELTRYCONTINUE|MB_ICONWARNING|MB_DEFBUTTON3|MB_SYSTEMMODAL|MB_SETFOREGROUND);

posted @ 2013-04-12 14:51 Mumoo 閱讀(1869) | 評(píng)論 (0)編輯 收藏

2013年4月11日

2013年1月17日

原文出處:http://blog.csdn.net/bqw2008/article/details/2047489
 Windows ListCtrl使用技巧
1. ListCtrl 風(fēng)格
LVS_ICON: 為每個(gè)item顯示大圖標(biāo)
LVS_SMALLICON: 為每個(gè)item顯示小圖標(biāo)
LVS_LIST: 顯示一列帶有小圖標(biāo)的item
LVS_REPORT: 顯示item詳細(xì)資料

直觀(guān)的理解:windows資源管理器,“查看”標(biāo)簽下的“大圖標(biāo),小圖標(biāo),列表,詳細(xì)資料”
--------------------------------------------------------------------------------
2. 設(shè)置listctrl 風(fēng)格及擴(kuò)展風(fēng)格 LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當(dāng)前窗口style
lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
lStyle |= LVS_REPORT; //設(shè)置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//設(shè)置style

DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風(fēng)格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//網(wǎng)格線(xiàn)(只適用與report風(fēng)格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //設(shè)置擴(kuò)展風(fēng)格

注:listview的style請(qǐng)查閱msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3. 插入數(shù)據(jù) m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列
m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
int nRow = m_list.InsertItem(0, “11”);//插入行
m_list.SetItemText(nRow, 1, “jacky”);//設(shè)置數(shù)據(jù)
--------------------------------------------------------------------------------
4. 一直選中item 選中style中的Show selection always,或者在上面第2點(diǎn)中設(shè)置LVS_SHOWSELALWAYS

--------------------------------------------------------------------------------
5. 選中和取消選中一行 int nIndex = 0;
//選中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消選中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------
6. 得到listctrl中所有行的checkbox的狀態(tài) m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))
{
str.Format(_T("第%d行的checkbox為選中狀態(tài)"), i);
AfxMessageBox(str);
}
}
--------------------------------------------------------------------------------
7. 得到listctrl中所有選中行的序號(hào)
方法一:
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{
if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
str.Format(_T("選中了第%d行"), i);
AfxMessageBox(str);
}
}

方法二:
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!/n");
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
TRACE1("Item %d was selected!/n", nItem);
// you could do your own processing on nItem here
}
}
--------------------------------------------------------------------------------
8. 得到item的信息 TCHAR szBuf[1024];
LVITEM lvi;
lvi.iItem = nItemIndex;
lvi.iSubItem = 0;
lvi.mask = LVIF_TEXT;
lvi.pszText = szBuf;
lvi.cchTextMax = 1024;
m_list.GetItem(&lvi);

關(guān)于得到設(shè)置item的狀態(tài),還可以參考msdn文章
Q173242: Use Masks to Set/Get Item States in CListCtrl
http://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9. 得到listctrl的所有列的header字符串內(nèi)容 LVCOLUMN lvcol;
char str[256];
int nColNum;
CString strColumnName[4];//假如有4列

nColNum = 0;
lvcol.mask = LVCF_TEXT;
lvcol.pszText = str;
lvcol.cchTextMax = 256;
while(m_list.GetColumn(nColNum, &lvcol))
{
strColumnName[nColNum] = lvcol.pszText;
nColNum++;
}
--------------------------------------------------------------------------------
10. 使listctrl中一項(xiàng)可見(jiàn),即滾動(dòng)滾動(dòng)條 m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到listctrl列數(shù) int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12. 刪除所有列 方法一:
while ( m_list.DeleteColumn (0))
因?yàn)槟銊h除了第一列后,后面的列會(huì)依次向上移動(dòng)。

方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
--------------------------------------------------------------------------------
13. 得到單擊的listctrl的行列號(hào) 添加listctrl控件的NM_CLICK消息相應(yīng)函數(shù)
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// 方法一:
/*
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

m_list.ScreenToClient(&point);

LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;

int nItem = m_list.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列", lvinfo.iItem, lvinfo.iSubItem);
AfxMessageBox(strtemp);
}
*/

// 方法二:
/*
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
CString strtemp;
strtemp.Format("單擊的是第%d行第%d列",
pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);
}
*/
*pResult = 0;
}
--------------------------------------------------------------------------------
14. 判斷是否點(diǎn)擊在listctrl的checkbox上 添加listctrl控件的NM_CLICK消息相應(yīng)函數(shù)
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

m_list.ScreenToClient(&point);

LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;

UINT nFlag;
int nItem = m_list.HitTest(point, &nFlag);
//判斷是否點(diǎn)在checkbox上
if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("點(diǎn)在listctrl的checkbox上");
}
*pResult = 0;
}
--------------------------------------------------------------------------------
15. 右鍵點(diǎn)擊listctrl的item彈出菜單 添加listctrl控件的NM_RCLICK消息相應(yīng)函數(shù)
void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1)
{
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

CMenu menu;
VERIFY( menu.LoadMenu( IDR_MENU1 ) );
CMenu* popup = menu.GetSubMenu(0);
ASSERT( popup != NULL );
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
*pResult = 0;
}
--------------------------------------------------------------------------------
16. item切換焦點(diǎn)時(shí)(包括用鍵盤(pán)和鼠標(biāo)切換item時(shí)),狀態(tài)的一些變化順序 添加listctrl控件的LVN_ITEMCHANGED消息相應(yīng)函數(shù)
void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here

CString sTemp;

if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED &&
(pNMListView->uNewState & LVIS_FOCUSED) == 0)
{
sTemp.Format("%d losted focus",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&
(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)
{
sTemp.Format("%d got focus",pNMListView->iItem);
}

if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&
(pNMListView->uNewState & LVIS_SELECTED) == 0)
{
sTemp.Format("%d losted selected",pNMListView->iItem);
}
else if((pNMListView->uOldState & LVIS_SELECTED) == 0 &&
(pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)
{
sTemp.Format("%d got selected",pNMListView->iItem);
}

*pResult = 0;
}
--------------------------------------------------------------------------------
20. listctrl的subitem添加圖標(biāo) m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_userlist.SetItem(..); //具體參數(shù)請(qǐng)參考msdn
--------------------------------------------------------------------------------
21. 在CListCtrl顯示文件,并根據(jù)文件類(lèi)型來(lái)顯示圖標(biāo) 網(wǎng)上找到的代碼,share
BOOL CTest6Dlg::OnInitDialog()
{
CDialog::OnInitDialog();

HIMAGELIST himlSmall;
HIMAGELIST himlLarge;
SHFILEINFO sfi;
char cSysDir[MAX_PATH];
CString strBuf;

memset(cSysDir, 0, MAX_PATH);

GetWindowsDirectory(cSysDir, MAX_PATH);
strBuf = cSysDir;
sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("file:///));

himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON );

himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_LARGEICON);

if (himlSmall && himlLarge)
{
::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
(WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);
::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,
(WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);
}
return TRUE; // return TRUE unless you set the focus to a control
}

void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)
{
int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);
CString strSize;
CFileFind filefind;

// get file size
if (filefind.FindFile(lpszFileName))
{
filefind.FindNextFile();
strSize.Format("%d", filefind.GetLength());
}
else
strSize = "0";

// split path and filename
CString strFileName = lpszFileName;
CString strPath;

int nPos = strFileName.ReverseFind('//');
if (nPos != -1)
{
strPath = strFileName.Left(nPos);
strFileName = strFileName.Mid(nPos + 1);
}

// insert to list
int nItem = m_list.GetItemCount();
m_list.InsertItem(nItem, strFileName, nIcon);
m_list.SetItemText(nItem, 1, strSize);
m_list.SetItemText(nItem, 2, strFileName.Right(3));
m_list.SetItemText(nItem, 3, strPath);
}

int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
{
SHFILEINFO sfi;
memset(&sfi, 0, sizeof(sfi));

if (bIsDir)
{
SHGetFileInfo(lpszPath,
FILE_ATTRIBUTE_DIRECTORY,
&sfi,
sizeof(sfi),
SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0));
return sfi.iIcon;
}
else
{
SHGetFileInfo (lpszPath,
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(sfi),
SHGFI_SMALLICON | SHGFI_SYSICONINDEX |
SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));
return sfi.iIcon;
}
return -1;
}

--------------------------------------------------------------------------------
22. listctrl內(nèi)容進(jìn)行大數(shù)據(jù)量更新時(shí),避免閃爍 m_list.SetRedraw(FALSE);
//更新內(nèi)容
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

創(chuàng)建圖形列表并和CListCtrl關(guān)聯(lián):
m_image_list.Create(IDB_CALLER2, 16, 10, RGB(192,192, 192));
m_image_list.SetBkColor( GetSysColor( COLOR_WINDOW ) );
m_caller_list.SetImageList( &m_image_list, LVSIL_SMALL);
為報(bào)表添加4列:
char *szColumn[]={"昵稱(chēng)","IP地址","登陸時(shí)間","狀態(tài)"};
int widths[]={100,98,70,55};
LV_COLUMN lvc;
lvc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;
lvc.fmt=LVCFMT_LEFT;
for(int i=0;i<4;i++) {//插入各列
lvc.pszText=szColumn[i];
lvc.cx=widths[i];
lvc.iSubItem=i;
m_caller_list.InsertColumn(i,&lvc);
}
為報(bào)表添加兩項(xiàng),以附加方式添加:
char* data[4];
data[0]="所有人";
data[1]="0.0.0.0";
data[3]="在線(xiàn)";
data[2]=new char;
CTime now=CTime::GetCurrentTime();
CString temp = now.Format("%H:%M:%S");
data[2]=temp.GetBuffer(1);
LV_ITEM lvi;
lvi.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
lvi.iSubItem=0;
lvi.pszText=(char *)data[0];
lvi.iImage = 0;
lvi.iItem=0;
m_caller_list.InsertItem(&lvi);
for (int j=0;j<4;j++) m_caller_list.SetItemText(count,j,data[j]);
count++;
lvi.iImage = 1;
lvi.iItem=count;
m_caller_list.InsertItem(&lvi);
data[0]="cherami";
data[1]="127.0.0.1";
for (int n=0;n<4;n++) m_caller_list.SetItemText(count,n,data[n]);
count++;
設(shè)置報(bào)表的樣式
選中一整行:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
繪制表格:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_GRIDLINES);
帶復(fù)選框:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_CHECKBOXES);
自動(dòng)切換:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_TRACKSELECT);
選定一行:
設(shè)置CListCtrl的Show selection always選項(xiàng)
SetItemState (iIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED)
選中一個(gè)或多個(gè)項(xiàng)目時(shí),會(huì)發(fā)送LVN_ITEMCHANGED消息,可以使用
GetSelectedCount()方法得到被選定的項(xiàng)的數(shù)目。
點(diǎn)擊列頭的消息響應(yīng):
ON_NOTIFY(HDN_ITEMCLICKW, 0, ResponseFunc)
消息,需要自己添加
或者:
ON_NOTIFY(LVN_COLUMNCLICK, ID_yourCtrl, ResponseFunc)//向?qū)砑?br />前者后響應(yīng),后者先響應(yīng)
響應(yīng)函數(shù):
ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult)
雙擊CListCtrl中的ITEM的消息是及消息函數(shù):
ON_NOTIFY(NM_DBLCLK, ID_yourCtrl, ResponseFunc)
單擊ITEM的消息響應(yīng):
ON_NOTIFY(NM_CLICK, ID_yourCtrl, ResponseFunc)
ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult)

HDN_ITEMCLICK 就是Header control Notify message for mouse left click on the Header control!
而HDN_ITEMCLICK是當(dāng)List View中存在一個(gè)Header Contrl時(shí),Header Ctrl通知父窗口List View的!
CListCtrl中的Item被選中觸發(fā)LBN_SELCHANGE(通過(guò)WM_COMMAND)消息!
刪除CListCtrl中選定的項(xiàng):
POSITION pos;
int nIndex;
for(; pos= GetFirstSelectedItemPosition();)
{
nIndex = GetNextSelectedItem(pos);
DeleteItem(nIndex);
}
在ListCtrl中進(jìn)行排序
列表控件(CListCtrl)的頂部有一排按鈕,用戶(hù)可以通過(guò)選擇不同的列來(lái)對(duì)記錄進(jìn)行排序。但是 CListCtrl并沒(méi)有自動(dòng)排序的功能,我們需要自己添加一個(gè)用于排序的回調(diào)函數(shù)來(lái)比較兩個(gè)數(shù)據(jù)的大小,此外還需要響應(yīng)排序按鈕被點(diǎn)擊的消息。下面講述一下具體的做法。
CListCtrl提供了用于排序的函數(shù),函數(shù)原型為:BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData )。其中第一個(gè)參數(shù)為全局排序函數(shù)的地址,第二個(gè)參數(shù)為用戶(hù)數(shù)據(jù),你可以根據(jù)你的需要傳遞一個(gè)數(shù)據(jù)或是指針。該函數(shù)返回-1代表第一項(xiàng)排應(yīng)在第二項(xiàng)前面,返回1代表第一項(xiàng)排應(yīng)在第二項(xiàng)后面,返回0代表兩項(xiàng)相等。
用于排序的函數(shù)原形為:int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort),其中第三個(gè)參數(shù)為調(diào)用者傳遞的數(shù)據(jù)(即調(diào)用SortItems時(shí)的第二個(gè)參數(shù)dwData)。第一和第二個(gè)參數(shù)為用于比較的兩項(xiàng)的ItemData,你可以通過(guò)DWORD CListCtrl::GetItemData( int nItem )/BOOL CListCtrl::SetItemData( int nItem, DWORD dwData )來(lái)對(duì)每一項(xiàng)的ItemData進(jìn)行存取。在添加項(xiàng)時(shí)選用特定的CListCtrl::InsertItem也可以設(shè)置該值。由于你在排序時(shí)只能通過(guò)該值來(lái)確定項(xiàng)的位置所以你應(yīng)該比較明確的確定該值的含義。
最后一點(diǎn),我們需要知道什么時(shí)候需要排序,實(shí)現(xiàn)這點(diǎn)可以在父窗口中對(duì)LVN_COLUMNCLICK消息進(jìn)行處理來(lái)實(shí)現(xiàn)。
下面我們看一個(gè)例子,這個(gè)例子是一個(gè)派生類(lèi),并支持順序/倒序兩種方式排序。為了簡(jiǎn)單我對(duì)全局?jǐn)?shù)據(jù)進(jìn)行排序,而在實(shí)際應(yīng)用中會(huì)有多組需要排序的數(shù)據(jù),所以需要通過(guò)傳遞參數(shù)的方式來(lái)告訴派序函數(shù)需要對(duì)什么數(shù)據(jù)進(jìn)行排序。

//全局?jǐn)?shù)據(jù)
struct DEMO_DATA
{
char szName[20];
int iAge;
}strAllData[5]={{"王某",30},{"張某",40},{"武某",32},{"陳某",20},{"李某",36}};
//CListCtrl派生類(lèi)定義
class CSortList : public CListCtrl
{
// Construction
public:
CSortList();
BOOL m_fAsc;//是否順序排序
int m_nSortedCol;//當(dāng)前排序的列
protected:
//{{AFX_MSG(CSortList)
//}}AFX_MSG
...
};
//父窗口中包含該CListCtrl派生類(lèi)對(duì)象
class CSort_in_list_ctrlDlg : public CDialog
{
// Construction
public:
CSort_in_list_ctrlDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CSort_in_list_ctrlDlg)
enum { IDD = IDD_SORT_IN_LIST_CTRL_DIALOG };
CSortList m_listTest;
//}}AFX_DATA
}
//在父窗口中定義LVN_COLUMNCLICK消息映射
BEGIN_MESSAGE_MAP(CSort_in_list_ctrlDlg, CDialog)
//{{AFX_MSG_MAP(CSort_in_list_ctrlDlg)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnColumnclickList1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//初始化數(shù)據(jù)
BOOL CSort_in_list_ctrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//初始化ListCtrl中數(shù)據(jù)列表
m_listTest.InsertColumn(0,"姓名");
m_listTest.InsertColumn(1,"年齡");
m_listTest.SetColumnWidth(0,80);
m_listTest.SetColumnWidth(1,80);
for(int i=0;i<5;i++)
{
m_listTest.InsertItem(i,strAllData[i].szName);
char szAge[10];
sprintf(szAge,"%d",strAllData[i].iAge);
m_listTest.SetItemText(i,1,szAge);
//設(shè)置每項(xiàng)的ItemData為數(shù)組中數(shù)據(jù)的索引
//在排序函數(shù)中通過(guò)該ItemData來(lái)確定數(shù)據(jù)
m_listTest.SetItemData(i,i);
}
return TRUE; // return TRUE unless you set the focus to a control
}
//處理消息
void CSort_in_list_ctrlDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//設(shè)置排序方式
if( pNMListView->iSubItem == m_listTest.m_nSortedCol )
m_listTest.m_fAsc = !m_listTest.m_fAsc;
else
{
m_listTest.m_fAsc = TRUE;
m_listTest.m_nSortedCol = pNMListView->iSubItem;
}
//調(diào)用排序函數(shù)
m_listTest.SortItems( ListCompare, (DWORD)&m_listTest );
*pResult = 0;
}
//排序函數(shù)實(shí)現(xiàn)
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//通過(guò)傳遞的參數(shù)來(lái)得到CSortList對(duì)象指針,從而得到排序方式
CSortList* pV=(CSortList*)lParamSort;
//通過(guò)ItemData來(lái)確定數(shù)據(jù)
DEMO_DATA* pInfo1=strAllData+lParam1;
DEMO_DATA* pInfo2=strAllData+lParam2;
CString szComp1,szComp2;
int iCompRes;
switch(pV->m_nSortedCol)
{
case(0):
//以第一列為根據(jù)排序
szComp1=pInfo1->szName;
szComp2=pInfo2->szName;
iCompRes=szComp1.Compare(szComp2);
break;
case(1):
//以第二列為根據(jù)排序
if(pInfo1->iAge == pInfo2->iAge)
iCompRes = 0;
else
iCompRes=(pInfo1->iAge < pInfo2->iAge)?-1:1;
break;
default:
ASSERT(0);
break;
}
//根據(jù)當(dāng)前的排序方式進(jìn)行調(diào)整
if(pV->m_fAsc)
return iCompRes;
else
return iCompRes*-1;
}
排序最快:
CListCtrl::SortItems
Example
// Sort the item in reverse alphabetical order.
static int CALLBACK
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// lParamSort contains a pointer to the list view control.
// The lParam of an item is just its index.
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
CString strItem1 = pListCtrl->GetItemText(lParam1, 0);
CString strItem2 = pListCtrl->GetItemText(lParam2, 0);
return strcmp(strItem2, strItem1);
}
void snip_CListCtrl_SortItems()
{
// The pointer to my list view control.
extern CListCtrl* pmyListCtrl;
// Sort the list view items using my callback procedure.
pmyListCtrl->SortItems(MyCompareProc, (LPARAM) pmyListCtrl);
}

If you don’t want to allow the users to sort the list by clicking on the header, you can use the style LVS_NOSORTHEADER. However, if you do want to allow sorting, you do not specify the LVS_NOSORTHEADER. The control, though, does not sort the items. You have to handle the HDN_ITEMCLICK notification from the header control and process it appropriately. In the code below, we have used the sorting function SortTextItems() developed in a previous section. You may choose to sort the items in a different manner.
Step 1: Add two member variables
Add two member variables to the CListCtrl. The first variable to track which column has been sorted on, if any. The second variable to track if the sort is ascending or descending.
int nSortedCol;
BOOL bSortAscending;

Step 2: Initialize them in the constructor.
Initialize nSortedCol to -1 to indicate that no column has been sorted on. If the list is initially sorted, then this variable should reflect that.

nSortedCol = -1;
bSortAscending = TRUE;

Step 3: Add entry in message map to handle HDN_ITEMCLICK
Actually you need to add two entries. For HDN_ITEMCLICKA and HDN_ITEMCLICKW. Do not use the class wizard to add the entry. For one, you need to add two entries whereas the class wizard will allow you only one. Secondly, the class wizard uses the wrong macro in the entry. It uses ON_NOTIFY_REFLECT() instead of ON_NOTIFY(). Since the HDN_ITEMCLICK is a notification from the header control to the list view control, it is a direct notification and not a reflected one.
ON_NOTIFY(HDN_ITEMCLICKA, 0, OnHeaderClicked)
ON_NOTIFY(HDN_ITEMCLICKW, 0, OnHeaderClicked)
Note that we specify the same function for both the notification. Actually the program will receive one or the other and not both. What notification it receives will depend on the OS. The list view control on Windows 95 will send the ANSI version and the control on NT will send the UNICODE version.
Also, note that the second argument is zero. This value filters for the id of the control and we know that header control id is zero.
Step 4: Write the OnHeaderClicked() function
Here’s where you decide what to do when the user clicks on a column header. The expected behaviour is to sort the list based on the values of the items in that column. In this function we have used the SortTextItems() function developed in a previous section. If any of the columns displays numeric or date values, then you would have to provide custom sorting for them.

void CMyListCtrl::OnHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
if( phdn->iButton == 0 )
{
// User clicked on header using left mouse button
if( phdn->iItem == nSortedCol )
bSortAscending = !bSortAscending;
else
bSortAscending = TRUE;
nSortedCol = phdn->iItem;
SortTextItems( nSortedCol, bSortAscending );
}
*pResult = 0;
}
讓CListCtrl的SubItem也具有編輯功能:
要重載一個(gè)文本框,然后在LVN_BEGINLABELEDIT時(shí)改變文本框位置。
CInEdit m_InEdit;
if( ( GetStyle() & LVS_TYPEMASK ) == LVS_REPORT && ( m_nEditSubItem != 0 ) )
{
HWND hwndEdit;
CRect rtBound;
CString strText;
hwndEdit = (HWND)SendMessage( LVM_GETEDITCONTROL );
GetSubItemRect( pDispInfo->item.iItem, m_nEditSubItem, LVIR_LABEL, rtBound );
m_InEdit.SubclassWindow( hwndEdit );
m_InEdit.m_left = rtBound.left;
strText = GetItemText( pDispInfo->item.iItem, m_nEditSubItem );
m_InEdit.SetWindowText( strText );
}
void CInEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
CRect rtClient;
lpwndpos->x = m_left; // m_left在LVN_BEGINLABELEDIT中設(shè)置
CEdit::OnWindowPosChanging(lpwndpos);

// TODO: Add your message handler code here

}

posted @ 2013-01-17 10:32 Mumoo 閱讀(6523) | 評(píng)論 (0)編輯 收藏

2012年11月27日

結(jié)構(gòu):
CTime(
  int nYear,
  int nMonth,
  int nDay,
  int nHour,
  int nMin,
  int nSec,
  int nDST = -1
 //參數(shù)nDST指定是否實(shí)行夏令時(shí),為0時(shí)表示實(shí)行標(biāo)準(zhǔn)時(shí)間,為正數(shù)時(shí)表示實(shí)行夏令時(shí),為負(fù)數(shù)時(shí)由系統(tǒng)自動(dòng)計(jì)算實(shí)行的是標(biāo)準(zhǔn)時(shí)間還是夏令時(shí)。
  );

 =====================================================================
  C++中,CTime 與 CString轉(zhuǎn)換
  CTime m_StartTime1 = CTime::GetCurrentTime();
  CString csStartTime = m_StartTime1.Format( "%Y%m%d%H%M%S" );
  一.將CString轉(zhuǎn)為CTime的幾種方法
  CString timestr = "2000年04月05日";
  int a,b,c ;
  sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c);
  CTime time(a,b,c,0,0,0);
  --------or - ---------------------
  CString s("2001-8-29 19:06:23");
  int nYear, nMonth, nDate, nHour, nMin, nSec;
  sscanf(s, "%d-%d-%d %d:%d:%d", &nYear, &nMonth, &nDate, &nHour, &nMin, &nSec);
  CTime t(nYear, nMonth, nDate, nHour, nMin, nSec);
  ---- or ------------------------
  CString timestr = "2000年04月05日";
  int year,month,day;
  BYTE tt[5];
  //get year
  memset(tt, 0, sizeof(tt));
  tt[0] = timestr[0];
  tt[1] = timestr[1];
  tt[2] = timestr[2];
  tt[3] = timestr[3];
  year= atoi((char *)tt);
  //get month
  memset(tt, 0, sizeof(tt));
  tt[0] = timestr[6];
  tt[1] = timestr[7];
  month = atoi((char *)tt);
  //get day
  memset(tt, 0, sizeof(tt));
  tt[0] = timestr[10];
  tt[1] = timestr[11];
  CTime time(year,month,day,0,0,0);
  從上面來(lái)看,很明顯使用sscanf()函數(shù)的優(yōu)勢(shì).
  二.將CTime轉(zhuǎn)換為CString的方法:
  CTime tmSCan = CTime::GetCurrentTime();
  CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");
  這樣得到的日期時(shí)間字符串就是以"2006-11-27 23:30:59"的格式.
  //取得CTime中的日期
  CString cstrDate = tmScan.Format("%Y-%m-%d");
  //取得CTime中的時(shí)間
  CString cstrTime = tmScan.Format("%H:%M-%S");
  sprintf還有個(gè)不錯(cuò)的表妹:strftime,專(zhuān)門(mén)用于格式化時(shí)間字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細(xì),她還要調(diào)用者指定緩沖區(qū)的最大長(zhǎng)度,可能是為了在出現(xiàn)問(wèn)題時(shí)可以推卸責(zé)任吧。這里舉個(gè)例子:
  更多更好的sprintf()函數(shù)說(shuō)明參考:《spirntf,你知道多少?》
  time_t t = time(0);
  //產(chǎn)生"YYYY-MM-DD hh:mm:ss"格式的字符串。
  char s[32];
  strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
  sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,這一對(duì)由于從面向?qū)ο?/a>哪里得到了贊助,用以寫(xiě)出的代碼更覺(jué)優(yōu)雅
=====================================================================

獲取時(shí)間及時(shí)間參數(shù)方法:
static CTime WINAPI GetCurrentTime( );
  獲取系統(tǒng)當(dāng)前日期和時(shí)間。返回表示當(dāng)前日期和時(shí)間的CTime對(duì)象。 
CString Format(LPCTSTR pszFormat) const;
  將CTime對(duì)象中的時(shí)間信息格式化為字符串。參數(shù)pszFormat是格式化字符串,與printf中的格式化字符串類(lèi)似,格式化字符串中帶有%前綴的格式碼將會(huì)被相應(yīng)的CTime時(shí)間分量代替,而其他字符會(huì)原封不動(dòng)的拷貝到返回字符串中。格式碼及含義如下:
  %a:周的英文縮寫(xiě)形式。
  %A:周的英文全名形式。
  %b: 月的英文縮寫(xiě)形式。
  %B:月的英文全名形式。
  %c: 完整的日期和時(shí)間。
  %d:十進(jìn)制形式的日期(01-31)。
  %H:24小時(shí)制的小時(shí)(00-23)。
  %I: 12小時(shí)制的小時(shí)(00-11)。
  %j: 十進(jìn)制表示的一年中的第幾天(001-366)。
  %m: 月的十進(jìn)制表示(01-12)。
  %M:十進(jìn)制表示的分鐘(00-59)。
  %p: 12小時(shí)制的上下午標(biāo)示(AM/PM)。
  %S: 十進(jìn)制表示的秒(00-59)。
  %U: 一年中的第幾個(gè)星期(00-51),星期日是一周的第一天。
  %W: 一年中的第幾個(gè)星期(00-51),星期一是一周的第一天。
  %w: 十進(jìn)制表示的星期幾(0-6)。
  %Y: 十進(jìn)制表示的年。

      CTime(const SYSTEMTIME& st,int nDST = - 1) ;
  以一個(gè)SYSTEMTIME結(jié)構(gòu)體變量來(lái)構(gòu)造CTime對(duì)象。SYSTEMTIME結(jié)構(gòu)體也是我們對(duì)日期時(shí)間的常用表示方式。參數(shù)st為以本地時(shí)間表示的SYSTEMTIME對(duì)象,參數(shù)nDST同上。
  int GetYear( ) const;
  獲取CTime對(duì)象表示時(shí)間的年份。范圍從1970年1月1日到2038年(包括2038年)1月18日。
  int GetMonth( ) const;
  獲取CTime對(duì)象表示時(shí)間的月份。范圍為1到12。
  int GetDay( ) const;
  獲取CTime對(duì)象表示時(shí)間的日期。范圍為1到31。
  int GetHour( ) const;
  獲取CTime對(duì)象表示時(shí)間的小時(shí)。范圍為0到23。
  int GetMinute( ) const;
  獲取CTime對(duì)象表示時(shí)間的分鐘。范圍為0到59。
  int GetSecond( ) const;
  獲取CTime對(duì)象表示時(shí)間的秒。范圍為0到59。
  int GetDayOfWeek( ) const;
  此函數(shù)的返回值表示CTime對(duì)象代表的是星期幾,1表示是周日,2表示是周一,以此類(lèi)推。
 
操作與比較:
CTime operator +(CTimeSpan timeSpan) const;
  將CTime對(duì)象和CTimeSpan對(duì)象相加,返回一個(gè)CTime對(duì)象。實(shí)際意義就是在一個(gè)時(shí)間的基礎(chǔ)上推后一個(gè)時(shí)間間隔,得到一個(gè)新的時(shí)間。
CTime operator -(CTimeSpan timeSpan) const;
  將CTime對(duì)象和一個(gè)CTimeSpan相減,返回一個(gè)CTime對(duì)象。實(shí)際意義就是在一個(gè)時(shí)間的基礎(chǔ)上提前一個(gè)時(shí)間間隔,得到一個(gè)新的時(shí)間。
CTimeSpan operator -(CTime time) const;
  將該CTime對(duì)象和另一個(gè)CTime對(duì)象相減,返回一個(gè)CTimeSpan對(duì)象。實(shí)際意義就是計(jì)算兩個(gè)時(shí)間點(diǎn)的間隔,得到一個(gè)CTimeSpan對(duì)象。
CTime& operator +=(CTimeSpan span);
  為該CTime對(duì)象增加一個(gè)span表示的時(shí)間間隔。
CTime& operator -=(CTimeSpan span);
  為該CTime對(duì)象減去一個(gè)span表示的時(shí)間間隔。
CTime& operator =(__time64_t time);
  為該CTime對(duì)象賦予一個(gè)新的時(shí)間值。
  簡(jiǎn)單說(shuō)下剩下的幾個(gè)重載i運(yùn)算符:
  operator == : 比較兩個(gè)絕對(duì)時(shí)間是否相等。
  operator != : 比較兩個(gè)絕對(duì)時(shí)間是否不相等。
  operator > : 比較兩個(gè)絕對(duì)時(shí)間,是否前一個(gè)大于后一個(gè)。
  operator < : 比較兩個(gè)絕對(duì)時(shí)間,是否前一個(gè)小于后一個(gè)。
  operator >= : 比較兩個(gè)絕對(duì)時(shí)間,是否前一個(gè)大于等于后一個(gè)。
  operator <= : 比較兩個(gè)絕對(duì)時(shí)間,是否前一個(gè)小于等于后一個(gè)

2012年11月20日

設(shè)置行高:
CImageList   m_l;  
 m_l.Create(1,18,TRUE|ILC_COLOR32,1,0);  
 SetImageList(&m_l,LVSIL_SMALL);

設(shè)置字體:

 

CFont m_font;

m_font.CreatePointFont(100, "新宋體");
m_listCtrl.SetFont(&m_font);

posted @ 2012-11-20 16:00 Mumoo 閱讀(5058) | 評(píng)論 (0)編輯 收藏
僅列出標(biāo)題  下一頁(yè)
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲美女视频网| 久久精品亚洲一区二区三区浴池| 伊人久久婷婷色综合98网| 欧美三级韩国三级日本三斤| 欧美不卡在线视频| 欧美成人在线免费视频| 欧美黑人国产人伦爽爽爽| 欧美国产一区二区| 欧美区一区二| 国产精品电影网站| 国产日韩欧美在线视频观看| 国产在线拍揄自揄视频不卡99| 激情久久五月| 亚洲美女91| 亚洲女人天堂av| 亚洲一区国产视频| 亚洲国产免费| 亚洲欧美www| 久久综合狠狠综合久久综合88| 免费日韩成人| 一区二区三区欧美视频| 亚洲私拍自拍| 蜜臀va亚洲va欧美va天堂| 欧美女主播在线| 国产午夜精品全部视频在线播放| 亚洲国产一区二区在线| 亚洲在线免费观看| 麻豆精品精华液| 夜夜嗨网站十八久久| 久久久久久成人| 欧美深夜影院| 亚洲国产综合91精品麻豆| 午夜精品婷婷| 亚洲级视频在线观看免费1级| 亚洲国产高清在线观看视频| av不卡在线观看| 免费黄网站欧美| 国产日韩一区二区三区在线| 亚洲片在线资源| 久久久久久久尹人综合网亚洲| 亚洲国产精品传媒在线观看 | 国产欧美一区二区三区在线老狼| 好吊一区二区三区| 亚洲一区二区网站| 欧美二区视频| 香蕉久久夜色精品| 国产精品视频内| 一二美女精品欧洲| 欧美顶级艳妇交换群宴| 亚洲性xxxx| 欧美三级网页| 这里只有视频精品| 欧美一区二区高清| 日韩一级黄色片| 欧美成年人视频| 亚洲电影免费观看高清完整版在线| 亚洲在线播放电影| 亚洲精品欧美极品| 欧美高清你懂得| 亚洲福利视频在线| 欧美激情在线| 欧美成人激情在线| 激情五月婷婷综合| 免费高清在线一区| 久久一区二区精品| 亚洲二区免费| 欧美韩日一区二区| 老牛嫩草一区二区三区日本| 影音先锋久久资源网| 久久综合色8888| 男人的天堂亚洲在线| 亚洲高清视频在线| 美玉足脚交一区二区三区图片| 久久精品国产亚洲一区二区三区| 黄色国产精品| 亚洲第一在线视频| 欧美—级高清免费播放| 亚洲免费黄色| 在线一区二区三区做爰视频网站| 国产精品日韩欧美一区| 欧美亚洲午夜视频在线观看| 亚洲欧美日韩一区| 在线播放日韩欧美| 亚洲激精日韩激精欧美精品| 免费不卡在线观看av| 影音先锋久久| 日韩视频专区| 国产精品卡一卡二| 久久国产成人| 欧美成人免费在线视频| 亚洲午夜久久久久久尤物 | 亚洲国产精品va在线观看黑人| 久久久水蜜桃| 亚洲欧洲午夜| 亚洲一本大道在线| 在线观看成人av电影| 欧美mv日韩mv国产网站| 欧美不卡激情三级在线观看| 正在播放日韩| 欧美一级片久久久久久久| 国产美女精品视频免费观看| 六月天综合网| 欧美午夜精品一区| 美女诱惑一区| 欧美午夜久久| 欧美99久久| 国产精品久久一卡二卡| 亚洲第一主播视频| 国产三区二区一区久久| 亚洲韩日在线| 激情久久久久| 亚洲欧美日韩中文视频| 亚洲日本成人| 欧美一区二区三区免费视频| 亚洲激情图片小说视频| 亚洲专区在线| 亚洲视频你懂的| 另类激情亚洲| 久久国产主播| 国产精品日产欧美久久久久| 日韩亚洲精品电影| 亚洲人在线视频| 久久亚洲午夜电影| 久久久精品tv| 国产免费成人在线视频| 一区二区三区成人| 亚洲精品视频免费观看| 久久久精品国产一区二区三区| 一区二区三区欧美在线| 媚黑女一区二区| 免费日韩av片| 在线观看一区欧美| 久久深夜福利免费观看| 久久先锋资源| 久久天堂精品| 亚洲国产精品成人一区二区| 国产亚洲一区二区精品| 在线视频欧美日韩精品| 亚洲精品五月天| 欧美成人中文| 亚洲激情校园春色| 亚洲精品一二区| 欧美77777| 亚洲春色另类小说| 亚洲美女精品一区| 欧美精品啪啪| 亚洲美女精品成人在线视频| 亚洲精选91| 欧美成人一区在线| 亚洲日本精品国产第一区| 亚洲精品国产精品国自产在线| 欧美夫妇交换俱乐部在线观看| 欧美激情一区二区在线| 亚洲精品乱码久久久久久蜜桃麻豆| 女生裸体视频一区二区三区| 亚洲国产经典视频| 一本色道久久综合精品竹菊| 欧美精品一二三| 欧美激情中文不卡| 亚洲精品日韩欧美| 欧美性大战xxxxx久久久| 一区二区欧美在线| 性欧美超级视频| 国产日韩精品入口| 久久蜜桃精品| 亚洲精美视频| 亚洲欧美日韩爽爽影院| 国产欧美日本一区二区三区| 性欧美在线看片a免费观看| 免费不卡在线观看av| 亚洲精品日韩精品| 国产精品青草久久久久福利99| 午夜精品久久久久久久久久久久| 久久五月激情| 亚洲免费观看在线观看| 国产精品嫩草影院一区二区| 91久久精品美女高潮| 欧美一级在线播放| 亚洲精品久久久久久久久| 国产精品高清一区二区三区| 久久久999成人| 亚洲人在线视频| 久久国产手机看片| 亚洲黄色一区二区三区| 久久精品二区三区| 亚洲精品一区二区三区99| 欧美与黑人午夜性猛交久久久| 国产亚洲美州欧州综合国| 欧美va天堂va视频va在线| 亚洲天堂男人| 亚洲激情视频网| 久久综合国产精品| 亚洲特级毛片| 91久久精品国产91性色tv| 国产欧美日韩免费看aⅴ视频| 欧美国产综合| 欧美aa国产视频| 久久国产精品久久精品国产| 亚洲精选中文字幕| 老司机午夜精品视频|