Re: List control and missing icons
Tom Serface wrote:
Hi Frank,
I've never used ActiveSync, but I've used plenty of list controls. The
problem you are describing sounds like the image list is getting
corrupted (or not passed through) correctly. Could you post some of the
code on how you set up the image list you are using with the list
control? Where is it hosted? How is it created? Do you delete it
after the dialog runs the first time? Is the dialog actually restarted
or is just hidden and reshown later?
Thanks,
Tom
Here are some answers to your questions:
The image list is a member of the class used to display the dialog containing the list control:
// CDlgSettings dialog
class CDlgSettings : public CDialog
{
protected:
CcpError* m_pccpErr;
CMackerelStore* m_pMackerelStore;
CImageList m_oIcons;
CListCtrl m_listCtrl;
....
The image list is created with:
// First create the image list
nResult = m_oIcons.Create(16, 16, ILC_MASK, 4, 1);
assert(nResult != 0);
hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_CALENDAR));
assert(hIcon != 0);
if(hIcon)
{
nNewIndex = m_oIcons.Add(hIcon);
nNewIndex = m_oIcons.Add(hIcon);
}
hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_CONTACTS));
assert(hIcon != 0);
if(hIcon)
{
m_oIcons.Add(hIcon);
}
hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_TASKS));
assert(hIcon != 0);
if(hIcon)
{
m_oIcons.Add(hIcon);
}
hIcon = LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_POST));
assert(hIcon != 0);
if(hIcon)
{
m_oIcons.Add(hIcon);
}
m_listCtrl.SetImageList(&m_oIcons, LVSIL_SMALL);
I do not delete the image list, but since the class goes out of scope, it will probably be deleted.
The dialog is not simply hidden. It is recreated.
When the problem occurs, I have used this code to verify the image list can be accessed and drawn:
BOOL nResult;
DWORD lastError;
int image;
CDC* pDC = NULL;
POINT pt;
LVITEM lvItem;
int nCount;
CImageList* pImageList = NULL;
pDC = GetDC();
pImageList = m_listCtrl.GetImageList(LVSIL_SMALL);
pt.x = 20;
pt.y = 40;
image = 1;
nResult = pImageList->Draw(pDC, image, pt,ILD_NORMAL);
lastError = GetLastError();
pt.x += 20;
image++;
nResult = pImageList->Draw(pDC, image, pt,ILD_NORMAL);
lastError = GetLastError();
And I have used this code to verify the iImage field of each item is correct:
nCount = m_listCtrl.GetItemCount();
for(int i=0; i<nCount; i++)
{
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
lvItem.stateMask = (UINT)-1;
nResult = m_listCtrl.GetItem(&lvItem);
TRACE("row %d, image %d, state 0x%08x", i, lvItem.iImage, lvItem.state);
}
The dialog, when created the second time, is done from a different thread.
Thanks for the help,
--
Regards,
Frank