小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

List Control的使用方法

 semo_zhang 2011-12-09
List Control的使用方法(轉(zhuǎn)載加總結(jié)) CheckBox
2011-02-08 21:49

列表控件可以看作是功能增強(qiáng)的ListBox,它提供了四種風(fēng)格,而且可以同時(shí)顯示一列的多中屬性值。MFC中使用CListCtrl類來封裝列表控件的各種操作。通過調(diào)用
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );創(chuàng)建一個(gè)窗口,dwStyle中可以使用以下一些列表控件的專用風(fēng)格: 
LVS_ICON ,LVS_SMALLICON ,LVS_LIST, LVS_REPORT 這四種風(fēng)格決定控件的外觀,同時(shí)只可以選擇其中一種,分別對(duì)應(yīng):大圖標(biāo)顯示,小圖標(biāo)顯示,列表顯示,詳細(xì)報(bào)表顯示 
LVS_EDITLABELS 結(jié)點(diǎn)的顯示字符可以被編輯,對(duì)于報(bào)表風(fēng)格來講可編輯的只為第一列。 
LVS_SHOWSELALWAYS 在失去焦點(diǎn)時(shí)也顯示當(dāng)前選中的結(jié)點(diǎn) 
LVS_SINGLESEL 同時(shí)只能選中列表中一項(xiàng) 
首先你需要設(shè)置列表控件所使用的ImageList,如果你使用大圖標(biāo)顯示風(fēng)格,你就需要以如下形式調(diào)用: 
CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 
如果使用其它三種風(fēng)格顯示而不想顯示圖標(biāo)你可以不進(jìn)行任何設(shè)置,否則需要以如下形式調(diào)用: 
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL); 
int InsertItem( int nItem, LPCTSTR lpszItem );  插入行
nItem:指明插入位置
lpszItem:為顯示字符。
除LVS_REPORT風(fēng)格外其他三種風(fēng)格都只需要直接調(diào)用InsertItem就可以了,但如果使用報(bào)表風(fēng)格就必須先設(shè)置列表控件中的列信息。
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem); 插入列
iCol:為列的位置,從零開始
lpszColumnHeading:為顯示的列名
nFormat:為顯示對(duì)齊方式
nWidth:為顯示寬度
nSubItem:為分配給該列的列索引。 
 
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );設(shè)置每列的顯示字符
nItem:為行位置
nSubItem:為列位置
lpszText:為顯示字符

下面的代碼演示了如何設(shè)置多列并插入數(shù)據(jù): 
m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//設(shè)置ImageList
m_list.InsertColumn(0,\"Col 1\",LVCFMT_LEFT,300,0);//設(shè)置列
m_list.InsertColumn(1,\"Col 2\",LVCFMT_LEFT,300,1);
m_list.InsertColumn(2,\"Col 3\",LVCFMT_LEFT,300,2);
m_list.InsertItem(0,\"Item 1_1\");//插入行
m_list.SetItemText(0,1,\"Item 1_2\");//設(shè)置該行的不同列的顯示字符
m_list.SetItemText(0,2,\"Item 1_3\")
 
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr ):用于得到/設(shè)置顯示的字符顏色。 
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr ):用于得到/設(shè)置顯示的背景顏色。 
void SetItemCount( int iCount ):用于得到添加進(jìn)列表中項(xiàng)的數(shù)量。 
BOOL DeleteItem(int nItem):用于刪除某一項(xiàng) [Page]
BOOL DeleteAllItems( ):將刪除所有項(xiàng)。 
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent):用于設(shè)置背景位圖。 
CString GetItemText( int nItem, int nSubItem ):用于得到某項(xiàng)的顯示字符。 
 
列表控件的消息映射同樣使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode為通知代碼,id為產(chǎn)生該消息的窗口ID,memberFxn為處理函數(shù),函數(shù)的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR為一數(shù)據(jù)結(jié)構(gòu),在具體使用時(shí)需要轉(zhuǎn)換成其他類型的結(jié)構(gòu)。對(duì)于列表控件可能取值和對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)為: 
LVN_BEGINLABELEDIT 在開始某項(xiàng)編輯字符時(shí)發(fā)送,所用結(jié)構(gòu):
NMLVDISPINFO 
LVN_ENDLABELEDIT 在結(jié)束某項(xiàng)編輯字符時(shí)發(fā)送,所用結(jié)構(gòu):
NMLVDISPINFO 
LVN_GETDISPINFO 在需要得到某項(xiàng)信息時(shí)發(fā)送,(如得到某項(xiàng)的顯示字符)所用結(jié)構(gòu):NMLVDISPINFO 
關(guān)于ON_NOTIFY有很多內(nèi)容,將在以后的內(nèi)容中進(jìn)行詳細(xì)講解。 
關(guān)于動(dòng)態(tài)提供結(jié)點(diǎn)所顯示的字符:首先你在項(xiàng)時(shí)需要指明lpszItem參數(shù)為:
LPSTR_TEXTCALLBACK。在控件顯示該結(jié)點(diǎn)時(shí)會(huì)通過發(fā)送TVN_GETDISPINFO來取得所需要的字符,在處理該消息時(shí)先將參數(shù)pNMHDR轉(zhuǎn)換為
LPNMLVDISPINFO,然后填充其中item.pszText。通過item中的iItem,iSubItem可以知道當(dāng)前顯示的為那一項(xiàng)。下面的代碼演示了這種方法: 
char szOut[8][3]={\"No.1\",\"No.2\",\"No.3\"};
//添加結(jié)點(diǎn)
m_list.InsertItem(LPSTR_TEXTCALLBACK,...)
m_list.InsertItem(LPSTR_TEXTCALLBACK,...)
//處理消息
void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
 LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
 pLVDI->item.pszText=szOut[pTVDI->item.iItem];
//通過iItem得到需要顯示的字符在數(shù)組中的位置
 *pResult = 0;
}

關(guān)于編輯某項(xiàng)的顯示字符:(在報(bào)表風(fēng)格中只對(duì)第一列有效)首先需要設(shè)置列表控件的LVS_EDITLABELS風(fēng)格,在開始編輯時(shí)該控件將會(huì)發(fā)送
LVN_BEGINLABELEDIT,你可以通過在處理函數(shù)中返回TRUE來取消接下來的編輯,在編輯完成后會(huì)發(fā)送LVN_ENDLABELEDIT,在處理該消息時(shí)需要將參數(shù)
pNMHDR轉(zhuǎn)換為LPNMLVDISPINFO,然后通過其中的item.pszText得到編輯后的字符,并重置顯示字符。如果編輯在中途中取消該變量為NULL。下面的代碼說明如何處理這些消息: 

//處理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
 LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
 if(pLVDI->item.iItem==0);//判斷是否取消該操作
  *pResult = 1;
 else
  *pResult = 0; [Page]
}
//處理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
 LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
 if(pLVDI->item.pszText==NULL);//判斷是否已經(jīng)取消取消編輯
  m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);
//重置顯示字符
 *pResult = 0;
}
上面講述的方法所進(jìn)行的消息映射必須在父窗口中進(jìn)行(同樣WM_NOTIFY的所有消息都需要在父窗口中處理)。 
如何得到當(dāng)前選中項(xiàng)位置:在列表控件中沒有一個(gè)類似于ListBox中GetCurSel()的函數(shù),但是可以通過調(diào)用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到選中項(xiàng)位置。 

list control控件中的風(fēng)格選項(xiàng):
m_list1.SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES );
LVS_EX_FULLROWSELECT表示可以點(diǎn)中行中的任意一個(gè)列選中這一條記錄
LVS_EX_GRIDLINES表示列之間有分隔符號(hào)
LVS_EX_CHECKBOXES 表示每一行第一列是checkbox
LVCOLUMN:listviewcolumn
設(shè)置表頭
lvColumn.mask = LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;  設(shè)置表頭風(fēng)格
lvColumn.fmt = LVCFMT_CENTER;   設(shè)置表頭對(duì)齊方式
lvColumn.iSubItem = i;              表頭列序
lvColumn.pszText = HeaderTxt[i];    表頭名稱
lvColumn.cx = 90;                   表頭寬度
m_list.InsertColumn(i,&lvColumn);   插入列

 

 

List Control的擴(kuò)展運(yùn)用

0282 設(shè)置ListControl控件的顯示風(fēng)格

ListControl控件可在窗體中管理和顯示列表項(xiàng)??煽刂屏斜韮?nèi)容的顯示方式,能夠以圖標(biāo)和表格的形式顯示數(shù)據(jù)。打開ListControl控件的屬性窗口,在Styles選項(xiàng)卡中的View屬性中可以設(shè)置顯示風(fēng)格,包括:Icon表示圖標(biāo)視圖;Small Icon表示小圖標(biāo)視圖;List表示列表視圖;Report表示報(bào)表視圖。

0283 為ListControl控件設(shè)置列標(biāo)題

在使用ListControl控件Report顯示風(fēng)格時(shí),需要設(shè)置列標(biāo)題信息,否則不能向控件中添加數(shù)據(jù)信息,編輯列標(biāo)題需要使用InsertColumn方法。該方法的語法如下:

int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT,int nWidth = -1, int nSubItem = -1 );

參數(shù)說明如下。

l     nCol:標(biāo)識(shí)新列的索引。

l     lpszColumnHeading:標(biāo)識(shí)列標(biāo)題。

l     nFormat:標(biāo)識(shí)列的對(duì)齊方式。

l     nWidth:標(biāo)識(shí)列寬度。

l     nSubItem:標(biāo)識(shí)關(guān)聯(lián)當(dāng)前列的子視圖項(xiàng)索引。

程序代碼如下:

    m_Grid.InsertColumn(0,"姓名",LVCFMT_LEFT,150,0);

    m_Grid.InsertColumn(1,"聯(lián)系電話",LVCFMT_LEFT,150,1);

0284 為ListControl控件添加行

在ListControl控件中添加信息時(shí)不能直接向控件中添加列信息,需要先為控件添加行,使用InsertItem方法,該方法用于向ListControl控件中添加行。語法如下:

int InsertItem( int nItem, LPCTSTR lpszItem );

參數(shù)說明如下。

l     nItem:表示被插入的行索引。

l     lpszItem:表示行文本。

程序代碼如下:

m_Grid.InsertItem(0,"");

0285 為ListControl控件添加列

通過SetItemText方法可以為任意行的任意列添加數(shù)據(jù),該方法用于設(shè)置ListControl控件中的文本。語法如下:

BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );

參數(shù)說明如下。

l     nItem:標(biāo)識(shí)行索引。

l     nSubItem:標(biāo)識(shí)列索引。

l     lpszText:標(biāo)識(shí)設(shè)置的顯示文本。

程序代碼如下:

    m_Grid.SetItemText(0,0,"周X");

    m_Grid.SetItemText(0,1,"12345XXXXXX");

0286 設(shè)置ListControl控件的擴(kuò)展風(fēng)格

在使用ListControl控件的Report顯示風(fēng)格時(shí),需要設(shè)置一些常用的擴(kuò)展風(fēng)格。如圖5.33所示。

List Control的使用方法(轉(zhuǎn)載加總結(jié)) - 天使的眼淚 - 天使的眼淚

圖5.33 設(shè)置ListControl控件的擴(kuò)展風(fēng)格

程序代碼如下:

    m_Grid.SetExtendedStyle(

        LVS_EX_FLATSB               //扁平風(fēng)格滾動(dòng)條

        |LVS_EX_FULLROWSELECT     //允許整行選中

        |LVS_EX_HEADERDRAGDROP    //允許標(biāo)題拖曳

        |LVS_EX_ONECLICKACTIVATE //高亮顯示

        |LVS_EX_GRIDLINES          //畫出網(wǎng)格線

        );

    m_Grid.InsertColumn(0,"姓名",LVCFMT_LEFT,150,0);

    m_Grid.InsertColumn(1,"聯(lián)系電話",LVCFMT_LEFT,150,1);

    m_Grid.InsertItem(0,"");

    m_Grid.SetItemText(0,0,"周X");

    m_Grid.SetItemText(0,1,"12345XXXXXX");

    m_Grid.InsertItem(1,"");

    m_Grid.SetItemText(1,0,"諸葛X");

    m_Grid.SetItemText(1,1,"67890XXXXXX");

0287 設(shè)置ListControl控件數(shù)據(jù)的排列順序

通過ListControl控件的屬性窗口可以設(shè)置控件中數(shù)據(jù)的排列順序,在Styles選項(xiàng)卡中的Sort屬性中可以對(duì)控件中的數(shù)據(jù)進(jìn)行排序,包括:None表示不進(jìn)行排序;Ascending表示升序排列;Decending表示降序排列。

0288 單擊ListControl控件列標(biāo)題進(jìn)行排序

在使用ListControl控件的Report顯示風(fēng)格時(shí),要實(shí)現(xiàn)單擊列標(biāo)題進(jìn)行排序需要在控件的LVN_COLUMNCLICK消息的處理函數(shù)中添加SortItems函數(shù),SortItems函數(shù)實(shí)現(xiàn)了對(duì)列表項(xiàng)排序的功能,語法如下:

BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );

參數(shù)說明如下。

l     pfnCompare:排序時(shí)所使用的回調(diào)函數(shù),如果不進(jìn)行排序就讓回調(diào)函數(shù)返回-1。

l     dwData:指定列表控件對(duì)象指針。

程序代碼如下:

void CCompositorDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)

{

    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    m_Grid.SortItems(Compositor,(DWORD)reinterpret_cast<DWORD>(this));

    *pResult = 0;

}

int CALLBACK CCompositorDlg::Compositor(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

{

    CListCtrl* pListCtrl=reinterpret_cast<CListCtrl*>(lParamSort);   

    return 1;

}

0289 具有熱點(diǎn)效果的視圖控件

文本框:圖5.34  具有熱點(diǎn)效果的視圖控件在使用列表視圖控件時(shí),如果列表視圖以表格形式顯示數(shù)據(jù),并且包含有LVS_EX_TWOCLICKACTIVATE擴(kuò)展風(fēng)格,那么,當(dāng)鼠標(biāo)移動(dòng)到某一行時(shí),整行數(shù)據(jù)會(huì)出現(xiàn)熱點(diǎn)效果。如何將某一個(gè)單元格設(shè)置為熱點(diǎn)效果呢?本例實(shí)現(xiàn)了該功能,效果如圖5.34所示。

本例是通過繪制列表視圖控件實(shí)現(xiàn)的。首先從CListCtrl派生一個(gè)子類,然后添加ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW,OnCustomDraw)消息映射實(shí)現(xiàn)CListCtrl的繪制。最后處理鼠標(biāo)移動(dòng)時(shí)的事件,判斷鼠標(biāo)在移動(dòng)過程中,單元格是否發(fā)生了改變,如果發(fā)生了改變,重繪窗口。程序主要代碼如下:

BOOL CCustomView::OnCustomDraw(NMHDR *pNotifyStruct, LRESULT *lResult)

{

    NMLVCUSTOMDRAW * nmDraw = (NMLVCUSTOMDRAW *)pNotifyStruct;

    NMCUSTOMDRAW & pDraw = nmDraw->nmcd;

        UINT flag = pDraw.uItemState;

    switch (pDraw.dwDrawStage)

   {

    case CDDS_PREPAINT :

        {

            *lResult =CDRF_NOTIFYITEMDRAW;

            break;

        }

    case CDDS_ITEMPREPAINT :

        {

            *lResult =CDRF_NOTIFYSUBITEMDRAW ;

            break;   

        }

    case (CDDS_ITEMPREPAINT | CDDS_SUBITEM) :

        {

            int row = pDraw.dwItemSpec;

            int col = nmDraw->iSubItem;

            CPoint point;

            GetCursorPos(&point);

            ScreenToClient(&point);

            CRect rect,secRC;

            this->GetSubItemRect(row,col,LVIR_BOUNDS ,rect);

           

            int cWidth = this->GetColumnWidth(0); //獲取第一列的寬度

            nmDraw->clrText = m_FontColor;

            if (col !=0)

            {

                if (rect.PtInRect(point))

                     nmDraw->clrText = m_HotFontColor;   

            }

            else

            {

                secRC.CopyRect(CRect(0,rect.top,cWidth,rect.bottom));   

                if (secRC.PtInRect(point))

                    nmDraw->clrText = m_HotFontColor;               

            }

           

            break;       

        }

    default:

        {

            *lResult = CDRF_DODEFAULT;

            break;

        }

    }

    return TRUE;

}

void CCustomView::OnMouseMove(UINT nFlags, CPoint point)

{   

    CListCtrl::OnMouseMove(nFlags, point);

    LVHITTESTINFO pos;

    pos.pt = point;

    pos.flags = LVHT_ABOVE;

   

    int curcol = -1;

    int currow = -1;

    if (this->SubItemHitTest(&pos)>=0)

    {       

        curcol = pos.iSubItem;

        currow = pos.iItem;

        if (m_PreCol ==-1)

            m_PreCol = curcol;

        if (m_PreRow== -1)

            m_PreRow = currow;

        if (currow==0 && m_Valid == FALSE )

        {

            m_Valid = TRUE;

            CRect rect;

             GetSubItemRect(pos.iItem,pos.iSubItem,LVIR_BOUNDS ,rect);

            int cWidth = rect.right;

            if (curcol==0)

            {

                cWidth = this->GetColumnWidth(0); //獲取第一列的寬度

            }

            RedrawWindow(CRect(rect.left,rect.top,cWidth,rect.bottom));   

            GetSubItemRect(m_PreRow,m_PreCol,LVIR_BOUNDS ,rect);

            cWidth = rect.right;

            if (m_PreCol==0)

            {

                cWidth = this->GetColumnWidth(0); //獲取第一列的寬度

            }

            RedrawWindow(CRect(rect.left,rect.top,cWidth,rect.bottom));           

        }

        else if (m_PreCol != curcol ||(m_PreRow != currow)) //用戶移動(dòng)鼠標(biāo)時(shí)列發(fā)生了改變//或行發(fā)生了改變

        {

            CRect rect;

            GetSubItemRect(pos.iItem,pos.iSubItem,LVIR_BOUNDS ,rect);

            int cWidth = rect.right;

            if (curcol==0)

            {

                cWidth = this->GetColumnWidth(0); //獲取第一列的寬度

            }

            RedrawWindow(CRect(rect.left,rect.top,cWidth,rect.bottom));   

            GetSubItemRect(m_PreRow,m_PreCol,LVIR_BOUNDS ,rect);

            cWidth = rect.right;

            if (m_PreCol==0)

            {

                cWidth = this->GetColumnWidth(0); //獲取第一列的寬度

            }

            RedrawWindow(CRect(rect.left,rect.top,cWidth,rect.bottom));   

        }

        m_PreCol = curcol;

        m_PreRow = currow;

    }

}

0290 具有背景的列表視圖控件

在使用列表視圖控件時(shí),默認(rèn)情況下,列表視圖控件具有白色的背景,如果能夠在列表視圖中以圖片為背景,界面效果會(huì)好很多。本例實(shí)現(xiàn)了一個(gè)具有背景的列表視圖控件,如圖5.35所示。

List Control的使用方法(轉(zhuǎn)載加總結(jié)) - 天使的眼淚 - 天使的眼淚

圖5.35 具有背景的列表視圖控件

有些用戶可能認(rèn)為只要從CListCtrl派生一個(gè)子類,然后在WM_PAINT消息處理函數(shù)中繪制一幅圖片就可以了。但是,這樣會(huì)導(dǎo)致列表視圖中的數(shù)據(jù)被背景圖片覆蓋。其實(shí),實(shí)現(xiàn)具有背景的列表視圖控件并不復(fù)雜,首先在程序初始化時(shí)調(diào)用AfxOleInit()函數(shù)初始化Com;然后調(diào)用CListCtrl的SetBkImage方法設(shè)置背景位圖;最后調(diào)用SetTextBkColor方法將文本背景透明。程序主要代碼如下:

    m_List.SetBkImage("c:\\background2.bmp");

    m_List.SetTextBkColor(CLR_NONE);


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多