试试这个ExtractAssociatedIcon。(可能更慢哦)其实不需要一次性全部读出,那样即使有快速的函数也不行的---想想打开System
目录下几千个文件的情况.可以先读出一个n个文件的图标,(n=ListCtrl一页显示的内容),在scroll时,到那页显示那页的。

解决方案 »

  1.   

    例:取出NotePad图标
    CDC *pDC=this->GetDC();
    HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T 
    ("NotePad.exe"),0); if (hIcon &&hIcon!=(HICON)-1) 
    pDC->DrawIcon(10,10,hIcon);
      

  2.   

    我觉得SHGetFileInfo不会慢,至少不比ExtractIcon慢。
    你有没有使用 SHGFI_SYSICONINDEX  标志,直接使用缓冲的SystemImage应该是很快的。
      

  3.   

    linghuye(令狐叶): 请说具体点。谢
      

  4.   

    系统图象列表缓冲了Shell使用的图标。HIMAGELIST hImg;
    SHFILEINFO sfi;
    hImg = (HIMAGELIST)SHGetFileInfo(文件名 , 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|SHGFI_SMALLICON);//大图标用SHGFI_LARGEICON此时返回的值是HIMAGELIST类型的系统图标图象列表,sfi.iIcon为获得的图标在该列表中的Index。
    使用: ImageList_Draw(hImg, sfi.iIcon, pDC, x, y, ILD_TRANSPARENT);//在DC上画出其他函数见MSDN索引 ImageList_*。 如果你调用ImageList_SetBkColor改变此图象列表的背景色,你会发现在浏览器的ShellTree的图标背景色被改变了。
    而且使用 ILD_BLEND标志可画出高亮态,ImageList_BeginDrag,ImageList_DragMove等可画出图标被拖动时的效果。可见系统本身就是使用了该列表.
      

  5.   

    谢谢,能不能再详细点,我会再加分。
    另外,还想请教
    在ListCtrl中怎么用系统图象列表?
    用什么办法把ListCtrl的图像列表设为系统图象列表?
    能不能获得系统图象列表的句柄,然后随心所欲的把它当成自已的图象列表来用?