我想你可以把那结位图变换为图标应该没有这些问题了,加载图标的方法和加载位图的方法差不多。
……
HICON hicon;
ihcon=AfxGetApp()->LoadIcon(IDI_ICON);
……
ClientDC.DrawIcon(,,);
_____________________________
另外也可以绘制透明区域位图,这样也不会看到后面的矩形区域了。这个代码有时间再给你写了,这二天太忙了。
……
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
画透明区原理如下,但那是要自己画的,比较麻烦。
1。修改灯泡的图片,把灯泡外面部分填充为黑色。
2。另外生成一张灯泡图片,整个灯泡为黑色,外面部分为白色。
3。把第二张图片用AND的方式贴到屏幕上某个位置,这时屏幕上就会有一个黑色的灯泡图象。
4。把第一张图片用OR的方式贴到屏幕上的同一位置,这时屏幕上就会出现你想要的没有矩形框而只有灯泡的图象了。 原理其实很简单,就是位运算:
假定a 为0或1
a & 0 = 0;
1 & 1 = a a | 0 = a
a & 0 = 0
void CVideoSource::Draw(CDC *pDC)
{
CBitmap m_Bitmap;
m_Bitmap.LoadBitmap(IDB_BITMAP_VIDEO); BITMAP BM;
CDC MemDC; MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&m_Bitmap);
m_Bitmap.GetObject(sizeof(BM),&BM);
pDC->BitBlt(m_X1,m_Y1,BM.bmWidth,BM.bmHeight,&MemDC,0,0,SRCCOPY);
}
m_X1,m_Y1为左上角的坐标。
每个图元都有一个Draw函数。