ClistCtrl : merge Bitmaps from ImageList to change item height
Hi,
I am trying to modify dynamically image list associated with a
CListCtrl. My first question is :
1) When changing an image list with another one with biggest image does
it automatically resize item height of my CListCtrl ?
2) How can I create an new imagelist from an already attached imagelist
and merge the existing image inside a white(or even better transparent
color). The main idea is to be able to specify item height.
I have tested all tricks used on code project and code guru and it works
but it seems there some issues whith scrollbar in my case.
I have played with Scrollinfo but control doesn't seem to like it.
The other method is to change font size but I am not really statisfied
with this method because I don't want to change the specified font.
So my last attempt is to create(if it doesn't exist) or modify an
imagelist and specify bigger icons.
I wrote the following code with no success
// Create a white bmp
HBITMAP CxListCtrl::CreateBitmap(int nHeight, COLORREF crfColor)
{
HBITMAP hOutBmp = NULL;
BITMAP bm = {0};
HDC hMemDc = CreateCompatibleDC(NULL);
HBITMAP hBmp= CreateCompatibleBitmap(hMemDc, nHeight, nHeight);
SelectObject(hMemDc, hBmp);
HBRUSH hBkBrush = CreateSolidBrush( crfColor );
RECT rcBkGnd = {0, 0, nHeight, nHeight};
HBRUSH hOldBrush= (HBRUSH)SelectObject(hMemDc, hBkBrush);
FillRect(hMemDc, &rcBkGnd, hBkBrush);
SelectObject(hMemDc, hOldBrush);
DeleteObject(hBkBrush);
hOutBmp = hBmp;
DeleteDC(hMemDc);
return hOutBmp;
}
// Merge 2 bitmaps (the white one created from CreateBitmap and the
other from exiting imagelist)
HBITMAP CxListCtrl::AddBitmaps(HBITMAP *pahBmps, DWORD cntFiles)
{
HBITMAP hOutBmp = NULL;
do
{
BITMAP bm = {0};
HDC hMemDc = CreateCompatibleDC(NULL);
HDC tempDc = CreateCompatibleDC(hMemDc);
HBITMAP hMemOld = (HBITMAP)SelectObject(hMemDc, pahBmps[0]);
HBITMAP hBmp= CreateCompatibleBitmap(hMemDc, m_nItemHeight,
m_nItemHeight);
if (NULL == hBmp) break;
SelectObject(hMemDc, hBmp);
HBRUSH hBkBrush = CreateSolidBrush( RGB(255,255,255) );
RECT rcBkGnd = {0, 0, m_nItemHeight, m_nItemHeight};
HBRUSH hOldBrush= (HBRUSH)SelectObject(hMemDc, hBkBrush);
FillRect(hMemDc, &rcBkGnd, hBkBrush);
SelectObject(hMemDc, hOldBrush);
DeleteObject(hBkBrush);
DWORD ixBmp = 0;
int nX = 0, nY = 0;
int ixRow = 0, ixCol = 0, nPreRawY = 0;
while(ixBmp < cntFiles)
{
GetObject(pahBmps[ixBmp], sizeof(BITMAP), &bm );
HBITMAP hOld = (HBITMAP)SelectObject(tempDc, pahBmps[ixBmp]);
BitBlt(hMemDc, nX, nY, bm.bmWidth, bm.bmHeight, tempDc, 0, 0, SRCCOPY);
SelectObject(tempDc, hOld);
//GetNextXY(nX, nY, bm, ixRow, ixCol, nPreRawY);
ixBmp++;
}
SelectObject(hMemDc, hMemOld);
hOutBmp = hBmp;
DeleteDC(tempDc);
DeleteDC(hMemDc);
}while(0);
return hOutBmp;
}
void CxListCtrl::SetItemHeight(int nItemHeight)
{
CBitmap bmp;
CImageList imgList;
CImageList* pImgList = GetImageList( LVSIL_SMALL );
if (pImgList == NULL)
{
/*if (m_nItemHeight > (imgInfo.rcImage.bottom - imgInfo.rcImage.top) )
{
imgList.Add( &bmp,(COLORREF)0x000000);
}*/
}
else
{
int nImgCount = 0, nImgSize = 0;
IMAGEINFO imgInfo;
nImgCount = pImgList->GetImageCount();
pImgList->GetImageInfo(0, &imgInfo);
nImgSize = imgInfo.rcImage.bottom - imgInfo.rcImage.top;
// Create a White BMP with the specified item height
HBITMAP hMaskBmp = CreateBitmap( nItemHeight, RGB(255,255,255) );
// Create a new imagelist and merge each image with white bmp
imgList.Create(nItemHeight, nItemHeight, ILC_MASK | ILC_COLOR, 1, 1);
for (int i = 0; i < nImgCount; i++)
{
pImgList->GetImageInfo(0, &imgInfo);
//GetImageFromList(pImgList, i, &bmp);
HBITMAP hBitmaps[2] = { hMaskBmp, imgInfo.hbmImage };
//AddBitmaps(
}
}
m_nItemHeight = nItemHeight;
}