zoukankan      html  css  js  c++  java
  • 【原创】CListCtrl和CImageList显示缩略图,图片自动排列。

    首先将你的CListCtrl风格设置为ICON风格

    CImageList  m_ImageList;

    CListCtrl    m_list;

    m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

    m_list.SetIconSpacing(CSize(140, 130));     //set pictures spacing

    //wide of picture is 120,height is 90

    m_ImageList.Create(120,90,ILC_COLORDDB|ILC_COLOR32,1,1);

    m_list.SetImageList(&m_ImageList,LVSIL_NORMAL);     //CImageList associates CListCtrl

    //此处用GDI+,

    Bitmap bmp(文件的相对或绝路径);                //传入图片路径

    int sourceWidth = 120;                                           //获得图片宽度,这个120和创建的120保持相同。

    int sourceHeight = bmp.GetHeight();                 //获得图片宽度                                   

    if(sourceHeight>120)             / /和m_ImageList.Create(120…)有很大关系,如果小于设

                             //定的宽度,图片将无法显示。

    {

        sourceHeight=120;

    }

    else

    {

        sourceHeight=bmp.GetHeight();

    }

    Bitmap* pThumbnail = (Bitmap*)bmp.GetThumbnailImage(sourceWidth , sourceHeight , NULL, NULL); //设定缩略图的大小

    HBITMAP hBmp;

    pThumbnail->GetHBITMAP(Color(255,255,255),&hBmp);

    CBitmap *pImage = CBitmap::FromHandle(hBmp);         //转换成CBitmap格式位图

    _wsplitpath(*photo_iter ,drive,dir,fname,ext );

    wcscpy_s(itemName,fname);

    wcscat_s(itemName,ext);

    int a=m_imageList.Add(pImage,RGB(255,255, 255));

    m_pictureList.InsertItem(a,itemName,a);               // itemName,你自己设法得到图片片的名字。名字会显示在图片下面。

    //这里要注意,一定要用InsertItem(a,itemName,a);之前的m_list不需要在insert(I,_T(””));更不需要setItemText(item,subItem,Text),这可能会导致插入相同的图片。

    顺便说下GDI+这个鬼东西,不懂原理,直接说应用。会用的高手见笑。VS2008自带了GDI+,不需要下载。

    1.声明头文件,在stdafx中,或者能被你编译到其他地方都可以。

    #include <gdiplus.h>             //GDI+声明,可以GDI/GDI+混合使用

    #pragma comment(lib, "gdiplus.lib")

    using namespace Gdiplus;

    2.初始化GDI+,

    CMyApp: public CWinApp

    {

      …………

        ULONG_PTR m_gdiplusToken;

    …………

    };

    BOOL CMyApp::InitInstance()    //在这个函数中添加

    {

        //初始化GID+

        GdiplusStartupInput gdiplusStartupInput;       

        GdiplusStartup( &m_gdiplusToken,&gdiplusStartupInput,NULL );

    }

    int CMobilePCApp::ExitInstance()      //释放GDI+调用,这个函数需要自己写。别忘了声明。

    {

        GdiplusShutdown( m_gdiplusToken );

        return CWinApp::ExitInstance();

    }

    当时这样做了后,我的GDI+还是不能用,添加图片时候Bitmap bmp(文件的相对或绝路径); bmp这个东西无效,里面有个空指针的东西,可见GDI+并没有初始化。后来先,初始化GDI+这段代码没有执行到。好了,那就把初始化的代码放到可以执行到的地方。

    在主对话框的InitInstance()中添加

        //初始化GID+

        GdiplusStartupInput gdiplusStartupInput;       

        GdiplusStartup( &m_gdiplusToken,&gdiplusStartupInput,NULL );

    好了,GDI+可以使用了,可以添加缩略图了。截图一张。

    每行图片的数量随窗口大小自动排列。按下面设置属性。

    CListCtrl属性
    Alignment设置为top
    Auto Arrage设置为True.

    如有疑问,请留言。

    //ClimageList无效的原因 1,creare的大小;2,如果是被重写的类,在drawItem重新绘制,不能在关联CImageList

    .h
    CListCtrlCl             m_dataStatisticsList;
    CImageList              m_DataImageList;

    .cpp

            m_DataImageList.Create(44,30,ILC_COLOR24,2,2);
    //bmp.Attach(tempBitmap);
    bmp.LoadBitmap(IDB_CONTACT);
    int a=m_DataImageList.Add(&bmp,RGB(255,255,255));
    int b=m_DataImageList.GetImageCount();

    m_dataStatisticsList.SetImageList(&m_DataImageList,LVSIL_SMALL);
    for(int i=0;i<5;i++)
    {
         m_dataStatisticsList.InsertItem(i,_T(""),0); //0是CImageList的第一个图标。
    }


    分析:在m_DataImageList.Add(&bmp,RGB(255,255,255));之后,得到的CImageList的元素数量b还为0,原因可能在于 m_DataImageList.Create(44,30,ILC_COLOR24,2,2); 前两个参数图片的宽度和长度大于了图片本身,就会add失败。

    在add成功后,b将成为1。 但是 m_dataStatisticsList.InsertItem(i,_T(""),0); 还不见图片,插入的文字倒是没有问题。 这个原因在于m_dataStatisticsList是一个被重写的类CListCtrlCl的对象。在CListCtrlCl中的drawItem并没有绘出图片。

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/yuzhould/p/4455008.html
Copyright © 2011-2022 走看看