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

Benjamin

靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數據加載中……

CListCtrl控件的使用指南

創建圖形列表并和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

 }

摘自:http://blog.csdn.net/lixiaosan/archive/2006/04/07/653563.aspx

CListCtrl 使用技巧

作者:lixiaosan
時間:04/06/2006

以下未經說明,listctrl默認view 風格為report

相關類及處理函數

MFC:CListCtrl類

SDK:以 “ListView_”開頭的一些宏。如 ListView_InsertColumn


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); //設置擴展風格
 
      注: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      {
           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      {
           if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
           {
                str.Format(_T("選中了第%d行"), i);
             nbsp;  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;
  nbsp;        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;
      }



 


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. listctrl的subitem添加圖標

      m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
      m_list.SetItem(..); //具體參數請參考msdn

 


21. 在CListCtrl顯示文件,并根據文件類型來顯示圖標

      網上找到的代碼,share
      BOOL CTest6Dlg::OnInitDialog()
      {
           CDialog::OnInitDialog();
  
           HIMAGELIST himlSmall;
           HIMAGELIST himlLarge;
           SHFILEINFO sfi;
           char  cSysDir[MAX_PATH];
           String  strBuf;
 
           memset(cSysDir, 0, MAX_PATH);
  
           GetWindowsDirectory(cSysDir, MAX_PATH);
           strBuf = cSysDir;
           sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("\\")+1));
 
           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();
 
或者參考

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp



23. listctrl排序

Q250614:How To Sort Items in a CListCtrl in Report View
http://support.microsoft.com/kb/250614/en-us



24. 在listctrl中選中某個item時動態改變其icon或bitmap

Q141834: How to change the icon or the bitmap of a CListCtrl item in Visual C++
http://support.microsoft.com/kb/141834/en-us



25. 在添加item后,再InsertColumn()后導致整列數據移動的問題

Q151897: CListCtrl::InsertColumn() Causes Column Data to Shift
http://support.microsoft.com/kb/151897/en-us



26. 關于listctrl第一列始終居左的問題

解決辦法:把第一列當一個虛列,從第二列開始插入列及數據,最后刪除第一列。
     
具體解釋參閱   http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp

 


27. 鎖定column header的拖動

http://msdn.microsoft.com/msdnmag/issues/03/06/CQA/



28. 如何隱藏clistctrl的列

    把需隱藏的列的寬度設為0,然后檢測當該列為隱藏列時,用上面第27點的鎖定column 的拖動來實現


29. listctrl進行大數據量操作時,使用virtual list   

http://www.microsoft.com/msj/archive/S2061.aspx
http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/
http://www.codeproject.com/listctrl/virtuallist.asp



30. 關于item只能顯示259個字符的問題

解決辦法:需要在item上放一個edit。



31. 響應在listctrl的column header上的鼠標右鍵單擊

Q125694: How To Find Out Which Listview Column Was Right-Clicked
http://support.microsoft.com/kb/125694/en-us



32. 類似于windows資源管理器的listview

Q234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe
http://support.microsoft.com/kb/234310/en-us

 


33. 在ListCtrl中OnTimer只響應兩次的問題

Q200054:
PRB: OnTimer() Is Not Called Repeatedly for a List Control
http://support.microsoft.com/kb/200054/en-us


34. 以下為一些為實現各種自定義功能的listctrl派生類

          (1)    拖放       
                   http://www.codeproject.com/listctrl/dragtest.asp

                   在CListCtrl和CTreeCtrl間拖放
                   http://support.microsoft.com/kb/148738/en-us
 
          (2)    多功能listctrl
                   支持subitem可編輯,圖標,radiobutton,checkbox,字符串改變顏色的類
                   http://www.codeproject.com/listctrl/quicklist.asp
 
                   支持排序,subitem可編輯,subitem圖標,subitem改變顏色的類
                   http://www.codeproject.com/listctrl/ReportControl.asp

          (3)    subitem中顯示超鏈接
                   http://www.codeproject.com/listctrl/CListCtrlLink.asp

          (4)    subitem的tooltip提示
                   http://www.codeproject.com/listctrl/ctooltiplistctrl.asp

          (5)    subitem中顯示進度條   
                   http://www.codeproject.com/listctrl/ProgressListControl.asp
                   http://www.codeproject.com/listctrl/napster.asp
                   http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/

          (6)    動態改變subitem的顏色和背景色
                    http://www.codeproject.com/listctrl/highlightlistctrl.asp
                    http://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/
 
          (7)    類vb屬性對話框
                    http://www.codeproject.com/listctrl/propertylistctrl.asp
                    http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/
                    http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/
 
          (8)    選中subitem(只高亮選中的item)
                    http://www.codeproject.com/listctrl/SubItemSel.asp
                    http://www.codeproject.com/listctrl/ListSubItSel.asp
 
          (9)    改變行高
                    http://www.codeproject.com/listctrl/changerowheight.asp
 
          (10)   改變行顏色
                    http://www.codeproject.com/listctrl/coloredlistctrl.asp
 
          (11)   可編輯subitem的listctrl
                    http://www.codeproject.com/listctrl/nirs2000.asp
                    http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp
 
          (12)   subitem可編輯,插入combobox,改變行顏色,subitem的tooltip提示
                    http://www.codeproject.com/listctrl/reusablelistcontrol.asp
 
          (13)   header 中允許多行字符串
                    http://www.codeproject.com/listctrl/headerctrlex.asp
 
          (14)   插入combobox
                    http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/
 
          (15)   添加背景圖片
                    http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/
                    http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/
                    http://www.vchelp.net/vchelp/archive.asp?type_id=9&class_id=1&cata_id=1&article_id=1088&search_term=
   
          (16)  自適應寬度的listctrl
                    http://www.codeproject.com/useritems/AutosizeListCtrl.asp

          (17)  改變ListCtrl高亮時的顏色(默認為藍色)
                   處理 NM_CUSTOMDRAW
          
http://www.codeproject.com/listctrl/lvcustomdraw.asp

     (18)  改變header顏色
          http://www.pocketpcdn.com/articles/hdr_color.html

在WTL中CListCtrl 被CListViewCtrl所替代,首先用CListViewCtrl m_ListView和控件相關聯
m_ListView = GetDlgItem(IDC_LIST1);

初始化控件:

  m_ListView.InsertColumn(0,L"date",LVCFMT_LEFT,50);//插入列1,50是寬度
  m_ListView.InsertColumn(1,L"num",LVCFMT_LEFT,50);//插入列2
  m_ListView.InsertItem(0,L"");
  m_ListView.SetItemText(0,0,L"001");
  m_ListView.SetItemText(0,1,L"1234");
  m_ListView.InsertItem(1,L"");
  m_ListView.SetItemText(1,0,L"002");
  m_ListView.SetItemText(1,1,L"123");

也可以用API向控件中寫數據
LV_ITEM lvitem;   //LVITEM結構體

  lvitem.mask=LVIF_TEXT; //指出對成員中的哪些數據進行設置
  lvitem.pszText=L"vv"; //將文本設為vv
  lvitem.iItem=0;   //索引值為0
  lvitem.iSubItem=0;  //沒有子項

  m_ListView.InsertItem(&lvitem);

其控件的消息用法和MFC中的完全一樣。

posted on 2008-04-03 17:15 Benjamin 閱讀(6054) 評論(0)  編輯 收藏 引用 所屬分類: VC

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品欧美日韩专区| 激情六月婷婷久久| 黄色成人91| 午夜精品影院在线观看| 99热精品在线| 国产精品久久久久久模特| 久久综合九色欧美综合狠狠| 国产精品日韩欧美综合 | 欧美色网一区二区| 亚洲国产精品ⅴa在线观看| 欧美成人精品不卡视频在线观看| 欧美国产日本韩| 国产欧美日韩免费| 午夜伦欧美伦电影理论片| 久久偷窥视频| 亚洲精品极品| 欧美一二三视频| 韩国视频理论视频久久| 欧美不卡一区| 亚洲综合导航| 亚洲国产一区二区三区青草影视| 香蕉尹人综合在线观看| 亚洲国产日韩在线| 国产精品日日做人人爱| 欧美18av| 久久婷婷成人综合色| 一区二区三区高清在线| 欧美成人资源网| 久久www成人_看片免费不卡| 日韩午夜av| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美日本一区二区三区| 欧美xart系列高清| 久久久噜噜噜久久中文字免| 亚洲欧美日韩人成在线播放| 亚洲美女黄色| 国产精品卡一卡二| 久久久www| 久久九九国产精品| 久久蜜臀精品av| 久久精品视频免费播放| 亚洲乱码国产乱码精品精天堂| 欧美有码视频| 国产偷久久久精品专区| 亚洲综合好骚| 日韩视频在线观看| 欧美国产亚洲视频| 亚洲国产精品久久久| 久久一区视频| 久久久久88色偷偷免费| 国产无一区二区| 久久综合导航| 久久免费少妇高潮久久精品99| 国内揄拍国内精品久久 | 香蕉久久a毛片| 国产精品久线观看视频| 亚洲一线二线三线久久久| 99视频精品在线| 欧美激情欧美狂野欧美精品| 亚洲国产高清一区二区三区| 亚洲欧美国产日韩天堂区| 性色av一区二区三区| 亚洲欧美日韩精品久久奇米色影视 | 亚洲美女视频网| 久久婷婷丁香| 亚洲高清视频在线观看| 宅男66日本亚洲欧美视频| 久久久www成人免费无遮挡大片| 欧美一级网站| 亚洲精品乱码| 亚洲制服少妇| 亚洲国产成人久久| 在线视频精品| 在线免费日韩片| 亚洲精品久久久久久久久久久久 | aⅴ色国产欧美| 国产精品一区二区久久久| 欧美fxxxxxx另类| 欧美系列精品| 欧美成人免费小视频| 国产精品美女999| 欧美激情精品久久久久久蜜臀| 欧美午夜美女看片| 亚洲国产精品久久久久秋霞蜜臀| 国产精品xxxxx| 91久久在线| 激情伊人五月天久久综合| av成人老司机| 日韩亚洲欧美一区二区三区| 久久精品国产亚洲高清剧情介绍 | 亚洲视频电影图片偷拍一区| 黄色日韩网站| 亚洲午夜一级| 一区二区三区日韩在线观看| 久久影院午夜论| 久久嫩草精品久久久久| 国产精品人人做人人爽| 91久久国产综合久久| 久久精品91| 欧美午夜一区二区福利视频| 亚洲激情视频| 亚洲黄页视频免费观看| 久久精品系列| 美女视频网站黄色亚洲| 国内成人精品2018免费看| 亚洲欧美中文字幕| 久久精品国产亚洲一区二区三区| 欧美亚州一区二区三区| 亚洲午夜在线| 久久久www成人免费精品| 伊人男人综合视频网| 久久久亚洲一区| 99成人精品| 亚洲区一区二区三区| 亚洲精品在线观看免费| 久久久欧美一区二区| 在线电影一区| 欧美精品一区在线播放| 亚洲精品黄色| 久久精品国产999大香线蕉| 国产一区二区主播在线| 久久一区二区三区四区| 亚洲精品乱码久久久久久蜜桃91 | 欧美国产日韩免费| 亚洲一区二区网站| 欧美午夜久久| 老司机午夜精品视频| 日韩视频永久免费观看| 国产精品高潮呻吟| 久久久在线视频| 一区二区三区精品视频| 蜜桃av噜噜一区二区三区| 亚洲网站视频| 亚洲黄网站黄| 国产视频亚洲| 欧美午夜不卡影院在线观看完整版免费| 亚洲摸下面视频| 亚洲激情另类| 免费精品视频| 久久国产精品久久久久久| 亚洲三级免费| 午夜精品亚洲| 亚洲精品男同| 一区二区三区我不卡| 国产精品久久久久99| 欧美黄在线观看| 美女亚洲精品| 美国成人直播| 美女主播精品视频一二三四| 久久激情五月婷婷| 久久人人97超碰国产公开结果| 亚洲系列中文字幕| 亚洲美女福利视频网站| 久久久久久久久综合| 亚洲电影毛片| 久久久久久尹人网香蕉| 亚洲激情啪啪| 久久久999| 猛男gaygay欧美视频| 亚洲福利视频免费观看| 久久久久久久性| 一本色道久久综合亚洲精品婷婷| 欧美不卡一卡二卡免费版| 久久精品亚洲精品国产欧美kt∨| 尹人成人综合网| 国产在线不卡视频| 欧美伦理视频网站| 国产日本欧美在线观看| 99视频有精品| 亚洲国产欧美在线| 亚洲尤物影院| 久久亚洲欧美国产精品乐播| 欧美成人精品影院| 99在线精品视频| 久久亚洲私人国产精品va| 欧美日韩亚洲一区二区| 韩国三级电影久久久久久| 一区二区三区精品在线| 久久久久久有精品国产| 99天天综合性| 原创国产精品91| 国产精品盗摄久久久| 国产精品国产亚洲精品看不卡15 | 六月丁香综合| 欧美日韩视频免费播放| 国内精品久久久久久影视8| 亚洲三级免费| 欧美高清日韩| 久久精品91久久香蕉加勒比| 国产精品美女久久久久久免费| 欧美激情精品久久久久久久变态| 亚洲人成网站在线播| 欧美成人午夜影院| 欧美日韩视频不卡| 亚洲日本一区二区| 亚洲精品麻豆| 国产精品一区久久久| 久久国产精品免费一区| 亚洲第一视频| 久久精品一区二区三区中文字幕|