请教各位高手!!树视图中使用CImageList显示位图,只是显示空白位图显示不出来。为什么?一定加分!
本人建立了一个树视图显示目录,想在对应的目录前添加位图。但是只有空白区域。视图却没有显示出来。特此请教各位高手!!谢谢!!一定加分!!
部分源程序如下:
void CModelDBView1::PopulateTree()
{
// 获取树控件指针
CTreeCtrl& tree = GetTreeCtrl();
CImageList img;
img.Create(16, 16, ILC_COLORDDB | ILC_MASK, 6, 1);
//加载位图
CBitmap bmp1 , bmp2 , bmp3 , bmp4 , bmp5 , bmp6 , bmp7;
bmp1.LoadBitmap(IDB_FLIGHT);
bmp2.LoadBitmap(IDB_COMMONMODEL);
bmp3.LoadBitmap(IDB_OTHERMODEL);
bmp4.LoadBitmap(IDB_COMMONMODEL);
bmp5.LoadBitmap(IDB_ENVIROMENT);
bmp6.LoadBitmap(IDB_ATMOSPHERE);
bmp7.LoadBitmap(IDB_WIND);
//添加位图到图形列表
img.Add(&bmp1 , RGB(192 , 192 , 192));
img.Add(&bmp2 , RGB(192 , 192 , 192));
img.Add(&bmp3 , RGB(192 , 192 , 192));
img.Add(&bmp4 , RGB(192 , 192 , 192));
img.Add(&bmp5 , RGB(192 , 192 , 192));
img.Add(&bmp6 , RGB(192 , 192 , 192));
img.Add(&bmp7 , RGB(192 , 192 , 192));
tree.SetImageList(&img , TVSIL_NORMAL);
HTREEITEM hModel = tree.InsertItem("飞机部件模型", 0 , 0);
HTREEITEM hCommonModel = tree.InsertItem("常用模型" , 1 , 1 , hModel );
tree.InsertItem("发动机模型" , 3 , 3 , hCommonModel );
tree.InsertItem("燃油系统模型" , 3 , 3 , hCommonModel );
tree.InsertItem("空气动力模型" , 3 , 3 , hCommonModel );
tree.InsertItem("质量惯性模型" , 3 , 3 , hCommonModel );
HTREEITEM hOtherModel = tree.InsertItem("其它模型" , 2, 2 , hModel );
HTREEITEM hEnviroment = tree.InsertItem("大气环境模型" , 4 , 4 );
tree.InsertItem("标准大气模型" , 5 , 5 , hEnviroment);
tree.InsertItem("阵风干扰模型" , 6 , 6 , hEnviroment);
//设置样式
DWORD dwStyle = GetWindowLong(GetTreeCtrl().GetSafeHwnd() , GWL_STYLE);
dwStyle |= TVS_HASLINES+TVS_HASBUTTONS+TVS_LINESATROOT+TVS_SHOWSELALWAYS;
SetWindowLong(GetTreeCtrl().GetSafeHwnd() , GWL_STYLE , dwStyle);
SetRedraw(TRUE);
}
问题点数:100、回复次数:9Top
1 楼laiyiling(陌生人[MVP])回复于 2004-07-04 12:02:33 得分 20
img.Create(16, 16, ILC_COLORDDB | ILC_MASK, 6, 1);//6用来确定图像列表包含的图像数量,但是你添加了7个吧!
还有就是你的IDB_FLIGHT的大小是否合适?Top
2 楼pomelowu(羽战士)回复于 2004-07-04 12:13:35 得分 0
单独用SetImageItem试试呢?Top
3 楼gjd111686(数字金刚)回复于 2004-07-04 12:21:39 得分 20
CImageList *pIcon;
pIcon=new CImageList();
pIcon->Create(16,16,ILC_COLOR16,3,0);
pIcon->SetBkColor(RGB(255,255,255));
pIcon->Add(AfxGetApp()->LoadIcon(IDI_ICON1));
pIcon->Add(AfxGetApp()->LoadIcon(IDI_ICON2));
试一下,看是否你16*16没有图而只有默认32*32Top
4 楼PiggyXP(【小猪】技术太差没脸上班,只好去念Ph.D了-_-b)回复于 2004-07-04 13:06:47 得分 20
HICON hIcon[3];
hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICONCHAPTER);
hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICONSECTION);
hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICONTEST);
m_imageList.Add(hIcon[0]);
m_imageList.Add(hIcon[1]);
m_imageList.Add(hIcon[2]);
CTreeCtrl& pTree=GetTreeCtrl();
pTree.SetImageList(&m_imageList,TVSIL_NORMAL);
pTree.ModifyStyle(NULL,
TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);
楼主换成ICON试试看呢?反正我这样弄是没有问题的啊Top
5 楼sohou(2007的春天)回复于 2004-07-04 16:02:56 得分 20
哎,我给个样例给你看看咯!
(1)在文件开始处增加图像列表定义
CImageList Cil1,Cil2;//大小图标像列表
(2)在初始化文件开始处增加代码
BOOL CVCTREEDlg::OnInitDialog()
{ CDialog::OnInitDialog();
......//原来其它代码
// TODO: Add extra initialization here
// 此处开始增加代码
CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//创建图象列表
Cil1.Create(16,16,ILC_COLOR,2,2);
Cil1.Add(pApp->LoadIcon(IDI_PM));
Cil1.Add(pApp->LoadIcon(IDI_CJ));
m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); //设置图象列表
DWORD dwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//获取树控制原风格
dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;
SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//设置风格
char * CJ[4]={"玉溪卷烟厂","云南卷烟厂","沈阳卷烟厂","成都卷烟厂"};//根数据名称
char * PM[4][5]={
{"红梅一","红梅二","红梅三","红梅四","红梅五"},//产品数据项
{"白梅一","白梅二","白梅三","白梅四","白梅五"},
{"绿梅一","绿梅二","绿梅三","绿梅四","绿梅五"},
{"青梅一","青梅二","青梅三","青梅四","青梅五"}};
int i,j;
HTREEITEM hRoot,hCur;//树控制项目句柄
TV_INSERTSTRUCT TCItem;//插入数据项数据结构
TCItem.hParent=TVI_ROOT;//增加根项
TCItem.hInsertAfter=TVI_LAST;//在最后项之后
TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
TCItem.item.pszText="数据选择";
TCItem.item.lParam=0;//序号
TCItem.item.iImage=0;//正常图标
TCItem.item.iSelectedImage=1;//选中时图标
hRoot=m_TreeCtrl.InsertItem(&TCItem);//返回根项句柄
for(i=0;i<4;i++){//增加各厂家
TCItem.hParent=hRoot;
TCItem.item.pszText=CJ[i];
TCItem.item.lParam=(i+1)*10;//子项序号
hCur=m_TreeCtrl.InsertItem(&TCItem);
for(j=0;j<5;j++){//增加各产品
TCItem.hParent=hCur;
TCItem.item.pszText=PM[i][j];
TCItem.item.lParam=(i+1)*10+(j+1);//子项序号
m_TreeCtrl.InsertItem(&TCItem);
}
m_TreeCtrl.Expand(hCur,TVE_EXPAND);//展开树
}
m_TreeCtrl.Expand(hRoot,TVE_EXPAND);//展开上一级树
return TRUE; // return TRUE unless you set the focus to a control
}
(3)增加树项功能的实现
在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,还需要注意的是新增树项的名称初始时均为“新增数据”,增加后允许用户给数据项设置自定义名称。在编程时应特别注意m_TreeCtrl.EditLabel(hInsert);后面不能跟任何其它程序命令,否则这条编辑指令无效。
void CVCTREEDlg::OnAdd()
{ //增加子项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选择项句柄
if(hSel==NULL) return;//无任何选项则返回
static int nAddNo=100;//编号大于100为新增数据
TV_INSERTSTRUCT TCItem;//定义插入项数据结构
TCItem.hParent=hSel; //设置父项句柄
TCItem.hInsertAfter=TVI_LAST;//在最后增加
TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
TCItem.item.pszText="新增数据";
TCItem.item.lParam=nAddNo++;//索引号增加
TCItem.item.iImage=0;//正常图标
TCItem.item.iSelectedImage=1;//选中时图标
HTREEITEM hInsert=m_TreeCtrl.InsertItem(&TCItem);//增加
m_TreeCtrl.Expand(hSel,TVE_EXPAND);
m_TreeCtrl.EditLabel(hInsert);//修改增加的数据
}
(4)删除树项功能的实现
在实现删除功能时,应对存在子项的树项进行提示,以警告用户是否连同其子项一起删除。
void CVCTREEDlg::OnDel()
{ //删除子项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
if(hSel==NULL) return;//无任何选项则返回
if(m_TreeCtrl.ItemHasChildren(hSel))//判断是否有子项
if(MessageBox("厂家下存在品名,一同删除?","警告",MB_YESNO)==IDNO) return;
m_TreeCtrl.DeleteItem(hSel);
}
(5)排序功能的实现
排序功能是对所选中的树项的所有子项按字符中顺序进行排序,如果想要按照其它规则进行排序,应利用SortChildrenItemBC()函数进行自行开发排序程序,这个自行开发的函数与列表控制中实现的函数基本相同,可兴趣的读可以试验。
void CVCTREEDlg::OnSort()
{ //排序子项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
if(hSel==NULL) return;//无任何选项则返回
m_TreeCtrl.SortChildren(hSel);
}
(6)查看功能的实现
查看功能用来查看选中树项的有关信息,函数中中显示了树项的文本名称和标识号,可以将这两个信息作为查找关键字,来查看其它更详细的信息。
void CVCTREEDlg::OnView()
{ //查看选中项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
if(hSel==NULL) return;//无任何选项则返回
CString cText=m_TreeCtrl.GetItemText(hSel);//取得数据项名
LONG IDs=m_TreeCtrl.GetItemData(hSel);//取得数据项序号
char temp[100];
wsprintf(temp,"厂家:%s 编号:%05d",cText,IDs);
MessageBox(temp,"选择信息");
}
(7)修改功能的实现
如果不进行其它处理,当修改树项的文本名称后,就会发现其未被修改,这是因为程序中没有对修改结果进行保存处理,这就要利用TV_DISPINFO结构和SetItemText函数对TVN_ENDLABELEDIT进行处理,这样就可以正确地实现修改功能。
void CVCTREEDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)
{ TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pTVDispInfo->item.pszText==0) return;//用户取消修改操作
m_TreeCtrl.SetItemText(pTVDispInfo->item.hItem,
pTVDispInfo->item.pszText);//设置新数据
*pResult = 0;
}
Top
6 楼laiyiling(陌生人[MVP])回复于 2004-07-04 16:05:26 得分 0
哈哈!
http://218.108.41.12/vchome/book/treectrl.htmTop
7 楼wenxy1(周末了,极速飙车)回复于 2004-07-04 21:13:44 得分 10
www.vckbase.com
上面有很多的实例与文档。Top
8 楼qigefei(齐格飞)回复于 2004-07-20 15:52:47 得分 10
把变量定义改一下
CImageList img;
把 img 定义成类的成员变量Top
9 楼lllllllllluoyi(罗毅)回复于 2004-11-11 23:40:20 得分 0
CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//创建图象列表
Cil1.Create(16,16,ILC_COLOR,2,2);
Cil1.Add(pApp->LoadIcon(IDI_PM));
Cil1.Add(pApp->LoadIcon(IDI_CJ));
会出现“CVCTREEApp”没有宣布,这是为什么呀,是不是要包含什么文件?Top




