VC List Ctrl控制項

2021-04-08 22:43:09 字數 3741 閱讀 3773

vc++ list ctrl控制項

790(148普 及 網 633 http://www.pujiwang.com)

列表控制項可以看作是功能增強的listbox,它提供了四種風格,而且可以同時顯示一列的多中屬性值。mfc中使用clistctrl類來封裝列表控制項的各種操作。通過呼叫bool create( dword dwstyle, const rect& rect, cwnd* pparentwnd, uint nid );建立乙個視窗,dwstyle中可以使用以下一些列表控制項的專用風格:

lvs_icon lvs_**allicon lvs_list lvs_report 這四種風格決定控制項的外觀,同時只可以選擇其中一種,分別對應:大圖示顯示,小圖示顯示,列表顯示,詳細報表顯示

lvs_editlabels 結點的顯示字元可以被編輯,對於報表風格來講可編輯的只為第一列。

lvs_showselalways 在失去焦點時也顯示當前選中的結點

lvs_singlesel 同時只能選中列表中一項

首先你需要設定列表控制項所使用的imagelist,如果你使用大圖示顯示風格,你就需要以如下形式呼叫:

cimagelist* setimagelist( cimagelist* pimagelist, lvsil_normal);

如果使用其它三種風格顯示而不想顯示圖示你可以不進行任何設定,否則需要以如下形式呼叫:

cimagelist* setimagelist( cimagelist* pimagelist, lvsil_**all);

通過呼叫int insertitem( int nitem, lpctstr lpszitem );可以在列表控制項中nitem指明位置插入一項,lpszitem為顯示字元。除lvs_report風格外其他三種風格都只需要直接呼叫insertitem就可以了,但如果使用報表風格就必須先設定列表控制項中的列資訊。

通過呼叫int insertcolumn( int ncol, lpctstr lpszcolumnheading, int nformat , int nwidth, int nsubitem);可以插入列。icol為列的位置,從零開始,lpszcolumnheading為顯示的列名,nformat為顯示對齊方式,nwidth為顯示寬度,nsubitem為分配給該列的列索引。

在有多列的列表控制項中就需要為每一項指明其在每一列中的顯示字元,通過呼叫bool setitemtext( int nitem, int nsubitem, lptstr lpsztext );可以設定每列的顯示字元。nitem為設定的項的位置,nsubitem為列位置,lpsztext為顯示字元。下面的**演示了如何設定多列並插入資料:

m_list.setimagelist(&m_list**all,lvsil_**all);//設定imagelist

m_list.insertcolumn(0,"col 1",lvcfmt_left,300,0);//設定列

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");//設定該行的不同列的顯示字元

m_list.setitemtext(0,2,"item 1_3");

此外clistctrl還提供了一些函式用於得到/修改控制項的狀態。

colorref gettextcolor( )/bool settextcolor( colorref cr );用於得到/設定顯示的字元顏色。

colorref gettextbkcolor( )/bool settextbkcolor( colorref cr );用於得到/設定顯示的背景顏色。

void setitemcount( int icount );用於得到新增進列表中項的數量。

bool deleteitem(int nitem);用於刪除某一項,bool deleteallitems( );將刪除所有項。

bool setbkimage(hbitmap hbm, bool ftile , int xoffsetpercent, int yoffsetpercent);用於設定背景位圖。

cstring getitemtext( int nitem, int nsubitem );用於得到某項的顯示字元。

列表控制項的訊息對映同樣使用on_notify巨集,形式如同:on_notify( wnotifycode, id, memberfxn ),wnotifycode為通知**,id為產生該訊息的視窗id,memberfxn為處理函式,函式的原型如同void on***list(nmhdr* pnmhdr, lresult* presult),其中pnmhdr為一資料結構,在具體使用時需要轉換成其他型別的結構。對於列表控制項可能取值和對應的資料結構為:

lvn_beginlabeledit 在開始某項編輯字元時傳送,所用結構:nmlvdispinfo

lvn_endlabeledit 在結束某項編輯字元時傳送,所用結構:nmlvdispinfo

lvn_getdispinfo 在需要得到某項資訊時傳送,(如得到某項的顯示字元)所用結構:nmlvdispinfo

關於on_notify有很多內容,將在以後的內容中進行詳細講解。

關於動態提供結點所顯示的字元:首先你在項時需要指明lpszitem引數為:lpstr_textcallback。在控制項顯示該結點時會通過傳送tvn_getdispinfo來取得所需要的字元,在處理該訊息時先將引數pnmhdr轉換為lpnmlvdispinfo,然後填充其中item.psztext。通過item中的iitem,isubitem可以知道當前顯示的為那一項。下面的**演示了這種方法:

char szout[8][3]=;

//新增結點

m_list.insertitem(lpstr_textcallback,...)

m_list.insertitem(lpstr_textcallback,...)

//處理訊息

void cparentwnd::ongetdispinfolist(nmhdr* pnmhdr, lresult* presult)

關於編輯某項的顯示字元:(在報表風格中只對第一列有效)首先需要設定列表控制項的lvs_editlabels風格,在開始編輯時該控制項將會傳送lvn_beginlabeledit,你可以通過在處理函式中返回true來取消接下來的編輯,在編輯完成後會傳送lvn_endlabeledit,在處理該訊息時需要將引數pnmhdr轉換為lpnmlvdispinfo,然後通過其中的item.psztext得到編輯後的字元,並重置顯示字元。如果編輯在中途中取消該變數為null。下面的**說明如何處理這些訊息:

//處理訊息 lvn_beginlabeledit void cparentwnd::onbegineditlist(nmhdr* pnmhdr, lresult* presult)

//處理訊息 lvn_beginlabeledit

void cparentwnd::onbegineditlist(nmhdr* pnmhdr, lresult* presult)

上面講述的方法所進行的訊息對映必須在父視窗中進行(同樣wm_notify的所有訊息都需要在父視窗中處理)。

如何得到當前選中項位置:在列表控制項中沒有乙個類似於listbox中getcursel()的函式,但是可以通過呼叫getnextitem( -1, lvni_all   lvni_selected);得到選中項位置。

VC List Ctrl控制項

列表控制項可以看作是功能增強的 listbox 它提供了四種風格,而且可以同時顯示一列的多中屬性值。mfc中使用 clistctrl 類來封裝列表控制項的各種操作。通過呼叫 bool create dword dwstyle,const rect rect,cwnd pparentwnd,uint ...

VC ListCtrl控制項的使用

在設計面板中,將控制項拉到視窗中,在屬性中修改自己向要的id,並且,右鍵單擊控制項,在新增變數中輸入成員變數,將該控制項新增到視窗類,作為成員變數。一般來說,我們使用listctrl是為了將他作為二維列表使用,那麼就需要在屬性面板裡找到view屬性,將值改為report。在onpaint訊息處理函式...

C 控制項 MenuStrip控制項(選單控制項)

一 概述 選單通過存放按照一般主題分組的命令將功能公開給使用者。menustrip 控制項是此版本的 visual studio 和 net framework 中的新功能。使用該控制項,可以輕鬆建立 microsoft office 中那樣的選單。menustrip 控制項支援多文件介面 mdi ...