难道CTreeCtrl控件不能访问CDialogtreeDlg::OnInitDialog()中的变量吗?
8 个解决方案
#1
局部变量,出了这个函数就被丢弃了
#2
原来的代码是这样的,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);
}
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);
}
#3
前面已经说了
把
CImageList m_ImageList; // 定义在函数中
定义成成员对象,或全局对象
把
CImageList m_ImageList; // 定义在函数中
定义成成员对象,或全局对象
#4
你在OnInitialUpdate()中定义这个变量的话,当该函数退出的时候,会自动释放在该函数中定义的变量。那么该函数结束后,你的ImageList变量就是一个未知的东东了。TreeCtrl控件在显示图像的时候也就不会显示出图像了,所以必须把ImageList变量定义为全局的变量
#5
你前面说"局部变量,出了这个函数就被丢弃了",可是什么时候出了这个函数的?
我有些搞不懂,我真搞不懂什么时候才能定义局部变量,难道在函数内部用的变量非要定义成
成员变量不可吗?(CImageList m_ImageList这个变量只是在函数中用啊!)
我有些搞不懂,我真搞不懂什么时候才能定义局部变量,难道在函数内部用的变量非要定义成
成员变量不可吗?(CImageList m_ImageList这个变量只是在函数中用啊!)
#6
你好 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);
}
照你说的,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);
}
#7
在 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)));
}
{
m_ImageList.Detach();
LONG nStyle=GetWindowLong(tc.m_hWnd,GWL_STYLE);
SetWindowLong(tc.m_hWnd,GWL_STYLE,nStyle & ~(DWORD(LVS_SHAREIMAGELISTS)));
}
#8
原因 是 OnInitialUpdate 执行完后局部变量m_ImageList会自动释放,同时释放它的资源,除非已经Detach。
LVS_SHAREIMAGELISTS表示自己是否释放其已经Attach的ImageList。
LVS_SHAREIMAGELISTS表示自己是否释放其已经Attach的ImageList。
#1
局部变量,出了这个函数就被丢弃了
#2
原来的代码是这样的,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);
}
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);
}
#3
前面已经说了
把
CImageList m_ImageList; // 定义在函数中
定义成成员对象,或全局对象
把
CImageList m_ImageList; // 定义在函数中
定义成成员对象,或全局对象
#4
你在OnInitialUpdate()中定义这个变量的话,当该函数退出的时候,会自动释放在该函数中定义的变量。那么该函数结束后,你的ImageList变量就是一个未知的东东了。TreeCtrl控件在显示图像的时候也就不会显示出图像了,所以必须把ImageList变量定义为全局的变量
#5
你前面说"局部变量,出了这个函数就被丢弃了",可是什么时候出了这个函数的?
我有些搞不懂,我真搞不懂什么时候才能定义局部变量,难道在函数内部用的变量非要定义成
成员变量不可吗?(CImageList m_ImageList这个变量只是在函数中用啊!)
我有些搞不懂,我真搞不懂什么时候才能定义局部变量,难道在函数内部用的变量非要定义成
成员变量不可吗?(CImageList m_ImageList这个变量只是在函数中用啊!)
#6
你好 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);
}
照你说的,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);
}
#7
在 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)));
}
{
m_ImageList.Detach();
LONG nStyle=GetWindowLong(tc.m_hWnd,GWL_STYLE);
SetWindowLong(tc.m_hWnd,GWL_STYLE,nStyle & ~(DWORD(LVS_SHAREIMAGELISTS)));
}
#8
原因 是 OnInitialUpdate 执行完后局部变量m_ImageList会自动释放,同时释放它的资源,除非已经Detach。
LVS_SHAREIMAGELISTS表示自己是否释放其已经Attach的ImageList。
LVS_SHAREIMAGELISTS表示自己是否释放其已经Attach的ImageList。