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并没有绘出图片。

  • 相关阅读:
    一月5日
    一月5日
    面试java工程师的自我介绍(模拟篇)
    Spring Boot Jpa 介绍
    spring+redis做缓存使用
    Spring Boot Web 开发详解
    thymeleaf+spring的简单搭建
    如何搭建 Spring boot
    通用baseDao
    pagehelper的使用
  • 原文地址:https://www.cnblogs.com/yuzhould/p/4455008.html
Copyright © 2011-2022 走看看