Bonjour,

Je réalise actuellement un petit soft basé sur une SDI. Depuis cette SDI, je fais ouvrir une boite de Dialogue "CFileTransferDlg" dans la quelle j'ai recréé manuellement un explorer type windows (arbre CTreeCtrl à gauche et liste CListCtrl à droite). L'arbre est pleinement fonctionnel : affichage des dossiers et fichiers dans l'arborescence...etc. Il n'y a juste qu'un seul problème qui se situe au niveau des images de la liste.

Depuis ma SDI, lorsque j'ouvre ma boite de Dialogue (en cliquant sur une icone d'une barre d'outils) la première fois, tout marche parfaitement, et les icones de l'arbre et de la liste s'affichent correctement. Si je ferme ma boite de Dialogue et que je la réouvre juste après, les textes de mon arbre et de ma liste s'affichent mais je n'ai plus les icones.


Je décris ici comment j'ai procédé dans mon code, pour la construction des listes d'images associées à l'arbre et à la liste.

Pour la boite de Dialogue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
class CFileTransferDlg : public CDialog
{
public:
	CFileTransferDlg(CWnd* pParent = NULL);   // standard constructor
	~CFileTransferDlg();
 
	CPcTreeCtrl	m_PcTreeCtrl;	
	CPcListCtrl	m_PcListCtrl;
 
protected:
	CImageList	*m_pPcTreeCtrlImageList;
	CImageList	*m_pPcListCtrlImageList;
};
 
CFileTransferDlg::CFileTransferDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFileTransferDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFileTransferDlg)
	//}}AFX_DATA_INIT
	m_pPcTreeCtrlImageList = NULL;
	m_pPcListCtrlImageList = NULL;
}
 
BOOL CFileTransferDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
 
	(...)
 
	CString strPcPath= "D:\\Test\\";
 
	//----------------------------------------
	// Creates an ImageList
	//----------------------------------------
 
	SHFILEINFO sfi;
	HIMAGELIST hSystemImageList = (HIMAGELIST) SHGetFileInfo(_T("C:\\"), 0, &sfi, sizeof(SHFILEINFO),
															 SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
 
	m_pPcTreeCtrlImageList = new CImageList();
	m_pPcListCtrlImageList = new CImageList();
 
	ASSERT(m_pPcTreeCtrlImageList != NULL && m_pPcListCtrlImageList != NULL);    // serious allocation failure checking
 
	VERIFY(m_pPcTreeCtrlImageList->Attach(hSystemImageList));
	m_PcTreeCtrl.SetImageList(m_pPcTreeCtrlImageList, TVSIL_NORMAL);
	m_pPcTreeCtrlImageList->Detach();
 
	VERIFY(m_pPcListCtrlImageList->Attach(hSystemImageList));
	m_PcListCtrl.SetImageList(m_pPcListCtrlImageList, LVSIL_SMALL);
 
	(...)
 
	//---------------------------------------------
	//Display the folder items in the Pc Tree
	//---------------------------------------------
	m_PcTreeCtrl.DisplayDrives(TVI_ROOT, FALSE);
	m_PcTreeCtrl.SetSelectedPath(strPcPath, 1);
 
	//----------------------------------------
	// Add columns to the list ctrl.
	//----------------------------------------
	m_PcListCtrl.InsertColumn (0, _T ("Nom"), LVCFMT_LEFT, 170);
	m_PcListCtrl.InsertColumn (1, _T ("Taille"), LVCFMT_RIGHT, 70);
	m_PcListCtrl.InsertColumn (2, _T ("Modifié le"), LVCFMT_LEFT, 100);
 
	//---------------------------------------------
	// Initialize  m_pPcListCtrl & m_pPcTreeCtrl
	//---------------------------------------------
	m_PcTreeCtrl.m_pPcListCtrl = &m_PcListCtrl;
	m_PcListCtrl.m_pPcTreeCtrl = &m_PcTreeCtrl;
 
	//----------------------------------------
	// Populate the list ctrl with items.
	//----------------------------------------
	m_PcListCtrl.DisplayPath (strPcPath);
}
Dans le CTreeCtrl :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
void CPcTreeCtrl::OnDestroy() 
{
	CTreeCtrl::OnDestroy();
 
	CImageList  *pimagelist;
	pimagelist = GetImageList(TVSIL_NORMAL);
	delete pimagelist;	
}
Dans le CListCtrl :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
void CPcListCtrl::OnDestroy() 
{
	CListCtrl::OnDestroy();
 
	CImageList  *pimagelist;
	pimagelist = GetImageList(LVSIL_SMALL);
	delete pimagelist;	
}

A noter aussi que si je mets en commentaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
	VERIFY(m_pPcListCtrlImageList->Attach(hSystemImageList));
	m_PcListCtrl.SetImageList(m_pPcListCtrlImageList, LVSIL_SMALL);
alors lorsque je ferme et réouvre autant de fois que je veux ma boite de Dialogue, les images s'affichent correctement dans l'arbre.

J'en déduis que c'est la liste qui me fout un peu le bordel dans l'affichage des images.

Quelqu'un aurait-il une idée pour résoudre mon problème ? Merci par avance.