Я думаю, что TortoiseSVN использует меню для рисования владельцем.
Не знаю про winrar, но этот код может работать даже на win98, где у TransparentBlt утечка памяти.
Растровое изображение должно иметь таблицу цветов (8 бит).
Используйте вот так (это форматирование кода может искажать текст, поэтому проверьте на ошибки!)
//we replace magenta with menu color
ReplaceDIBColor(m_hMenuBmp, RGB(255,0,255), GetSysColor(COLOR_MENU));</p>
<p>//function
inline BOOL ReplaceDIBColor(HBITMAP &hDIB, COLORREF oldColor, COLORREF newColor)
{
BOOL bRet=FALSE;
//get color information
DIBSECTION ds;
if (!GetObject(hDIB, sizeof(DIBSECTION), &ds)) return FALSE;
if (ds.dsBmih.biBitCount>8) return FALSE; //must be 8 bpp max</p>
<code>HDC hDC=CreateCompatibleDC(NULL);
if (!hDC) return FALSE;
HBITMAP hbmpOld=(HBITMAP)::SelectObject(hDC, hDIB);
//allocate color table
UINT nColors = ds.dsBmih.biClrUsed ? ds.dsBmih.biClrUsed : 1<<ds.dsBmih.biBitCount; //bpp to UINT
RGBQUAD* ptbl=(RGBQUAD*)CoTaskMemAlloc(nColors*sizeof(RGBQUAD));
if (ptbl)
{
if (GetDIBColorTable(hDC, 0, nColors, ptbl))
{
//replace color table entries
UINT i;
for (i=0; i<nColors ; i++)
{
if (oldColor==RGB(ptbl[i].rgbRed, ptbl[i].rgbGreen, ptbl[i].rgbBlue))
{
ptbl[i].rgbRed=GetRValue(newColor);
ptbl[i].rgbGreen=GetGValue(newColor);
ptbl[i].rgbBlue=GetBValue(newColor);
bRet=TRUE;
}
}
//set new table
if (bRet)
if (!SetDIBColorTable(hDC, 0, nColors, ptbl)) bRet=FALSE;
}
//cleanup
CoTaskMemFree(ptbl);
ptbl=NULL;
bRet=TRUE;
}
else bRet=FALSE;
hDIB=(HBITMAP)::SelectObject(hDC, hbmpOld);
DeleteDC(hDC); return bRet; }
</code>