是这样的,一般都是用drawicon直接把HICON对象画出来,
但是有人说可以使用gdi的函数实现同样的功能
图标对象(彩色)里面有两幅位图
就是分别先and再xor这两幅就行我试勒一下,是画出来勒,但是背景都变成黑色了,不知道怎么做成透明的我的代码:
HICON hicon;
hicon = this->icon;
ICONINFO iconinfo;
HBITMAP andbm,xorbm;
int nWidth = rect.Width();
int nHeight = rect.Height();
CDC memdc3;
GetIconInfo(hicon,&iconinfo);
andbm = iconinfo.hbmMask;
xorbm = iconinfo.hbmColor;
memdc3.CreateCompatibleDC(pDC);
memdc3.SelectObject(andbm);
memdc3.StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCAND);
memdc3.SelectObject(xorbm);
memdc3.StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCINVERT);
pDC->StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCCOPY);
但是有人说可以使用gdi的函数实现同样的功能
图标对象(彩色)里面有两幅位图
就是分别先and再xor这两幅就行我试勒一下,是画出来勒,但是背景都变成黑色了,不知道怎么做成透明的我的代码:
HICON hicon;
hicon = this->icon;
ICONINFO iconinfo;
HBITMAP andbm,xorbm;
int nWidth = rect.Width();
int nHeight = rect.Height();
CDC memdc3;
GetIconInfo(hicon,&iconinfo);
andbm = iconinfo.hbmMask;
xorbm = iconinfo.hbmColor;
memdc3.CreateCompatibleDC(pDC);
memdc3.SelectObject(andbm);
memdc3.StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCAND);
memdc3.SelectObject(xorbm);
memdc3.StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCINVERT);
pDC->StretchBlt(rect.left,rect.top,nWidth,nHeight,&memdc3,0,0,32,32,SRCCOPY);
解决方案 »
- 有关tesseract OCR的问题
- VC中用到ODBC数据库出现FROM子句语法错误?????
- CoCreateInstance分配的指针是否必须释放?
- 点击一个按钮触发另一个可执行文件应该怎么做?
- 求救!!单文档
- error C2440: “类型转换”: 无法从“double”转换为“void *”
- 小问题,我在使用CInternetSession::OpenURL()时,怎么可以不从本地机缓存里读取数据,up有分
- PeekMessage与SendMessage用法不一样??
- ADO简单问题求教,解决问题立即送分,绝不食言!
- 关于SQL server 请指教
- 【介绍几本COM的书籍】(转载)
- 请问怎样使Dialog中的控件不使能?
CImageList m_il;
m_il.Create(...);LoadImage(...); //装图标,作为位图
m_il.Add((CBitmap &bmp), RGB(...)); //这里设置透明色。m_il.Draw(...) 画图
如何利用图标对象内含的位图来做图,达到图标的效果
现在该透明的地方都是黑的,该怎么让它透明!!??
return; CDC *dc = GetDC(); CDC cdcTemp,
cdcBackGround,
cdcBitMask,
cdcMemory,
cdcScreenBits; COLORREF clrrefBkColor; CBitmap cbmNewBitmap,
cbmCopyBitMask,
cbmCopyMemory,
cbmCopyBackGround,
cbmScreenBits;
CBitmap * cbmOldBitmap;
CBitmap * cbmBackGroundOld;
CBitmap * cbmBitMaskOld;
CBitmap * cbmMemoryOld;
CBitmap * cbmScreenBitsOld; BITMAP bm;
CRect rect;//图片区域 cdcTemp.CreateCompatibleDC(dc); cbmNewBitmap.LoadBitmap(nBmpID);
// Select the bitmap into the dc cbmOldBitmap = cdcTemp.SelectObject(&cbmNewBitmap); GetObject(HBITMAP(cbmNewBitmap),
sizeof(BITMAP),
(LPSTR)&bm); // Get the pointer to the message bar
// of the application
rect = targetRect;
rect.right = rect.left + bm.bmWidth;
rect.bottom = rect.top + bm.bmHeight; // Create dc's in which to move our bitmap around
// so we can back out background
cdcBackGround.CreateCompatibleDC(dc);
cdcMemory.CreateCompatibleDC(dc);
cdcScreenBits.CreateCompatibleDC(dc);
cdcBitMask.CreateCompatibleDC(dc);
// Create the bitmaps for each of our dc's
//单色
cbmCopyBackGround.CreateBitmap(rect.Width(),
rect.Height(), 1, 1, NULL);
cbmCopyBitMask.CreateBitmap(rect.Width(),
rect.Height(), 1, 1, NULL);
//彩色
cbmCopyMemory.CreateCompatibleBitmap(dc,
rect.Width(), rect.Height());
cbmScreenBits.CreateCompatibleBitmap(dc,
rect.Width(), rect.Height());
// Select the bitmaps just created into each of the dc's
cbmBackGroundOld =
cdcBackGround.SelectObject(&cbmCopyBackGround);
cbmBitMaskOld =
cdcBitMask.SelectObject(&cbmCopyBitMask);
cbmMemoryOld =
cdcMemory.SelectObject(&cbmCopyMemory);
cbmScreenBitsOld =
cdcScreenBits.SelectObject(&cbmScreenBits);
// Copy out the are of the screen that is about
// to be overwritten
//将图片(cdcTemp)拷贝到cdcScreenBits保存
//cdcTemp SRCCOPY cdcScreenBits
cdcScreenBits.BitBlt(0, 0, rect.Width(),
rect.Height(), &cdcTemp, 0, 0, SRCCOPY); // Set the background color to white
// This was the color chosen to be transparent
//选择白色背景色
clrrefBkColor = cdcTemp.SetBkColor(RGB( 255, 255, 255));
// Create mask for your bitmap
//创建黑白图片(白色背景,黑色前景)(cdcBitMask)
//cdcTemp SRCCOPY cdcBitMask
cdcBitMask.BitBlt(0, 0, rect.Width(),
rect.Height(), &cdcTemp, 0, 0,
SRCCOPY);
// Put the original background color back
cdcTemp.SetBkColor(clrrefBkColor);
// Create the reverse of the mask you just made
//创建黑白图片(黑色背景,白色前景)(cdcBackGround)
//cdcBitMask NOTSRCCOPY cdcBackGround
cdcBackGround.BitBlt(0, 0, rect.Width(),
rect.Height(), &cdcBitMask, 0, 0,
NOTSRCCOPY);
// Copy in the background of the paint dc first
//拷贝原窗口图象(cdcMemory)
//屏幕 SRCCOPY cdcMemory
cdcMemory.BitBlt(0, 0, rect.Width(),
rect.Height(), dc, rect.left,
rect.top, SRCCOPY);
// Copy in the mask for the bitmap
//叠合产生黑色前景的透明图片(cdcMemory)
//cdcBitMask SRCAND cdcMemory
cdcMemory.BitBlt(0, 0, rect.Width(),
rect.Height(), &cdcBitMask, 0, 0, SRCAND);
// Mask out the bits we have determined to be
// transparent (white ones)
//叠合产生彩色前景,黑色背景的图片(cdcTemp)
//cdcBackGround SRCAND cdcTemp
cdcTemp.BitBlt(0, 0, rect.Width(),
rect.Height(), &cdcBackGround, 0, 0, SRCAND); // Blend in the background
//叠合产生彩色前景的透明图片(cdcMemory),操作完成
//cdcTemp SRCPAINT cdcMemory
cdcMemory.BitBlt(0, 0, rect.Width(),
rect.Height(), &cdcTemp, 0, 0, SRCPAINT); WaitForSingleObject(m_hPaintEvent, INFINITE);
ResetEvent(m_hPaintEvent);
// Now put it all on the display
dc->BitBlt(rect.left, rect.top,
rect.Width(), rect.Height(), &cdcMemory,
0, 0, SRCCOPY); SetEvent(m_hPaintEvent); cdcTemp.SelectObject(cbmOldBitmap);
cdcBackGround.SelectObject(cbmBackGroundOld);
cdcBitMask.SelectObject(cbmBitMaskOld);
cdcMemory.SelectObject(cbmMemoryOld);
cdcScreenBits.SelectObject(cbmScreenBitsOld); cdcTemp.DeleteDC();
cdcBackGround.DeleteDC();
cdcBitMask.DeleteDC();
cdcMemory.DeleteDC();
cdcScreenBits.DeleteDC(); DeleteObject(&clrrefBkColor); // Bitmap objects for copying the masks, original,
// and so forth back and forth
DeleteObject(&cbmNewBitmap);
DeleteObject(&cbmCopyBitMask);
DeleteObject(&cbmCopyMemory);
DeleteObject(&cbmCopyBackGround);
DeleteObject(&cbmScreenBits);