一个奇怪的事!在对话框中加入一个CTreeCtrl控件并要其显示图标,只有把CImageList声明为成员变量,CTreeCtrl控件旁的图标才能显示,而在BOOL

czdragon 2003-08-21 03:21:27
一个奇怪的事!在对话框中加入一个CTreeCtrl控件并要其显示图标,只有把CImageList声明为成员变量,CTreeCtrl控件旁的图标才能显示,而在BOOL CDialogtreeDlg::OnInitDialog()函数中申明CImageList却不能显示图标?
难道CTreeCtrl控件不能访问CDialogtreeDlg::OnInitDialog()中的变量吗?
...全文
63 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
awant2k 2003-08-21
  • 打赏
  • 举报
回复
原因 是 OnInitialUpdate 执行完后局部变量m_ImageList会自动释放,同时释放它的资源,除非已经Detach。

LVS_SHAREIMAGELISTS表示自己是否释放其已经Attach的ImageList。
awant2k 2003-08-21
  • 打赏
  • 举报
回复
在 tc.SetImageList(&m_ImageList,TVSIL_NORMAL); 之后加上如下语句:

{
m_ImageList.Detach();

LONG nStyle=GetWindowLong(tc.m_hWnd,GWL_STYLE);
SetWindowLong(tc.m_hWnd,GWL_STYLE,nStyle & ~(DWORD(LVS_SHAREIMAGELISTS)));
}
czdragon 2003-08-21
  • 打赏
  • 举报
回复
你好 hyamw(林锋)
照你说的,OnInitialUpdate()退出后就不能保存ImageList变量了,但是在OnInitialUpdate()退出之前就已经执行了以下显示图标打代码:

hItem=tc.InsertItem(_T("OL"),0,1,TVI_ROOT,TVI_SORT);
if (hItem)
{
tc.InsertItem("J. S. Bach", 0, 1, hItem);
tc.InsertItem("W. A. Mozart", 0, 1, hItem);
tc.InsertItem("F. Chopin", 0, 1, hItem);
}
czdragon 2003-08-21
  • 打赏
  • 举报
回复
你前面说"局部变量,出了这个函数就被丢弃了",可是什么时候出了这个函数的?
我有些搞不懂,我真搞不懂什么时候才能定义局部变量,难道在函数内部用的变量非要定义成
成员变量不可吗?(CImageList m_ImageList这个变量只是在函数中用啊!)
hyamw 2003-08-21
  • 打赏
  • 举报
回复
你在OnInitialUpdate()中定义这个变量的话,当该函数退出的时候,会自动释放在该函数中定义的变量。那么该函数结束后,你的ImageList变量就是一个未知的东东了。TreeCtrl控件在显示图像的时候也就不会显示出图像了,所以必须把ImageList变量定义为全局的变量
孤必有邻 2003-08-21
  • 打赏
  • 举报
回复
前面已经说了

CImageList m_ImageList; // 定义在函数中
定义成成员对象,或全局对象
czdragon 2003-08-21
  • 打赏
  • 举报
回复
原来的代码是这样的,m_ImageList是定义在函数中的,调用它的语句都在函数内啊!
void CDrivetreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();

CImageList m_ImageList; // 定义在函数中

CTreeCtrl &tc = GetTreeCtrl();
tc.ModifyStyle(0, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);
m_ImageList.Create(16,16,0,8,8);
HICON hIcon[2];
hIcon[0]=AfxGetApp()->LoadIcon(IDI_CLOSE);
m_ImageList.Add(hIcon[0]);
hIcon[1]=AfxGetApp()->LoadIcon(IDI_OPEN);
m_ImageList.Add(hIcon[1]);
tc.SetImageList(&m_ImageList,TVSIL_NORMAL);
HTREEITEM hItem;
hItem=tc.InsertItem(_T("OL"),0,1,TVI_ROOT,TVI_SORT);
if (hItem)
{
tc.InsertItem("J. S. Bach", 0, 1, hItem);
tc.InsertItem("W. A. Mozart", 0, 1, hItem);
tc.InsertItem("F. Chopin", 0, 1, hItem);
}
// expand
tc.Expand(hItem, TVE_EXPAND);
}
ninsenki 2003-08-21
  • 打赏
  • 举报
回复
局部变量,出了这个函数就被丢弃了

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧