vc listctrl里相同的列不同行显示不同图标

来源:互联网 发布:新田源码 编辑:程序博客网 时间:2024/05/22 12:52

vc listctrl里相同的列不同行显示不同图标
2009-02-26 20:52

 

我的一段代码,报表风格:(部分)
对话框初始化中:
m_List.InsertColumn(0,"用户",LVCFMT_LEFT,60);
m_List.InsertColumn(1,"IP",LVCFMT_LEFT,60);
m_List.InsertColumn(2,"开始时间",LVCFMT_LEFT,60);
m_List.InsertColumn(3,"请求站点",LVCFMT_LEFT,60);
///////////////////////////////////////////////////
DWORD dwStyle = GetWindowLong(m_List.GetSafeHwnd(),GWL_STYLE);
dwStyle &= ~LVS_TYPEMASK;
dwStyle |= LVS_REPORT;
SetWindowLong(m_List.GetSafeHwnd(),GWL_STYLE,dwStyle);
SetRedraw(TRUE);
Invalidate();
刷新函数中:

m_List.DeleteAllItems();
POSITION pos = m_ptrlist.GetHeadPosition();
while(pos)
{
CInfo* pInfo = (CInfo*)m_ptrlist.GetNext(pos);
m_List.InsertItem(0,pInfo->GetCustomerName());
m_List.SetItemText(0,1,pInfo->GetCustomerAdd());
CTime time(pInfo->GetBeginTime());
CString strTime = time.Format("%H:%M:%S");
m_List.SetItemText(0,2,strTime);
CString str;
str.Format("%s",pInfo->GetStation());
m_List.SetItemText(0,3,str);
}  
一.将图标1和图标2并排添加到一个BITMAP资源中(IDB_BITMAP1)  
1.先添加两个16×16的ico图标,然后添加资源,选择bitmap,该bitmap是32×32的,然后打开Bitmap,打开“资源工具条”里面的"ID="
2.然后选择“改变”-> “查看使用”,然后修改"宽"32,“高”16,然后打开第一个ico,CTRL+C复制,然后打开bitmap,CTRL+V,然后再点击第二个ico,CTRL+C复制,然后打开bitmap,CTRL+V
3.这时这两个图示重叠在一起的, 将后添加的第二个ico移到bitmap右面然后,保存
二,对话框初始化函数里:

wndList.SetExtendedStyle( wndList.GetExtendedStyle()   |LVS_EX_GRIDLINES   |LVS_EX_FULLROWSELECT |LVS_EX_SUBITEMIMAGES);
     wndList.InsertColumn(1, "第一列", LVCFMT_CENTER,110, -1);
wndList.InsertColumn(2, "第二列", LVCFMT_CENTER,180, -1);
wndList.InsertColumn(3, "图标", LVCFMT_CENTER, 190, -1);
// 插入列

CBitmap       bitmap;  
bitmap.LoadBitmap(IDB_BITMAP1);  
m_pImageList       =       new       CImageList();  
m_pImageList->   Create(16,16,TRUE,2,2);  
m_pImageList->   Add(&bitmap,       RGB(0,       0,       0));  
wndList.SetImageList(m_pImageList,LVSIL_SMALL); 

三.void CListctrlDlg::OnButton1()
{
if(nCount%2==0)
{
   wndList.InsertItem( nCount, _T("第n行第一列"),-1);  
   //添加第nCount,行,第一列的文本为“第n行”,-1表示不添加图标
   wndList.SetItem( nCount,1,LVIF_TEXT|LVIF_IMAGE,_T("第二列"),-1,NULL,NULL,   0);
   //设置第n行第2列的文本为“第二列”,-1表示不添加图标
   wndList.SetItem( nCount,2,LVIF_TEXT|LVIF_IMAGE,_T("第三列"),1,NULL,NULL,   0);  
   //设置第n行第3列的文本为“第三列”,0表示添加第一个图标,1表示第二个图标
}
if(nCount%2!=0)
{
   wndList.InsertItem( nCount, _T("第1行第一列"),-1); 
   wndList.SetItem( nCount,1,LVIF_TEXT|LVIF_IMAGE,_T("第二列"),-1,NULL,NULL,   0);  
     wndList.SetItem( nCount,2,LVIF_TEXT|LVIF_IMAGE,_T(""),0,NULL,NULL,   0);  
}

}

 

我的一段代码,报表风格:(部分)
对话框初始化中:
m_List.InsertColumn(0,"用户",LVCFMT_LEFT,60);
m_List.InsertColumn(1,"IP",LVCFMT_LEFT,60);
m_List.InsertColumn(2,"开始时间",LVCFMT_LEFT,60);
m_List.InsertColumn(3,"请求站点",LVCFMT_LEFT,60);
///////////////////////////////////////////////////
DWORD dwStyle = GetWindowLong(m_List.GetSafeHwnd(),GWL_STYLE);
dwStyle &= ~LVS_TYPEMASK;
dwStyle |= LVS_REPORT;
SetWindowLong(m_List.GetSafeHwnd(),GWL_STYLE,dwStyle);
SetRedraw(TRUE);
Invalidate();
刷新函数中:

m_List.DeleteAllItems();
POSITION pos = m_ptrlist.GetHeadPosition();
while(pos)
{
CInfo* pInfo = (CInfo*)m_ptrlist.GetNext(pos);
m_List.InsertItem(0,pInfo->GetCustomerName());
m_List.SetItemText(0,1,pInfo->GetCustomerAdd());
CTime time(pInfo->GetBeginTime());
CString strTime = time.Format("%H:%M:%S");
m_List.SetItemText(0,2,strTime);
CString str;
str.Format("%s",pInfo->GetStation());
m_List.SetItemText(0,3,str);
}  


为什么ListCtrl中显示不出来列
浏览次数:882次悬赏分:0 | 提问时间:2009-4-16 19:08 | 提问者:清风海天 | 检举
 m_list.SetExtendedStyle(LVS_EX_FLATSB
  |LVS_EX_FULLROWSELECT
  |LVS_EX_HEADERDRAGDROP
  |LVS_EX_ONECLICKACTIVATE
  |LVS_EX_GRIDLINES);
 m_list.InsertColumn(0,_T("ID"),LVCFMT_LEFT,6,0);
 m_list.InsertColumn(1,_T("Privilege"),LVCFMT_LEFT,6,1);
 m_list.InsertColumn(2,_T("Burst"),LVCFMT_LEFT,6,2);
 m_list.InsertColumn(3,_T("State"),LVCFMT_LEFT,6,3);
    m_list.InsertItem(0,L"item1");
    m_list.SetItemText(0,1,L"item2");
    m_list.SetItemText(0,2,L"item3");
    m_list.SetItemText(0,3,L"挂起");

 

不要用L

InsertItem功能是添加一个行

添加之后还要用SetItemText来设置改行各列的文本甚至图标,楼上的兄弟说的基本正确,建议楼主采纳

在ListCtrl控件的子列中插入图标
在ListCttrl控件(Report风格)的使用上,有时需要向子列中插入图标,例如要制作一个下载软件,我们计划在控件的第一列用图标的形式显示下载状态:排队、下载中、出错等等,第二列计划用图标显示下载文件类型,要做出这样的效果,就必须使用CListCtrl的SetItem(八个参数)方法,由于我这台电脑上没有MSDN所以这八个参数具体都是什么意思我暂时不清楚,在这只介绍下跟我们的操作关系密切的几个参数。

SetItem()从左向右数第一个参数(从1起计数)表示操作行的行号,这个行号从0计数,最好这个参数设置为InsertItem()的返回值,也就是说应该先用InsertItem()插入一个空行,之后用SetItemText()具体设置插入行每一列的值。SetItem()的第二个参数表示即将操作的列号,也就是我们打算将图标插入到第几列中,该行号从0计数。SetItem()的第五个参数表示图标在CImageList对象(该对象已经通过SetImageList(&ImageList, LVSIL_SMALL)附属至CListCtrl控件)中的序数,该序数从0计数,顺便说一句,准备附属到CListCtrl控件的CImageList对象必须是全局性的,比如可以是类的成员,否则就算其他操作都都正确也看不到图标。

举个例子我们使用的CListCtrl控件的控制对象为m_List,m_List中已经添加了三个列,IDX是InsertItem()的返回值,表示刚刚插入的新行,附属到m_List的CImageList对象中有5个图标,我们通过m_List.SetItem(IDX, 0, LVIF_IMAGE, NULL, 1, 0, 0, 0);之后,就把CImageList对象中的第1个图标插在了第一列的前部(原先第一列的文字还在),之后接着通过m_List.SetItem(IDX, 2, LVIF_IMAGE, NULL, 0, 0, 0, 0);就把CImageList对象中的第0个图标插在了第二列的前部(原先的文字还在)。可以看到如下实例图:

有一点值得说明,如果只在子列中插入了图标而没有给主列(第一列)插入任何图标,则默认第一列将插入与同一行最后一次给子列插入图标。还有重要的一点,如果想在子列插入图标,首先必须使ListCtrl控件具备LVS_EX_SUBITEMIMAGES风格,例如我们可以通过m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_SUBITEMIMAGES);给控件附加该风格。


以这样:从CFileDialog派生一个类。
创建对话框资源,定义ID为stc32=0x45f,添加一个组框,组框就对应着标准的文件对话框,它的位置就是文件对话框在预览对话框的位置。然后你自己加上预览所需的控件。CFileDialog中有一个m_ofn数据成员,利用m_ofn的挂钩函数实现预览

 

原创粉丝点击