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

2013年11月18日

轉載~~~~~~~~~~~~源地址忘記了~~~~~~
禁止ListCtrl表頭拖動(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) | 評論 (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;
}

生成一個帶標題的文件

BOOL CBarView::ExportDataFile(CString sDataFile/*, CStringArray &arsWriteString*/)
{
 CStdioFile stdFile;
 if ( stdFile.Open(sDataFile,  CFile::modeCreate | CFile::modeNoTruncate
  | CFile::modeReadWrite|CFile::shareExclusive) )
 {
  CString sTitleRow = "序號,文件名,份數,頁數";
  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("創建文件 %s 失敗", sDataFile);
 return FALSE;
}

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

2013年10月10日

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

2013年4月15日

在網上查找的ListCtrl方法

以下未經說明,listctrl默認view風格為report
-------------------------------------------------------------------------------
1. CListCtrl 風格
LVS_ICON: 為每個item顯示大圖標
LVS_SMALLICON: 為每個item顯示小圖標
LVS_LIST: 顯示一列帶有小圖標的item
LVS_REPORT: 顯示item詳細資料
直觀的理解:windows資源管理器,"查看"標簽下的"大圖標,小圖標,列表,詳細資料
--------------------------------------------------------------------------------
2. 設置listctrl風格及擴展風格
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//獲取當前窗口style
lStyle &= ~LVS_TYPEMASK; //清除顯示方式位
lStyle |= LVS_REPORT; //設置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//設置style
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl
dwStyle |= LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //設置擴展風格
注:listviewstyle請查閱msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3. 插入數據
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");//設置其它列數據

//新插入的數據在下面

int nIndex = m_list.GetItemCount();
LV_ITEM lvItem;
lvItem.mask = LVIF_TEXT ;
lvItem.iItem = nIndex; //行數
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點中設置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的狀態
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為選中狀態"), i);
AfxMessageBox(str);
}
}
--------------------------------------------------------------------------------
7. 得到listctrl中所有選中行的序號
方法一:
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);
關于得到設置item的狀態,還可以參考msdn文章
Q173242: Use Masks to Set/Get Item States in ClistCtrl
http://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9. 得到listctrl的所有列的header字符串內容
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中一項可見,即滾動滾動條
m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到listctrl列數
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12. 刪除所有列
方法一:
while ( m_list.DeleteColumn (0))
因為你刪除了第一列后,后面的列會依次向上移動。
方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
--------------------------------------------------------------------------------
13. 得到單擊的listctrl的行列號
添加listctrl控件的NM_CLICK消息相應函數
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. 判斷是否點擊在listctrlcheckbox
添加listctrl控件的NM_CLICK消息相應函數
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);
//判斷是否點在checkbox
if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("點在listctrlcheckbox");
}
*pResult = 0;
}
--------------------------------------------------------------------------------
15. 右鍵點擊listctrlitem彈出菜單
添加listctrl控件的NM_RCLICK消息相應函數
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切換焦點時(包括用鍵盤和鼠標切換item),狀態的一些變化順序
添加listctrl控件的LVN_ITEMCHANGED消息相應函數
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. 得到另一個進程里的listctrl控件的item內容
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的派生類
http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/

--------------------------------------------------------------------------------
20. listctrlsubitem添加圖標
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_list.SetItem(..); //具體參數請參考msdn


}

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

*pResult = 0;
}


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

21、多行可選時,跳到第一個被選中的行,即使第一個被選中的行可視。

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

 

列表中添加圖標代碼:

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

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("數據1"),0);//后面的0表示添加CImageList中的第0個圖標
m_ListCtrl.InsertItem(1,_T("數據2"),1);//后面的1表示添加CImageList中的第1個圖標
m_ListCtrl.InsertItem(2,_T("數據3"),2);
m_ListCtrl.SetItemText(0,1,_T("01"));
m_ListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);//設置控件有勾選功能
DWORD dwStyle = m_ListCtrl.GetExtendedStyle();
m_ListCtrl.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT);設置控件選中行的功能

 

遍歷文件夾并顯示文件名與圖標:

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);
}
}

 

復制列表內容

void CXXXView::OnCopydataToClipboard()
{
int nSelectCount = GetListCtrl().GetSelectedCount();
int nSelect = -1;
CString strData = _T("");
for (int i = 0; i < nSelectCount; i++)
{
//找到選擇的行號
nSelect = GetListCtrl().GetNextItem(nSelect,LVNI_ALL | LVNI_SELECTED);
//列數
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來控制回車和換行
if (i != nSelectCount - 1)
strData += "\r\n";
}

//復制到剪貼板
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();
}

 

 

在非第一列中添加圖標

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個圖標

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


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

 

CStringList類成員
構造

構造一個空的CString對象列表

首/尾訪問

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

操作

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

重復

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

獲取/修改

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

插入

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

搜索

獲取由字符串值指定的元素的位置
FindIndex 獲取由一個從零開始的索引指定的元素的位置

狀態

返回此列表中的元素個數
IsEmpty 測試列表是否為空(沒有元素)

CStringList是CString鏈表,在MFC編程中STL之外的另一選擇,用起來更加簡潔.

插入數據:AddTail();AddHead()

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

取得元素個數:GetCount()

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

取得頭尾元素: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) | 評論 (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, "錯誤框", "提示框", \
  MB_OK|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);

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

 MessageBox(NULL, "提問框", "提示框", \
  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,添加默認選項", "提示框", \
  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) | 評論 (0)編輯 收藏

2013年4月11日

2013年1月17日

原文出處:http://blog.csdn.net/bqw2008/article/details/2047489
 Windows ListCtrl使用技巧
1. ListCtrl 風格
LVS_ICON: 為每個item顯示大圖標
LVS_SMALLICON: 為每個item顯示小圖標
LVS_LIST: 顯示一列帶有小圖標的item
LVS_REPORT: 顯示item詳細資料

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

DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //設置擴展風格

注:listview的style請查閱msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
--------------------------------------------------------------------------------
3. 插入數據 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”);//設置數據
--------------------------------------------------------------------------------
4. 一直選中item 選中style中的Show selection always,或者在上面第2點中設置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的狀態 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為選中狀態"), i);
AfxMessageBox(str);
}
}
--------------------------------------------------------------------------------
7. 得到listctrl中所有選中行的序號
方法一:
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);

關于得到設置item的狀態,還可以參考msdn文章
Q173242: Use Masks to Set/Get Item States in CListCtrl
http://support.microsoft.com/kb/173242/en-us
--------------------------------------------------------------------------------
9. 得到listctrl的所有列的header字符串內容 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中一項可見,即滾動滾動條 m_list.EnsureVisible(i, FALSE);
--------------------------------------------------------------------------------
11. 得到listctrl列數 int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
--------------------------------------------------------------------------------
12. 刪除所有列 方法一:
while ( m_list.DeleteColumn (0))
因為你刪除了第一列后,后面的列會依次向上移動。

方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
--------------------------------------------------------------------------------
13. 得到單擊的listctrl的行列號 添加listctrl控件的NM_CLICK消息相應函數
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. 判斷是否點擊在listctrl的checkbox上 添加listctrl控件的NM_CLICK消息相應函數
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);
//判斷是否點在checkbox上
if(nFlag == LVHT_ONITEMSTATEICON)
{
AfxMessageBox("點在listctrl的checkbox上");
}
*pResult = 0;
}
--------------------------------------------------------------------------------
15. 右鍵點擊listctrl的item彈出菜單 添加listctrl控件的NM_RCLICK消息相應函數
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切換焦點時(包括用鍵盤和鼠標切換item時),狀態的一些變化順序 添加listctrl控件的LVN_ITEMCHANGED消息相應函數
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添加圖標 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_userlist.SetItem(..); //具體參數請參考msdn
--------------------------------------------------------------------------------
21. 在CListCtrl顯示文件,并根據文件類型來顯示圖標 網上找到的代碼,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內容進行大數據量更新時,避免閃爍 m_list.SetRedraw(FALSE);
//更新內容
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();

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

創建圖形列表并和CListCtrl關聯:
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);
為報表添加4列:
char *szColumn[]={"昵稱","IP地址","登陸時間","狀態"};
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);
}
為報表添加兩項,以附加方式添加:
char* data[4];
data[0]="所有人";
data[1]="0.0.0.0";
data[3]="在線";
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++;
設置報表的樣式
選中一整行:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_FULLROWSELECT);
繪制表格:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_GRIDLINES);
帶復選框:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_CHECKBOXES);
自動切換:
m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle()|LVS_EX_TRACKSELECT);
選定一行:
設置CListCtrl的Show selection always選項
SetItemState (iIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED)
選中一個或多個項目時,會發送LVN_ITEMCHANGED消息,可以使用
GetSelectedCount()方法得到被選定的項的數目。
點擊列頭的消息響應:
ON_NOTIFY(HDN_ITEMCLICKW, 0, ResponseFunc)
消息,需要自己添加
或者:
ON_NOTIFY(LVN_COLUMNCLICK, ID_yourCtrl, ResponseFunc)//向導添加
前者后響應,后者先響應
響應函數:
ResponseFunc(NMHDR *pNMHDR, LRESULT *pResult)
雙擊CListCtrl中的ITEM的消息是及消息函數:
ON_NOTIFY(NM_DBLCLK, ID_yourCtrl, ResponseFunc)
單擊ITEM的消息響應:
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是當List View中存在一個Header Contrl時,Header Ctrl通知父窗口List View的!
CListCtrl中的Item被選中觸發LBN_SELCHANGE(通過WM_COMMAND)消息!
刪除CListCtrl中選定的項:
POSITION pos;
int nIndex;
for(; pos= GetFirstSelectedItemPosition();)
{
nIndex = GetNextSelectedItem(pos);
DeleteItem(nIndex);
}
在ListCtrl中進行排序
列表控件(CListCtrl)的頂部有一排按鈕,用戶可以通過選擇不同的列來對記錄進行排序。但是 CListCtrl并沒有自動排序的功能,我們需要自己添加一個用于排序的回調函數來比較兩個數據的大小,此外還需要響應排序按鈕被點擊的消息。下面講述一下具體的做法。
CListCtrl提供了用于排序的函數,函數原型為:BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData )。其中第一個參數為全局排序函數的地址,第二個參數為用戶數據,你可以根據你的需要傳遞一個數據或是指針。該函數返回-1代表第一項排應在第二項前面,返回1代表第一項排應在第二項后面,返回0代表兩項相等。
用于排序的函數原形為:int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort),其中第三個參數為調用者傳遞的數據(即調用SortItems時的第二個參數dwData)。第一和第二個參數為用于比較的兩項的ItemData,你可以通過DWORD CListCtrl::GetItemData( int nItem )/BOOL CListCtrl::SetItemData( int nItem, DWORD dwData )來對每一項的ItemData進行存取。在添加項時選用特定的CListCtrl::InsertItem也可以設置該值。由于你在排序時只能通過該值來確定項的位置所以你應該比較明確的確定該值的含義。
最后一點,我們需要知道什么時候需要排序,實現這點可以在父窗口中對LVN_COLUMNCLICK消息進行處理來實現。
下面我們看一個例子,這個例子是一個派生類,并支持順序/倒序兩種方式排序。為了簡單我對全局數據進行排序,而在實際應用中會有多組需要排序的數據,所以需要通過傳遞參數的方式來告訴派序函數需要對什么數據進行排序。

//全局數據
struct DEMO_DATA
{
char szName[20];
int iAge;
}strAllData[5]={{"王某",30},{"張某",40},{"武某",32},{"陳某",20},{"李某",36}};
//CListCtrl派生類定義
class CSortList : public CListCtrl
{
// Construction
public:
CSortList();
BOOL m_fAsc;//是否順序排序
int m_nSortedCol;//當前排序的列
protected:
//{{AFX_MSG(CSortList)
//}}AFX_MSG
...
};
//父窗口中包含該CListCtrl派生類對象
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()
//初始化數據
BOOL CSort_in_list_ctrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//初始化ListCtrl中數據列表
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);
//設置每項的ItemData為數組中數據的索引
//在排序函數中通過該ItemData來確定數據
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;
//設置排序方式
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;
}
//調用排序函數
m_listTest.SortItems( ListCompare, (DWORD)&m_listTest );
*pResult = 0;
}
//排序函數實現
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//通過傳遞的參數來得到CSortList對象指針,從而得到排序方式
CSortList* pV=(CSortList*)lParamSort;
//通過ItemData來確定數據
DEMO_DATA* pInfo1=strAllData+lParam1;
DEMO_DATA* pInfo2=strAllData+lParam2;
CString szComp1,szComp2;
int iCompRes;
switch(pV->m_nSortedCol)
{
case(0):
//以第一列為根據排序
szComp1=pInfo1->szName;
szComp2=pInfo2->szName;
iCompRes=szComp1.Compare(szComp2);
break;
case(1):
//以第二列為根據排序
if(pInfo1->iAge == pInfo2->iAge)
iCompRes = 0;
else
iCompRes=(pInfo1->iAge < pInfo2->iAge)?-1:1;
break;
default:
ASSERT(0);
break;
}
//根據當前的排序方式進行調整
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也具有編輯功能:
要重載一個文本框,然后在LVN_BEGINLABELEDIT時改變文本框位置。
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中設置
CEdit::OnWindowPosChanging(lpwndpos);

// TODO: Add your message handler code here

}

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

2012年11月27日

結構:
CTime(
  int nYear,
  int nMonth,
  int nDay,
  int nHour,
  int nMin,
  int nSec,
  int nDST = -1
 //參數nDST指定是否實行夏令時,為0時表示實行標準時間,為正數時表示實行夏令時,為負數時由系統自動計算實行的是標準時間還是夏令時。
  );

 =====================================================================
  C++中,CTime 與 CString轉換
  CTime m_StartTime1 = CTime::GetCurrentTime();
  CString csStartTime = m_StartTime1.Format( "%Y%m%d%H%M%S" );
  一.將CString轉為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);
  從上面來看,很明顯使用sscanf()函數的優勢.
  二.將CTime轉換為CString的方法:
  CTime tmSCan = CTime::GetCurrentTime();
  CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");
  這樣得到的日期時間字符串就是以"2006-11-27 23:30:59"的格式.
  //取得CTime中的日期
  CString cstrDate = tmScan.Format("%Y-%m-%d");
  //取得CTime中的時間
  CString cstrTime = tmScan.Format("%H:%M-%S");
  sprintf還有個不錯的表妹:strftime,專門用于格式化時間字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是畢竟小姑娘家心細,她還要調用者指定緩沖區的最大長度,可能是為了在出現問題時可以推卸責任吧。這里舉個例子:
  更多更好的sprintf()函數說明參考:《spirntf,你知道多少?》
  time_t t = time(0);
  //產生"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,這一對由于從面向對象哪里得到了贊助,用以寫出的代碼更覺優雅
=====================================================================

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

      CTime(const SYSTEMTIME& st,int nDST = - 1) ;
  以一個SYSTEMTIME結構體變量來構造CTime對象。SYSTEMTIME結構體也是我們對日期時間的常用表示方式。參數st為以本地時間表示的SYSTEMTIME對象,參數nDST同上。
  int GetYear( ) const;
  獲取CTime對象表示時間的年份。范圍從1970年1月1日到2038年(包括2038年)1月18日。
  int GetMonth( ) const;
  獲取CTime對象表示時間的月份。范圍為1到12。
  int GetDay( ) const;
  獲取CTime對象表示時間的日期。范圍為1到31。
  int GetHour( ) const;
  獲取CTime對象表示時間的小時。范圍為0到23。
  int GetMinute( ) const;
  獲取CTime對象表示時間的分鐘。范圍為0到59。
  int GetSecond( ) const;
  獲取CTime對象表示時間的秒。范圍為0到59。
  int GetDayOfWeek( ) const;
  此函數的返回值表示CTime對象代表的是星期幾,1表示是周日,2表示是周一,以此類推。
 
操作與比較:
CTime operator +(CTimeSpan timeSpan) const;
  將CTime對象和CTimeSpan對象相加,返回一個CTime對象。實際意義就是在一個時間的基礎上推后一個時間間隔,得到一個新的時間。
CTime operator -(CTimeSpan timeSpan) const;
  將CTime對象和一個CTimeSpan相減,返回一個CTime對象。實際意義就是在一個時間的基礎上提前一個時間間隔,得到一個新的時間。
CTimeSpan operator -(CTime time) const;
  將該CTime對象和另一個CTime對象相減,返回一個CTimeSpan對象。實際意義就是計算兩個時間點的間隔,得到一個CTimeSpan對象。
CTime& operator +=(CTimeSpan span);
  為該CTime對象增加一個span表示的時間間隔。
CTime& operator -=(CTimeSpan span);
  為該CTime對象減去一個span表示的時間間隔。
CTime& operator =(__time64_t time);
  為該CTime對象賦予一個新的時間值。
  簡單說下剩下的幾個重載i運算符:
  operator == : 比較兩個絕對時間是否相等。
  operator != : 比較兩個絕對時間是否不相等。
  operator > : 比較兩個絕對時間,是否前一個大于后一個。
  operator < : 比較兩個絕對時間,是否前一個小于后一個。
  operator >= : 比較兩個絕對時間,是否前一個大于等于后一個。
  operator <= : 比較兩個絕對時間,是否前一個小于等于后一個
posted @ 2012-11-27 16:20 Mumoo 閱讀(1093) | 評論 (0)編輯 收藏

2012年11月20日

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

設置字體:

 

CFont m_font;

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

posted @ 2012-11-20 16:00 Mumoo 閱讀(5058) | 評論 (0)編輯 收藏
僅列出標題  下一頁
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            精品福利电影| 亚洲欧美日韩精品在线| 国产精品久久久999| 亚洲资源在线观看| 亚洲国产片色| 亚洲国产欧美在线人成| 欧美高清免费| 久久久久久久久久久久久久一区| 黄色小说综合网站| 久久久蜜桃精品| 久久激情五月激情| 欧美福利影院| 亚洲黄色性网站| 亚洲精品免费看| 午夜国产欧美理论在线播放| 在线一区二区三区四区| 欧美黄色免费| 久久久女女女女999久久| 欧美日韩亚洲一区三区| 亚洲婷婷在线| 欧美成人一品| 欧美日韩激情小视频| 老司机免费视频久久| 久久男人资源视频| 欧美日韩一区三区| 怡红院av一区二区三区| 亚洲欧美日韩国产一区| 欧美电影电视剧在线观看| 亚洲精品乱码久久久久久按摩观 | 国产精品久久久久久妇女6080| 免费欧美电影| 狠狠久久婷婷| 久久久久久久综合色一本| 91久久精品日日躁夜夜躁欧美 | 亚洲欧美视频一区| 日韩一区二区免费高清| 国外成人在线视频| 国产精品porn| 国产久一道中文一区| 亚洲欧美日本伦理| 欧美大色视频| 美女图片一区二区| 黄色在线一区| 亚洲视频狠狠| 99爱精品视频| 亚洲国产成人av好男人在线观看| 国产日韩精品久久| 欧美日韩国产精品成人| 久久久福利视频| 在线性视频日韩欧美| 亚洲精品欧美激情| 一区二区免费在线播放| 久久久999成人| 欧美xart系列高清| 亚洲国产精品免费| 亚洲日本精品国产第一区| 暖暖成人免费视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美亚洲成人网| 午夜精品福利一区二区三区av| 亚洲小视频在线观看| 一区二区三区在线视频免费观看| 牛夜精品久久久久久久99黑人| 欧美日韩福利视频| 久久婷婷人人澡人人喊人人爽| 免费精品视频| 久久久91精品国产一区二区精品| 欧美电影电视剧在线观看| 亚洲欧洲av一区二区三区久久| 欧美一级免费视频| 亚洲欧洲av一区二区三区久久| 久久久久久网| 久久永久免费| 在线看成人片| 久久人人97超碰精品888| 欧美一级二级三级蜜桃| 欧美日韩人人澡狠狠躁视频| 欧美1区2区3区| 亚洲电影下载| 欧美不卡视频| 亚洲精品久久久久久下一站| 亚洲美洲欧洲综合国产一区| 免费在线观看精品| 亚洲精品一区二区三区av| 在线看无码的免费网站| 欧美一级视频| 欧美华人在线视频| 亚洲免费精彩视频| 国产精品一区二区三区四区五区 | 亚洲欧美伊人| 国产精品一区二区久久精品| 亚洲在线播放| 国产日韩精品一区| 欧美在线看片| 亚洲国产精品成人一区二区| 日韩一本二本av| 国产精品视频免费观看| 久久精品久久99精品久久| 91久久在线| 久久综合影音| 亚洲视频久久| 亚洲精选91| 亚洲第一中文字幕在线观看| 欧美性色综合| 欧美国产综合视频| 老色鬼精品视频在线观看播放| 亚洲精品欧洲| 亚洲国产精品第一区二区三区| 欧美亚洲午夜视频在线观看| 亚洲免费观看在线视频| 亚洲第一精品在线| 黄色小说综合网站| 国产综合久久久久影院| 国产精品视屏| 国产欧美视频一区二区三区| 欧美色视频一区| 国产精品二区影院| 国产精品免费福利| 欧美成人高清视频| 亚洲欧美日韩精品在线| 亚洲深夜福利视频| 亚洲在线视频一区| 欧美一区二区三区在| 久久av红桃一区二区小说| 亚洲一区影音先锋| 香蕉av777xxx色综合一区| 久久精品国产免费观看| 欧美日韩中字| 久久久999| 久久夜色精品国产亚洲aⅴ| 久久中文精品| 亚洲欧洲一区二区天堂久久| 一区在线电影| 日韩一区二区精品视频| 亚洲欧美视频一区| 欧美mv日韩mv国产网站app| 99xxxx成人网| 久久综合九色九九| 国产老肥熟一区二区三区| 亚洲黄色免费网站| 久久大逼视频| 在线亚洲激情| 欧美激情影音先锋| 亚洲大片在线| 久热精品视频| 新狼窝色av性久久久久久| 欧美久久影院| 亚洲成在线观看| 久久裸体视频| 亚洲欧美中文另类| 国产精品久久久爽爽爽麻豆色哟哟| 精品福利免费观看| 老司机免费视频久久| 欧美中文字幕久久| 国产亚洲va综合人人澡精品| 亚洲一级片在线看| 制服丝袜亚洲播放| 欧美午夜欧美| 亚洲视频电影图片偷拍一区| 亚洲国产一区二区精品专区| 欧美1区视频| 一区二区三区不卡视频在线观看| 91久久精品网| 国产精品老牛| 麻豆国产精品777777在线| 欧美在线看片| 99re在线精品| 亚洲综合日韩| 亚洲欧洲中文日韩久久av乱码| 欧美插天视频在线播放| 欧美成人免费在线| 亚洲欧美变态国产另类| 欧美在线视频观看免费网站| 91久久午夜| 午夜精品久久久久久久久久久久久 | 欧美亚洲三区| 久久久亚洲国产天美传媒修理工| 亚洲国产精品综合| 亚洲影视九九影院在线观看| 怡红院精品视频| 夜夜嗨av一区二区三区| 在线观看国产精品淫| 中文久久精品| 亚洲毛片一区二区| 久久国产精品一区二区三区| 亚洲一区二区三区视频| 欧美激情一二三区| 亚洲第一黄网| 狠狠综合久久av一区二区小说| 中日韩视频在线观看| 亚洲一区二区免费视频| 欧美精品偷拍| 日韩视频一区| 亚洲午夜精品久久久久久浪潮| 欧美成人免费播放| 亚洲精品美女久久7777777| 亚洲区免费影片| 欧美成人精品三级在线观看| 亚洲成色精品| 亚洲神马久久|