📄 0501003.htm
字号:
<P align=justify>BOOL CVCLISTDlg::OnInitDialog()</P>
<P align=justify>{CDialog::OnInitDialog();</P>
<P align=justify>//......//其它代码</P>
<P align=justify>// TODO: Add extra initialization here此处增加代码</P>
<P align=justify>LV_ITEM lvitem;</P>
<P align=justify>LV_COLUMN lvcol;</P>
<P align=justify>int i,iPos,iItemNum;</P>
<P align=justify>CVCLISTApp *pApp=(CVCLISTApp *)AfxGetApp();//创建图象列表</P>
<P align=justify>Cil1.Create(32,32,TRUE,2,2);</P>
<P align=justify>Cil1.Add(pApp->LoadIcon(IDI_GJ));</P>
<P align=justify>Cil1.Add(pApp->LoadIcon(IDI_XS));</P>
<P align=justify>Cil2.Create(16,16,TRUE,2,2);</P>
<P align=justify>Cil2.Add(pApp->LoadIcon(IDI_GJ));</P>
<P align=justify>Cil2.Add(pApp->LoadIcon(IDI_XS));//设置图象列表</P>
<P align=justify>m_ListCtrl.SetImageList(&Cil1,LVSIL_NORMAL);</P>
<P align=justify>m_ListCtrl.SetImageList(&Cil2,LVSIL_SMALL);//向列表控制中添加表列</P>
<P align=justify>lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;</P>
<P align=justify>lvcol.fmt=LVCFMT_CENTER;//居中</P>
<P align=justify>i=0;</P>
<P align=justify>lvcol.pszText="品 名";</P>
<P align=justify>lvcol.iSubItem=i;</P>
<P align=justify>lvcol.cx=70;</P>
<P align=justify>m_ListCtrl.InsertColumn(i++,&lvcol);</P>
<P align=justify>lvcol.pszText="数 量";</P>
<P align=justify>lvcol.iSubItem=i;</P>
<P align=justify>lvcol.cx=70;</P>
<P align=justify>m_ListCtrl.InsertColumn(i++,&lvcol);</P>
<P align=justify>lvcol.pszText="单 价";</P>
<P align=justify>lvcol.iSubItem=i;</P>
<P align=justify>lvcol.cx=70;</P>
<P align=justify>m_ListCtrl.InsertColumn(i++,&lvcol);</P>
<P align=justify>lvcol.pszText="金 额";</P>
<P align=justify>lvcol.iSubItem=i;</P>
<P align=justify>lvcol.cx=70;</P>
<P align=justify>m_ListCtrl.InsertColumn(i++,&lvcol);</P>
<P align=justify>//向列表控制中添加表项</P>
<P align=justify>iItemNum=sizeof(Sps)/sizeof(SPS);</P>
<P align=justify>for(i=0;i<iItemNum;i++){</P>
<P align=justify>lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;</P>
<P align=justify>lvitem.iItem=i;</P>
<P align=justify>lvitem.iSubItem=0;</P>
<P align=justify>lvitem.pszText=Sps[i].szPm;</P>
<P align=justify>lvitem.iImage=Sps[i].Lx;</P>
<P align=justify>lvitem.lParam=i;</P>
<P align=justify>iPos=m_ListCtrl.InsertItem(&lvitem);//返回表项插入后的索引号</P>
<P align=justify>lvitem.mask=LVIF_TEXT;</P>
<P align=justify>lvitem.iItem=iPos;</P>
<P align=justify>lvitem.iSubItem=1;</P>
<P align=justify>lvitem.pszText=Sps[i].szSl;</P>
<P align=justify>m_ListCtrl.SetItem(&lvitem);</P>
<P align=justify>lvitem.iSubItem=2;</P>
<P align=justify>lvitem.pszText=Sps[i].szDj;</P>
<P align=justify>m_ListCtrl.SetItem(&lvitem);</P>
<P align=justify>lvitem.iSubItem=3;</P>
<P align=justify>lvitem.pszText=Sps[i].szJe;</P>
<P align=justify>m_ListCtrl.SetItem(&lvitem);</P>
<P align=justify>}</P>
<P align=justify>CheckRadioButton(IDC_STDICON,IDC_REPORT,IDC_STDICON);</P>
<P align=justify>return TRUE; // return TRUE unless you set the focus to a
control</P>
<P align=justify>}</P>
<P align=justify>(4)完善列表显示方式代码</P>
<P align=justify>在利用Classwizard类向导创建各功能按钮显示功能函数之后,必须依次完善这些功能函数的代码,这些功能函数如下:</P>
<P align=justify>void CVCLISTDlg::OnStdicon()//设置大图标显示方式</P>
<P align=justify>{ // TODO: Add your control notification handler code here</P>
<P align=justify>LONG lStyle;</P>
<P
align=justify>lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型</P>
<P align=justify>lStyle&=~LVS_TYPEMASK; //清除显示方式位</P>
<P align=justify>lStyle|=LVS_ICON; //设置显示方式</P>
<P align=justify>SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型</P>
<P align=justify>}</P>
<P align=justify>void CVCLISTDlg::OnSmlicon() //设置小图标显示方式</P>
<P align=justify>{ // TODO: Add your control notification handler code here</P>
<P align=justify>LONG lStyle;</P>
<P
align=justify>lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型</P>
<P align=justify>lStyle&=~LVS_TYPEMASK; //清除显示方式位</P>
<P align=justify>lStyle|=LVS_SMALLICON; //设置显示方式</P>
<P align=justify>SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型</P>
<P align=justify>}</P>
<P align=justify>void CVCLISTDlg::OnList() //设置列表显示方式</P>
<P align=justify>{ // TODO: Add your control notification handler code here</P>
<P align=justify>LONG lStyle;</P>
<P
align=justify>lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型</P>
<P align=justify>lStyle&=~LVS_TYPEMASK; //清除显示方式位</P>
<P align=justify>lStyle|=LVS_LIST; //设置显示方式</P>
<P align=justify>SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型</P>
<P align=justify>}</P>
<P align=justify>void CVCLISTDlg::OnReport() //详细资料显示方式</P>
<P align=justify>{ // TODO: Add your control notification handler code here</P>
<P align=justify>LONG lStyle;</P>
<P
align=justify>lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型</P>
<P align=justify>lStyle&=~LVS_TYPEMASK; //清除显示方式位</P>
<P align=justify>lStyle|=LVS_REPORT; //设置显示方式</P>
<P align=justify>SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型</P>
<P align=justify>}</P>
<P align=justify>(5)删除功能的实现</P>
<P
align=justify>要实现删除功能,必须取得选中表项的数和表项总数,并且需要从后向前进行依次删除,其原因是每个表项被删除后,其后各表项的索引号均会发生递减变化,如果采取从前向后删除的方法,就会造成无法正常删除选中的表项,其功能代码如下:</P>
<P align=justify>void CVCLISTDlg::OnDel() //删除按钮功能</P>
<P align=justify>{ // TODO: Add your control notification handler code here</P>
<P align=justify>int i,iState;</P>
<P align=justify>int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数</P>
<P align=justify>int nItemCount=m_ListCtrl.GetItemCount();//表项总数</P>
<P align=justify>if(nItemSelected<1) return;</P>
<P align=justify>for(i=nItemCount-1;i>=0;i--){</P>
<P align=justify>iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED);</P>
<P align=justify>if(iState!=0) m_ListCtrl.DeleteItem(i);</P>
<P align=justify>}</P>
<P align=justify>}</P>
<P align=justify>(6)排序功能的实现</P>
<P
align=justify>列表控制有一个特殊的功能,当以详细资料方式显示时,列表顶部的表头可以当作按钮来使用,这可以通过列表控制创建时的风格来控制。当鼠标点击列表头名称时,列表控制就会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类导向中列表控制IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可将表列按照特定顺序进行排列。其函数使用方法见程序,其中iSort为排序的表列索引号,(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItemS属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。</P>
<P align=justify>void CVCLISTDlg::OnColumnclickListctrl(NMHDR* pNMHDR, LRESULT*
pResult) </P>
<P align=justify>{ //鼠标左键单击表头处理函数</P>
<P align=justify>NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;</P>
<P align=justify>// TODO: Add your control notification handler code here</P>
<P align=justify>static int iSorted=-1;//排列序号</P>
<P align=justify>if (pNMListView->iSubItem==iSorted) return;</P>
<P align=justify>iSorted=pNMListView->iSubItem;</P>
<P align=justify>m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted);</P>
<P align=justify>*pResult = 0;</P>
<P align=justify>}</P>
<P align=justify>//排序时比较表项的回调函数</P>
<P align=justify>int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM
lParamSort)</P>
<P align=justify>{ char *text1,*text2;</P>
<P align=justify>switch (lParamSort){</P>
<P align=justify>case 0L:text1=Sps[lParam1].szPm;</P>
<P align=justify>text2=Sps[lParam2].szPm;break;</P>
<P align=justify>case 1L:text1=Sps[lParam1].szSl;</P>
<P align=justify>text2=Sps[lParam2].szSl;break;</P>
<P align=justify>case 2L:text1=Sps[lParam1].szDj;</P>
<P align=justify>text2=Sps[lParam2].szDj;break;</P>
<P align=justify>case 3L:text1=Sps[lParam1].szJe;</P>
<P align=justify>text2=Sps[lParam2].szJe;break;</P>
<P align=justify>}</P>
<P align=justify>return (strcmp(text1,text2));//结果为>0 =0 <0</P>
<P align=justify>}</P>
<P align=justify>同样,也可以通过专用按钮来实现排序功能,如本文的排序按钮对应的功能代码如下:</P>
<P align=justify>void CVCLISTDlg::OnSort() </P>
<P align=justify>{ // TODO: Add your control notification handler code here</P>
<P align=justify>m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);}</P>
<P align=justify>7、列表视的演练技巧</P>
<P
align=justify>在使用列表视时,其方法与列表控制基本相同,只不过列表视是在窗口中来实现的而列表控制是在对话框中实现,列表视的各种功能是通过菜单来实现的而列表控制是通过按钮等方式来实现的,列表控制需要在对话框中创建列表控制控件而列表视直接占据整个窗口,在设计过程中只要将按钮和列表控制设计过程变为菜单设计,并注意在功能增加是在类向导中是通过菜单命令来操作,同时在每个功能函数前面增加取得列表视引用的命令(
CListCtrl& ListCtrl = GetListCtrl()),而其余数据结构和代码均不需要修改,实现起来比较容易。</P>
<P align=justify>笔者实现的列表控制和视程序的运行结果如下:</P>
<P align=justify><IMG height=253 src="../../images/image77.gif"
width=426> 列表控制演练示例结果</P>
<P align=justify><IMG height=262 src="../../images/image78.gif"
width=292> 列表视演练示例结果</P></BIG></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -