C++ 關於MFC List Control 控制項的使用事項 原創

來源:互聯網
上載者:User

標籤:

1\在開發項目時,使用到了 listcontrol 控制項,就一些問題,做一下備忘,以備以後使用

(1)  給list項目 刪除所有的項目  DeleteAllItems();

(2) 給list項目 添加一個列 .InsertColumn(0, _T("編號"));

(3)給list a項目 設定列的寬度 .SetColumnWidth(0, 50);

(4) 在添加項目之前 可以使用 .SetRedraw(false); 來禁止 重畫,這樣可以提高效率.當添加完成後,可以 使用 .SetRedraw(true);  重新啟用重畫

  (5) 添加項目:  m_List_IpList.InsertItem(3, _T("4"), 3);

     第1個參數是 行數,  如果放在第0行,就寫為0 .這裡的號必須是一個合理的號,不合理的號,會出現錯誤

第2個參數是 行的標題

第3個參數是 對應的  顯示表徵圖 號,後面會講到,如果不使用,就設定為 -1

(6)對於非 report項目來講,第 (5)條就可以了,但是對於 Report 樣式,還需要添加一些其它列的資訊,可以使用   SetItemText(0, 1, _T("192.168.1.4"));  來添加其它的內容

(7)  可以使用 SetItemData() 來在對應的行中,儲存一些重要的資料資訊.用於程式處理

(8) 關於行高的調整  調整行高的方法有多個,但是建議使用Cimagelist 來調節

     設定CListCtrl的行高沒有函數介面,可以通過自繪來實現,但是比較麻煩。有一個比較簡單的方法是通過使用一個空白的映像將行撐起來,使其高度發生變化。樣本如下:

   例如: 

CImageList m_image;  m_image.Create(1,24,ILC_COLOR32,1,0);  m_listInfo.SetImageList(&m_image, LVSIL_SMALL);

 

(9 )  對於字型的設定,我們可以使用SetFont函數來實現。以修改CListView的字型為例,在OnInitialUpdate函數中插入列之前調用SetFontSelf函數(該函數自訂,如下樣本所示)。首先建立一個字型,然後調用SetFont進行設定。需要注意的是,在退出時需要delete 掉建立的字型,避免記憶體泄露。

//設定字型和大小void CMyListView::SetFontSelf(int nHeight, LPCTSTR lpszFacename){    //先刪除原有字型    if(m_font != NULL)        delete m_font;    m_font = new CFont;    //建立字型    m_font->CreateFont(        nHeight,                   // nHeight        0,                         // nWidth        0,                         // nEscapement        0,                         // nOrientation        FW_NORMAL,                 // nWeight        FALSE,                     // bItalic        FALSE,                     // bUnderline        0,                         // cStrikeOut        ANSI_CHARSET,              // nCharSet        OUT_DEFAULT_PRECIS,        // nOutPrecision        CLIP_DEFAULT_PRECIS,       // nClipPrecision        DEFAULT_QUALITY,           // nQuality        DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily        lpszFacename);             // lpszFacename    //設定字型    CListCtrl &theCtrl = GetListCtrl();        //擷取控制權,引用變數    theCtrl.SetFont(m_font, TRUE);}

(10) 點擊表頭時進行歸類排序

         系統通過發送 LVM_SORTITEMS訊息來處理歸類問題,在該訊息的處理函數中需要調用一個 回呼函數,這個回呼函數需要我們來設計,以完成不同的歸類方法。回呼函數原型如下:

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

          針對上述回呼函數,有以下幾點需要搞清楚:

對於參數lparam1和lparam2,分別為CListCtrl的兩行資料,是用於比較的對象。通過CListCtrl的成員函數SetItemData來設定,該函數原型:

int SetItemData(int nIndex,  DWORD_PTR dwItemData )

其第一個參數為行號,第二個參數指明了該行對應的參數。參數dwItemData 通常設為一行參數的數組,如: pData[2][2] = {{1, 3},{2, 3}}; 每次使用pData[i]作為dwItemData。

對於參數lParamSort,用於指明列項,即第幾列。該參數和回呼函數一同通過CListCtrl的成員函數SortItems來設定,其函數原型為:

BOOL SortItems( PFNLVCOMPARE pfnCompare,DWORD_PTR dwData )

參數 pfnCompare 為回呼函數入口地址, 參數dwData 為列項。

③ SetItemData在初始插入資料時進行調用來設定,SortItems則在點擊列表頭時響應的訊息處理函數中進行設定。

樣本如下:

 

//初始化列表視圖控制項BOOL CDataAnalysis::InitListCtl(){    //其他處理,包括設定風格,插入列等等    //插入行    for(int i=0; i<LineNum; i++)    {        //要將char*轉換為wchar_t*        mbstowcs_s(&converted, wStr, 30, m_analysis[i].Date, _TRUNCATE);        m_listAnalysis.InsertItem(i, wStr);                                //日期        mbstowcs_s(&converted, wStr, 30, m_analysis[i].Time, _TRUNCATE);        m_listAnalysis.SetItemText(i, 1, wStr);                            //時間        mbstowcs_s(&converted, wStr, 30, m_analysis[i].ID, _TRUNCATE);        m_listAnalysis.SetItemText(i, 2, wStr);                            //ID        m_listAnalysis.SetItemText(i, 3, m_analysis[i].lpszEvent);        //事件        //設定回呼函數的參數        m_listAnalysis.SetItemData(i, (LPARAM)(m_analysis+i));    }    return TRUE;}void CDataAnalysis::OnHdnItemclickAnalysisList(NMHDR *pNMHDR, LRESULT *pResult){    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);    // TODO: Add your control notification handler code here    //設定回呼函數的參數和入口地址    m_listAnalysis.SortItems(SortFunc, phdr->iItem);    *pResult = 0;}//排序的回呼函數int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort){    int result;        //傳回值    //兩行的參數,用於比較    ANALYSISFORMAT* pAnalysis1 = (ANALYSISFORMAT*)lParam1;    ANALYSISFORMAT* pAnalysis2 = (ANALYSISFORMAT*)lParam2;    //排序    switch(lParamSort)    {    case 0:        //日期        result = strcmp(pAnalysis1->Date, pAnalysis2->Date);        break;    case 1:        //時間        result = strcmp(pAnalysis1->Time, pAnalysis2->Time);        break;    case 2:        //ID        result = strcmp(pAnalysis1->ID, pAnalysis2->ID);        break;    case 3:        //事件        result = wcscmp(pAnalysis1->lpszEvent, pAnalysis2->lpszEvent);        break;    default:        break;    }    return result;}

 

關於如何使用表徵圖的方法

需要首先將 list control 控制項綁定一個 imagelist 項目

方法如下

CImageList m_image;m_image.Create(IDB_IP_BITMAP, 16, 1, RGB(255, 255, 0));
m_List_IpList.SetImageList(&m_image, LVSIL_SMALL);m_image.Detach();   //這一句話 非常的重要,如果沒有這句話, 表徵圖不會顯示

 

前兩句的意思就是 建立一個 CImagelist 項目

其中 第二句 在VB6.0上 可能不存在, 在 VS2012中 可以使用

就是直接載入 位元影像資源到 圖象列表

在將圖象列表綁定到需要顯示的項目後, 要執行一次 Detach() 函數

目的:     調用此功能分離映像列表從 CImageList 對象。

 

 

其它重要的功能,可以參考以下網址:

http://blog.csdn.net/zwgdft/article/details/7565331

 

 

 

-----------------------------------

C++ 關於MFC List Control 控制項的使用事項 原創

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.