本文主要是介绍IMAGE LIST,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要使用CImgeList首先要使用它的create函数:
一般用的比较多的是这一个函数,当然,它还有很多重载,自己可以去翻阅msdn.
BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
cx与cy表示图标的大小,nFlags确定建立图像列表的类型,可以是以下值的组合: ILC_COLOR、ILC_COLOR4、ILC_COLOR8、ILC_COLOR16、ILC_COLOR24、ILC_COLOR32、 ILC_COLORDDB和ILC_MASK;
用的较多的是ILC_COLOR32表示颜色数目,自然越多越好,ILC_MASK也很常用,如果不设置这个值,那个图标透明的地方会被黑色填充。
nInitial指的是初始时list中包含的图片容量,nGrow表示当原来的图片容量用完之后每次添加的新的容量(大于等于1就可以了).
然后我们就添加图片了,暂时我只说明从程序中资源文件中添加图标这种方法
- CImageList *pImage;
- pImage = new CImageList();
- pImage->Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);
- //添加图标
- HICON icon = AfxGetApp()->LoadIcon(IDI_MAIL);
- pImage->Add(icon);
CImageList *pImage;pImage = new CImageList();pImage->Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);//添加图标HICON icon = AfxGetApp()->LoadIcon(IDI_MAIL);pImage->Add(icon);
然后在要使用图片资源的地方调用SetImageList即可,添加对于该类资源的引用。
CImageList* SetImageList( CImageList* pImageList, int nImageList );
其返回值是指向前一个图像列表控件的一个指针,如果不存在前一个图像列表则为NULL;其中参数pImageList是指向图像列表的标识,nImageList是图像列表的类型,可以是如下值:
LVSIL_NORMAL 用大图标方式进行图像列表;
LVSIL_SMALL 用小图标方式进行图像列表;
我们以在CListView为基类的子类中的OnInitialUpdate()函数为例,来看一看如何使用:
- void CEmailListView::OnInitialUpdate()
- {
- CListView::OnInitialUpdate();
- //得到内置的listctrl的引用
- CListCtrl& ctl = GetListCtrl();
- //获取当前的窗口风格
- DWORD dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);
- //清除显示方式位
- dwStyle &= ~LVS_TYPEMASK;
- //设置报表风格
- dwStyle |= LVS_REPORT;
- /*
- *
- * LVS_TYPEMASK 0000011
- * LVS_LIST;
- * LVS_REPORT;
- * LVS_SMALLICON;
- * LVS_ICON;
- */
- //设置窗口风格
- ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
- //得到扩展风格
- dwStyle = ctl.GetExtendedStyle();
- /*
- * LVS_EX_GRIDLINES 网格线(只适用与报表风格的listctrl)
- * LVS_EX_FULLROWSELECT 整行选中
- * LVS_EX_CHECKBOXES 有选中框
- */
- dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;
- //设置扩展风格
- ctl.SetExtendedStyle(dwStyle);
- //设置背景颜色
- ctl.SetBkColor(RGB(255, 255, 255));
- //设置文本颜色
- ctl.SetTextColor(RGB(255, 0, 0));
- //设置边框颜色
- //ctl.SetBkColor(RGB(0, 0, 255));
- ctl.InsertColumn(0, _T("发件人"), LVCFMT_CENTER, 200);
- ctl.InsertColumn(1, _T("主题"), LVCFMT_CENTER, 260);
- ctl.InsertColumn(2, _T("时间"), LVCFMT_CENTER, 160);
- pImage = new CImageList();
- pImage->Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);
- //添加图标
- HICON icon = AfxGetApp()->LoadIcon(IDI_MAIL);
- pImage->Add(icon);
- GetListCtrl().SetImageList(pImage, LVSIL_SMALL);
- GetListCtrl().InsertItem(0, (LPCTSTR)_T("972733802@qq.com"), 0);
- GetListCtrl().SetItemText(0, 1, (LPCTSTR)_T("天下无不散之筵席"));
- GetListCtrl().SetItemText(0, 2, (LPCTSTR)_T("2015-01-01"));
- }
void CEmailListView::OnInitialUpdate()
{CListView::OnInitialUpdate();//得到内置的listctrl的引用CListCtrl& ctl = GetListCtrl();//获取当前的窗口风格DWORD dwStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);//清除显示方式位dwStyle &= ~LVS_TYPEMASK;//设置报表风格dwStyle |= LVS_REPORT;/** * LVS_TYPEMASK 0000011* LVS_LIST;* LVS_REPORT;* LVS_SMALLICON;* LVS_ICON;*///设置窗口风格::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);//得到扩展风格dwStyle = ctl.GetExtendedStyle();/** LVS_EX_GRIDLINES 网格线(只适用与报表风格的listctrl)* LVS_EX_FULLROWSELECT 整行选中* LVS_EX_CHECKBOXES 有选中框*/dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;//设置扩展风格ctl.SetExtendedStyle(dwStyle);//设置背景颜色ctl.SetBkColor(RGB(255, 255, 255));//设置文本颜色ctl.SetTextColor(RGB(255, 0, 0));//设置边框颜色//ctl.SetBkColor(RGB(0, 0, 255));ctl.InsertColumn(0, _T("发件人"), LVCFMT_CENTER, 200);ctl.InsertColumn(1, _T("主题"), LVCFMT_CENTER, 260);ctl.InsertColumn(2, _T("时间"), LVCFMT_CENTER, 160);pImage = new CImageList();pImage->Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);//添加图标HICON icon = AfxGetApp()->LoadIcon(IDI_MAIL);pImage->Add(icon);GetListCtrl().SetImageList(pImage, LVSIL_SMALL);GetListCtrl().InsertItem(0, (LPCTSTR)_T("972733802@qq.com"), 0);GetListCtrl().SetItemText(0, 1, (LPCTSTR)_T("天下无不散之筵席"));GetListCtrl().SetItemText(0, 2, (LPCTSTR)_T("2015-01-01"));}
注:pImage为指向CImageList的指针.
效果如下:
使用CImageList我们经常犯的一个错误是,我们经常这么写:
- void CEmailListView::OnInitialUpdate()
- {
- '''''''''''''''''''''''''
- CImageList pImage;
- pImage.Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);
- //添加图标
- HICON icon = AfxGetApp()->LoadIcon(IDI_MAIL);
- pImage.Add(icon);
- GetListCtrl().SetImageList(&pImage, LVSIL_SMALL);
- '''''''''''''''''''''''''
- }
void CEmailListView::OnInitialUpdate()
{'''''''''''''''''''''''''CImageList pImage;pImage.Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2);//添加图标HICON icon = AfxGetApp()->LoadIcon(IDI_MAIL);pImage.Add(icon);GetListCtrl().SetImageList(&pImage, LVSIL_SMALL);'''''''''''''''''''''''''
}
这么写的话,我们的程序将看不到图标,很简单的一个道理,因为pImage是一个局部变量,OnInitialUpdate()函数执行完毕之后pImage就已经析构了,哪里还有什么对于图标的引用,解决的办法就是让pImage成为类的成员变量或者让其成为一个指针。
这篇关于IMAGE LIST的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!