我要在客户区画一些位图,位图的背景是白色的。这样当我客户区的颜色变了的时候,位图的所有颜色是不变的,也就留下了很多白色小区域。
我的问题是:
有没有办法让位图中的部分颜色随着客户区的颜色而变?
如果你的位图有调色板,通过修改调色板应该可以作到让指定色想素随着客户区的颜色而变。不过我想假如你花灯泡之类,估计你是想以灯泡的不同亮度来表示不同状态,由于你的图很小,不如搞几个不同状态的灯泡的图片,放在资源里,这样简单的多。
我想你可以把那结位图变换为图标应该没有这些问题了,加载图标的方法和加载位图的方法差不多。
……
HICON hicon;
ihcon=AfxGetApp()->LoadIcon(IDI_ICON);
……
ClientDC.DrawIcon(,,);
_____________________________
另外也可以绘制透明区域位图,这样也不会看到后面的矩形区域了。这个代码有时间再给你写了,这二天太忙了。
你可以画透明位图,例如让灯泡的外边白框为透明的,不就行了;
透明位图实现也不难。
有一种画透明位图的方法,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。
用VC++ MFC实现的代码如下:
/*
这是一个用来画透明位图的函数
CDC *pDC 需要画位图的CDC指针
UINT IDImage 位图资源ID
Crect &rect 指定位图在pDC中的位置
COLORREF rgbMask 位图的透明色
*/
void DrawTransparentBitmap(CDC *pDC, UINT IDImage,Crect &rect, COLORREF rgbMask)
{
CDC ImageDC,MaskDC;
Cbitmap Image,*pOldImage;
Cbitmap maskBitmap,*pOldMaskDCBitmap ;
Image.LoadBitmap(IDImage);
ImageDC.CreateCompatibleDC(pDC);
pOldImage=ImageDC.SelectObject(&Image);
MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
ImageDC.SetBkColor(rgbMask);
MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );
ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);
MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
}
void CDemoDlg::OnPaint()
{
CPaintDC dc(this);
Cbitmap BmpBack,*pOldBack,;
BmpBack.LoadBitmap(IDB_BACKGROUND);
CDC dcBack;
dcBack.CreateCompatibleDC(&dc);
pOldBack=dcBack.SelectObject(&BmpBack);
dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));
dcBack.SelectObject(pOldBack);
}
详细请见
http://download.lycos.com.cn/program/article/vc/vc439.html
还是老老实实直接访问Bitmap中的pixel数据,将pixel数据在内存中重新改写。当然我不知道,您的位图是通过哪一种方法画上去的,最好是通过StretchDIBits(...)。如果是资源中的Bitmap,可以通过GetDIBits()得到StretchDIBits要得到的参数。