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风格

 

源码下载:http://download.csdn.net/source/2940438

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值