CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

请教各位高手!!树视图中使用CImageList显示位图,只是显示空白位图显示不出来。为什么?一定加分!

楼主xushuwen1979(xsw)2004-07-04 11:05:58 在 VC/MFC / 界面 提问

本人建立了一个树视图显示目录,想在对应的目录前添加位图。但是只有空白区域。视图却没有显示出来。特此请教各位高手!!谢谢!!一定加分!!  
   
   
  部分源程序如下:  
  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

相关问题

  • MFC的树视图
  • 谁会建树型视图?
  • 有关建立树视图的问题。
  • 关于树形视图问题????????
  • treeview树状视图控件问题
  • 一个树形视图的问题
  • 动态创建树视图问题
  • 树状视图(treeview)的实现
  • 视图
  • 视图

关键词

  • mp3
  • 视图
  • bmp
  • cil
  • cimagelist
  • cvctreeapp
  • picon
  • idi
  • 白梅
  • loadicon

得分解答快速导航

  • 帖主:xushuwen1979
  • laiyiling
  • gjd111686
  • PiggyXP
  • sohou
  • wenxy1
  • qigefei

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo