Win32中 List View Control显示icon图标问题:
创建Image List,
HIMAGELIST hIcons = NULL;
HICON hIcon = NULL;
INT i = 0;
INT iRet = 0;
hIcons = ImageList_Create(ITEM_ICON_WIDTH, ITEM_ICON_HEIGHT, ILC_COLOR, ITEM_NUM, 0);
ASSERT(NULL != hIcons && INVALID_HANDLE_VALUE != hIcons);
for (i = 0; i < ITEM_NUM; i++) // ITEM_NUM == 8
{
hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1));
ASSERT(NULL != hIcon && INVALID_HANDLE_VALUE != hIcon);
iRet = ImageList_AddIcon(hIcons, hIcon); // 问题1
if (-1 == iRet)
{
ASSERT(0);
}
}
if (ImageList_GetImageCount(hIcons) < 8)
{
ASSERT(0);
}
if (NULL == ListView_SetImageList(hList, hIcons, LVSIL_NORMAL)) //问题2
{
LPVOID lpMsgBuf = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL);
// Process any inserts in lpMsgBuf.
// Display the string.
MessageBox(NULL, (LPCTSTR)lpMsgBuf, L"Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree(lpMsgBuf);
}
问题1:此时编译时报ImageList_AddIcon': identifier not found错误,已经包含了commctrl.h。查阅相关资料和文档,在http://social.msdn.microsoft.com/Forums/en-IE/windowsmobiledev/thread/2abfd66b-3e4d-4f8f-9ad0-1ffaa5d4dbb9有人给出了加上DRA的命名空间,
即DRA::ImageList_AddIcon(hIcons, hIcon); 可以解决,经验证该方法是可以解决,但是没有给出缘由。一直想不明白,为什么\Windows Mobile 6 SDK\Samples\PocketPC\CPP\win32\ListView中自带的例子就不需要加DRA命名空间可以正常编译,希望知道的人帮忙解释一下。谢谢!
问题2:(在加上DRA命名空间解决问题1后)此处ListView_SetImageList返回值为NULL,按照文档返回NULL为出错,查看错误原因是“The handle is invalid.”
查阅资料和文档发现问这个问题的人很多,但是至今没有给出可行的方法。创建List View如下:
GetClientRect(hOwner, &rcClient);
hListView = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SINGLESEL,
rcClient.left + 3,
rcClient.top + 3,
rcClient.right - rcClient.left - 6,
rcClient.bottom - rcClient.top - 6,
hOwner, (HMENU)IDC_LISTVIEW,
g_hInst,
NULL);
ASSERT(NULL != hListView && INVALID_HANDLE_VALUE != hListView);
始终搞不明白为什么ListView_SetImageList(hList, hIcons, LVSIL_NORMAL))会返回NULL,望指教,谢谢!