listbox的使用

来源:互联网 发布:openwrt怎么克隆mac 编辑:程序博客网 时间:2024/05/16 16:28
 

VC ListBox的用法

列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOL Create( DWord dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格: 
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示 
LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。 
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点 
LVS_SINGLESEL 同时只能选中列表中一项 
首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用: 

CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用: 
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL); 

通过调用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_listSmall,LVSIL_SMALL);//设置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 OnXXXList(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]={"No.1","No.2","No.3"}; 
//添加结点 
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得到需要显示的字符在数组中的位置 
    *pResult = 0; 


关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的LVS_EDITLABELS风格,在开始编辑时该控件将会发送LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为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; 

//处理消息 LVN_BEGINLABELEDIT 
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) 

    LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; 
    if(pLVDI->item.pszText==NULL);//判断是否已经取消取消编辑 
          m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置显示字符 
    *pResult = 0; 


上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。 

如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL   LVNI_SELECTED);得到选中项位置。列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOL Create( DWord dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格: 
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示 
LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。 
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点 
LVS_SINGLESEL 同时只能选中列表中一项 
首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用: 

CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用: 
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL); 

通过调用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_listSmall,LVSIL_SMALL);//设置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 OnXXXList(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]={"No.1","No.2","No.3"}; 
//添加结点 
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得到需要显示的字符在数组中的位置 
    *pResult = 0; 


关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的LVS_EDITLABELS风格,在开始编辑时该控件将会发送LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为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; 

//处理消息 LVN_BEGINLABELEDIT 
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) 

    LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; 
    if(pLVDI->item.pszText==NULL);//判断是否已经取消取消编辑 
          m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置显示字符 
    *pResult = 0; 


上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。 

如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL   LVNI_SELECTED);得到选中项位置。

 

 

MFC ListControl控件用法

开发环境:visual studio 2008

1、新建一个基于对话框的MFC应用程序。在对话框上拖放一个listcontrol控件和一个button控件,给listcontrol控件添加一个名为m_StoreItems的变量。添加button的点击响应函数。

void CDepartmentStoreDlg::OnBnClickedNewitem()

{

// TODO: 在此添加控件通知处理程序代码

srand((unsigned)time(NULL));

TCHAR strNumber[20];//这里不要定义为char或者CString类型,不然后面 lvItem.pszText会报错。

int number1 = rand() % 100;

int number2 = rand() % 100;

wsprintf(strNumber,_T("%d-%d"), number1, number2);

LVITEM lvItem;

lvItem.mask = LVIF_TEXT;

lvItem.iItem = 0;

lvItem.iSubItem = 0;

lvItem.pszText = strNumber;

m_StoreItems.InsertItem(&lvItem);

}

运行效果如下,效果相当于listbox控件,就是一个列表,一行一行的:

现在设置为报表视图,显示成表格形式。

在初始化函数里添加:

BOOL CDepartmentStoreDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: 在此添加额外的初始化代码

m_StoreItems.SetView(LVS_REPORT);//如果在属性里面设置了listview的view是report,这里就没必要了,默认的是icon

LVCOLUMN lvColumn;

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; //掩码设置了fmt值、显示列标题和指定宽度

lvColumn.fmt = LVCFMT_LEFT; //设置作对其模式

lvColumn.cx = 120; //设置标题的宽度为120个像素

lvColumn.pszText = _T("Full Name"); //设置标题(列名)

m_StoreItems.InsertColumn(0, &lvColumn); //添加列,索引为0

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 100;

lvColumn.pszText = _T("Profession");

m_StoreItems.InsertColumn(1, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 80;

lvColumn.pszText = _T("Fav Sport");

m_StoreItems.InsertColumn(2, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 75;

lvColumn.pszText = _T("Hobby");

m_StoreItems.InsertColumn(3, &lvColumn);

}

下面给报表添加点实际的内容。

继续在初始化函数里添加:

LVITEM lvItem;

int nItem;

lvItem.mask = LVIF_TEXT;//这里的掩码设置一定要注意,因为item和column的掩码值很像,例如LVIF_TEXT和LVCF_TEXT,I对应的item,C对应的column,不然的话会显示不出来的,这个地方害死我了,因为有插件自动补全代码,补全后没注意看,结果没有对应,郁闷了好一会

lvItem.iItem = 0;//行号(索引,从0开始),报表相当于二维数组的模式,添加行内容时要指定行号和列号

lvItem.iSubItem = 0;//列号(索引,从0开始)

lvItem.pszText = _T("Sandra C. Anschwitz");//内容

nItem = m_StoreItems.InsertItem(&lvItem);//插入这一行,返回行号(索引)

m_StoreItems.SetItemText(nItem, 1, _T("Singer"));//设置行索引(行号)和列索引(列号)的值

m_StoreItems.SetItemText(nItem, 2, _T("HandBall"));

m_StoreItems.SetItemText(nItem, 3, _T("Beach"));

lvItem.mask = LVIF_TEXT;

lvItem.iItem = 1;

lvItem.iSubItem = 0;

lvItem.pszText = _T("Roger A. Miller");

nItem = m_StoreItems.InsertItem(&lvItem);

m_StoreItems.SetItemText(nItem, 1, _T("Footballer"));

m_StoreItems.SetItemText(nItem, 2, _T("Tennis"));

m_StoreItems.SetItemText(nItem, 3, _T("Teaching"));

lvItem.mask = LVIF_TEXT;

lvItem.iItem = 2;

lvItem.iSubItem = 0;

lvItem.pszText = _T("Marie-Julie W. Gross");

nItem = m_StoreItems.InsertItem(&lvItem);

m_StoreItems.SetItemText(nItem, 1, _T("Student"));

m_StoreItems.SetItemText(nItem, 2, _T("Boxing"));

m_StoreItems.SetItemText(nItem, 3, _T("Programming"));

lvItem.mask = LVIF_TEXT;

lvItem.iItem = 3;

lvItem.iSubItem = 0;

lvItem.pszText = _T("Ella Pius Roger");

nItem = m_StoreItems.InsertItem(&lvItem);

m_StoreItems.SetItemText(nItem, 1, _T("Architect"));

m_StoreItems.SetItemText(nItem, 2, _T("Ping-Pong"));

m_StoreItems.SetItemText(nItem, 3, _T("Songo"));

中途小结:

在报表视图中,要做的主要有下面几步:

1)确保当前视图为报表视图,在属性窗口设置view或者在代码中设置为view模式

2)添加列:用到的数据结构是LVCOLUMN (就是list view column,对应的掩码也是LVCF_,list view column format)

3)添加行:用到的数据结构是LVITEM (list view item,对应的掩码是LVIF_,list view item format)

添加行的时候先添加第一个元素,即行索引为nItem,列索引为0,然后InsertItem,返回当前行的索引,之后就是设置该行的其他元素了,指定行、列索引和设置值即可。

4)删除行:BOOL DeleteItem(int nItem);删除指定的索引为nItem的行内容。有时候我们会先选中某行,然后删除,这个时候需要用到函数int GetNextItem(int nItem, int nFlags);从指定的索引nItem(不包括该索引,如果要包括该行的话,设置nItem -1即可)开始寻找满足nFlags条件的Item,成功则返回找到的Item的索引(如果有多个,则返回第一个),失败返回-1.这样的话如果要删除选中的某行,则可以这样实现 m_StoreItems.DeleteItem(m_StoreItems.GetNextItem(-1,LVNI_SELECTED));(建议设置扩展风格时,把整行选中设置进来this->m_StoreItems.SetExtendedStyle( LVS_EX_FULLROWSELECT);这样选中的时候就是一行了,否则会是一格)。如果要删除多行选中的,则可以用下面的代码:

int nIndex;

do

{

nIndex = m_StoreItems.GetNextItem(-1,LVNI_SELECTED);

m_StoreItems.DeleteItem(nIndex);

} while (nIndex != -1);

这里添加一点调整列宽的,以下代码可供参考(摘自CSDN):

voidCMyListView::AutoAdjustColumnWidth()

{

CHeaderCtrl*pHeaderCtrl=m_pListCtrl->GetHeaderCtrl();

m_pListCtrl->SetRedraw(FALSE);//防止闪烁

pHeaderCtrl->SetRedraw(FALSE);//防止闪烁

intnColumnCount=pHeaderCtrl->GetItemCount(); //获取列数

for(inti=0; i<nColumnCount; i++)

{

m_pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE);

intnColumnWidth=m_pListCtrl->GetColumnWidth(i);

m_pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);

intnHeaderWidth=m_pListCtrl->GetColumnWidth(i);

m_pListCtrl->SetColumnWidth(i, max(nColumnWidth, nHeaderWidth)+10);

}

pHeaderCtrl->SetRedraw(TRUE);//此处开启刷新,避免闪烁

m_pListCtrl->SetRedraw(TRUE);

pHeaderCtrl->Invalidate();//Update Window to redraw.

pHeaderCtrl->UpdateWindow();

}

下面就开始设置图片了。

新建两个bitmap资源,大小为16*16,ID分别为IDB_UP和IDB_LOSANGE,初始化函数CDepartmentStoreDlg::OnInitDialog()改为如下:

m_StoreItems.SetView(LVS_REPORT);

LVCOLUMN lvColumn;

CBitmap bmpUP, bmpLosange;

bmpUP.LoadBitmap(IDB_UP);

bmpLosange.LoadBitmap(IDB_LOSANGE);

CImageList *ImgHeaders = new CImageList();

ImgHeaders->Create(16, 16, ILC_MASK, 1, 1);

ImgHeaders->Add(&bmpUP, RGB(0, 0, 0));

ImgHeaders->Add(&bmpLosange, RGB(0, 0, 0));

m_StoreItems.SetImageList(ImgHeaders, LVSIL_SMALL);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_IMAGE;

lvColumn.fmt = LVCFMT_LEFT | LVCFMT_IMAGE;

lvColumn.cx = 120;

lvColumn.pszText = _T("Full Name");

lvColumn.iImage = 0;

m_StoreItems.InsertColumn(0, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 100;

lvColumn.pszText = _T("Profession");

m_StoreItems.InsertColumn(1, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_IMAGE;

lvColumn.fmt = LVCFMT_LEFT | LVCFMT_IMAGE;

lvColumn.iImage = 1;

lvColumn.cx = 80;

lvColumn.pszText = _T("Fav Sport");

m_StoreItems.InsertColumn(2, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 75;

lvColumn.pszText = _T("Hobby");

m_StoreItems.InsertColumn(3, &lvColumn);

 

继续完善。给CDepartmentStoreDlg类添加变量:

CImageList m_SmallImg;

CImageList m_LargeImg;

函数:

DWORD GetViewType(void);

void SetViewType(DWORD dwViewType);

cpp中的实现:

DWORD CDepartmentStoreDlg::GetViewType(void)

{

return (GetStyle() & LVS_TYPEMASK);

}

void CDepartmentStoreDlg::SetViewType(DWORD dwViewType)

{

DWORD dwCurType;

HWND hWnd;

hWnd = this->m_StoreItems;

GetSafeHwnd();

dwCurType = ::GetWindowLong(hWnd, GWL_STYLE);

dwCurType &= ~LVS_TYPEMASK;

dwViewType |= dwCurType;

::SetWindowLong(hWnd, GWL_STYLE, dwViewType);

}

窗体上添加Large、Small、List、Details四个button,添加鼠标点击事件的响应函数,如下:

void CDepartmentStoreDlg::OnBnClickedLarge()

{

// TODO: 在此添加控件通知处理程序代码

SetViewType(LVS_ICON);

}

void CDepartmentStoreDlg::OnBnClickedSmall()

{

// TODO: 在此添加控件通知处理程序代码

if( GetViewType() != LVS_SMALLICON)

SetViewType(LVS_SMALLICON);

}

void CDepartmentStoreDlg::OnBnClickedDetail()

{

// TODO: 在此添加控件通知处理程序代码

if( GetViewType() != LVS_REPORT)

SetViewType(LVS_REPORT);

}

void CDepartmentStoreDlg::OnBnClickedList()

{

// TODO: 在此添加控件通知处理程序代码

if( GetViewType() != LVS_LIST)

SetViewType(LVS_LIST);

}

窗体上的New Item按钮调用的窗体如下,用来添加数据, 给窗体创建类,并给控件添加相应变量。

添加2个位图资源,属性为ID:IDB_Larging Weight:162 Height:32,ID:IDB_Smalling Weight:80 Height:16

‍ ‍
初始化函数代码:

m_StoreItems.SetView(LVS_REPORT);

LVCOLUMN lvColumn;

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_CENTER;

lvColumn.cx = 60;

lvColumn.pszText = _T("Item #");

this->m_StoreItems.InsertColumn(0, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 100;

lvColumn.pszText = _T("Category");

this->m_StoreItems.InsertColumn(1, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 160;

lvColumn.pszText = _T("Item Name");

this->m_StoreItems.InsertColumn(2, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_LEFT;

lvColumn.cx = 80;

lvColumn.pszText = _T("Size");

this->m_StoreItems.InsertColumn(3, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_RIGHT;

lvColumn.cx = 60;

lvColumn.pszText = _T("Unit Price");

this->m_StoreItems.InsertColumn(4, &lvColumn);

lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

lvColumn.fmt = LVCFMT_RIGHT;

lvColumn.cx = 30;

lvColumn.pszText = _T("Qty");

this->m_StoreItems.InsertColumn(5, &lvColumn);

this->m_StoreItems.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);//设置扩展风格

m_SmallImg.Create(IDB_Smalling, 16, 1, RGB(255, 255, 255));

m_LargeImg.Create(IDB_Larging, 32, 1, RGB(255, 255, 245));

m_StoreItems.SetImageList(&m_SmallImg, LVSIL_SMALL);

m_StoreItems.SetImageList(&m_LargeImg, LVSIL_NORMAL);

New Item按钮的响应函数为(将添加item的类include进来):

void CDepartmentStoreDlg::OnBnClickedNewitem()

{

// TODO: 在此添加控件通知处理程序代码

CNewItemDlg dlg;//这个是添加新数据的窗体类

srand((unsigned)time(NULL));

TCHAR strNumber[20];

int number1 = rand() % 100;

int number2 = rand() % 100;

wsprintf(strNumber,_T("%d-%d"), number1, number2);

dlg.m_ItemNumber = strNumber;

if (dlg.DoModal())

{

LVITEM lvItem;

int nItem;

int imgNbr;

if( dlg.m_Category == "Babies" )

imgNbr = 0;

else if( dlg.m_Category == "Teens" )

imgNbr = 1;

else if( dlg.m_Category == "Women" )

imgNbr = 2;

else if( dlg.m_Category == "Men" )

imgNbr = 3;

else

imgNbr = 4;

lvItem.mask = LVIF_IMAGE | LVIF_TEXT;

lvItem.iItem = 0;

lvItem.iSubItem = 0;

lvItem.pszText = strNumber;

lvItem.iImage = imgNbr;

nItem = this->m_StoreItems.InsertItem(&lvItem);

this->m_StoreItems.SetItemText(nItem, 1, dlg.m_Category);

this->m_StoreItems.SetItemText(nItem, 2, dlg.m_ItemName);

this->m_StoreItems.SetItemText(nItem, 3, dlg.m_ItemSize);

this->m_StoreItems.SetItemText(nItem, 4, dlg.m_UnitPrice);

this->m_StoreItems.SetItemText(nItem, 5, dlg.m_Quantity);

}

}

效果图:

‍ ‍

this->m_StoreItems.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);//新加checkbox风格

 

 

原创粉丝点击