How To Implement Hot and Normal Toolbar Images in a Shell View (186151)
The information in this article applies to:
- Microsoft Platform Software Development Kit (SDK) 1.0
This article was previously published under Q186151 SUMMARY
When you implement the view portion of a shell namespace extension that
will be run on Internet Explorer 4.0x with the desktop update, you can
supply separate hot and normal images that will be displayed in Internet
Explorer's toolbar. Supporting regular images where the hot and normal
image is the same is fairly simple to implement. Supporting separate hot
and normal images is more complicated, but you can do it.
MORE INFORMATION
To support separate hot and normal toolbar images, you cannot use the
TB_ADDBITMAP message with IShellBrowser::SendControlMsg. You have to get
the Internet Explorer toolbar's hot and normal image lists using
TB_GETHOTIMAGELIST and TB_GETIMAGELIST with SendControlMsg. You then need
to add your images to the toolbar's image lists using the image list
functions.
You also need to make sure your images are the same size as those used by
the Internet Explorer's toolbar. When adding to the Internet Explorer
toolbar's image list, your images must be the exact same size as those in
the toolbar. For example, if your images are 16 x 16 pixels and the
toolbar's images are 32 x 32 pixels, you need to draw your images centered
in a 32 x 32 image and then add the images to the toolbar. The code below
shows how to do this.
Sample Code
//Define this as whatever RGB value you used for your transparent color.
#define TRANSPARENT_COLOR (RGB(192, 192, 192))
LRESULT lResult = 0;
HIMAGELIST himlHot,
himlNormal;
//Get the Internet Explorer toolbar's hot image list.
m_pShellBrowser->SendControlMsg( FCW_TOOLBAR,
TB_GETHOTIMAGELIST,
0,
0,
(LRESULT*)&himlHot);
//Get the Internet Explorer toolbar's normal image list.
m_pShellBrowser->SendControlMsg( FCW_TOOLBAR,
TB_GETIMAGELIST,
0,
0,
(LRESULT*)&himlNormal);
if(himlNormal && himlHot)
{
HIMAGELIST himlAddNorm,
himlAddHot;
//Create an image list from your normal images.
himlAddNorm = ImageList_LoadImage( g_hInst,
MAKEINTRESOURCE(IDB_TOOLS_NORM),
16,
0,
TRANSPARENT_COLOR,
IMAGE_BITMAP,
LR_DEFAULTCOLOR);
if(himlAddNorm)
{
//Merge the normal images.
lResult = ResizeAndMergeImages( himlNormal,
himlAddNorm,
TRANSPARENT_COLOR);
ImageList_Destroy(himlAddNorm);
}
//Create an image list from your hot images.
himlAddHot = ImageList_LoadImage( g_hInst,
MAKEINTRESOURCE(IDB_TOOLS_HOT),
16,
0,
TRANSPARENT_COLOR,
IMAGE_BITMAP,
LR_DEFAULTCOLOR);
if(himlAddHot)
{
//Merge the hot images.
ResizeAndMergeImages(himlHot, himlAddHot, TRANSPARENT_COLOR);
ImageList_Destroy(himlAddHot);
}
}
else
{
TBADDBITMAP tbab;
tbab.hInst = g_hInst;
tbab.nID = (int)IDB_TOOLS_NORM;
m_pShellBrowser->SendControlMsg( FCW_TOOLBAR,
TB_ADDBITMAP,
2,
(LPARAM)&tbab,
&lResult);
}
/*********************************************************************
ResizeAndMergeImages()
*********************************************************************/
int ResizeAndMergeImages( HIMAGELIST himlDest,
HIMAGELIST himlSrc,
COLORREF clrTransparent)
{
int nReturn = -1;
int cxDest,
cyDest,
cxSrc,
cySrc,
nImages;
HDC hdcScreen;
ImageList_GetIconSize(himlDest, &cxDest, &cyDest);
ImageList_GetIconSize(himlSrc, &cxSrc, &cySrc);
nImages = ImageList_GetImageCount(himlSrc);
hdcScreen = GetDC(NULL);
if(hdcScreen)
{
HDC hdc;
hdc = CreateCompatibleDC(hdcScreen);
if(hdc)
{
RECT rc;
HBITMAP hbm;
rc.left = 0;
rc.top = 0;
rc.right = cxDest;
rc.bottom = cyDest;
hbm = CreateCompatibleBitmap(hdcScreen, rc.right, rc.bottom);
if(hbm)
{
HBRUSH hbr;
hbr = CreateSolidBrush(clrTransparent);
if(hbr)
{
int i,
dx,
dy;
dx = (cxDest/2) - (cxSrc/2);
dy = (cyDest/2) - (cySrc/2);
//draw each image into the destination
for(i = 0; i < nImages; i++)
{
HBITMAP hbmTemp;
int n;
hbmTemp = (HBITMAP)SelectObject(hdc, hbm);
//fill the image with the transparent color
FillRect(hdc, &rc, hbr);
ImageList_Draw( himlSrc,
i,
hdc,
dx,
dy,
ILD_NORMAL);
SelectObject(hdc, hbmTemp);
n = ImageList_AddMasked(himlDest, hbm, clrTransparent);
if(-1 == nReturn)
nReturn = n;
}
DeleteObject(hbr);
}
}
DeleteDC(hdc);
}
ReleaseDC(NULL, hdcScreen);
}
return nReturn;
}
Modification Type: | Minor | Last Reviewed: | 7/11/2005 |
---|
Keywords: | kbExtension kbhowto kbNameSpace KB186151 |
---|
|