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並沒有繪出圖片。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章