locked
关于List View的icon显示问题 RRS feed

  • 问题

  • 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,望指教,谢谢!
    2010年3月2日 1:33

全部回复

  • 我这个问题没人知道么?希望各位版主指教一下,不胜感激!
    2010年3月15日 11:57