作者:059586768803wsq | 来源:互联网 | 2023-02-07 02:32
GDI+中的Bitmap类是不是通过GetHBITMAP()函数转换为HBITMAP的?我这个Bitmap对象底色是透明的,然后用bmp.GetHBITMAP(Color(0,255,255,
GDI+中的Bitmap类是不是通过GetHBITMAP()函数转换为HBITMAP的?
我这个Bitmap对象底色是透明的,然后用bmp.GetHBITMAP(Color(0, 255, 255, 255), &hbmp)得到HBITMAP句柄。但是显示时底色却是蓝色的,不知道为什么?
请指教
2 个解决方案
是用GetHBITMAP获得HBITMAP句柄。
但是,“我这个Bitmap对象底色是透明的”这个不好理解。32位的位图有alpha通道,能够指明每个像素的alpha值,但是这也需要程序进行处理(比如,用AlphaBlend绘制)才能起到透明/半透明的效果。不对alpha通道进行处理直接绘制的话,他还是按这个像素的RGB值显示的
不好意思我没说清楚,语句如下
//下面是创建背景透明的位图
using namespace Gdiplus;
m_pBmp = new Bitmap(rect.right - rect.left, rect.bottom - rect.top, PixelFormat32bppARGB);
Graphics* gBmp = Graphics::FromImage(m_pBmp);
SolidBrush sb(Color(0, 255, 255, 255));
gBmp->FillRectangle(&sb, Rect(0, 0, rect.right, rect.bottom));
Pen p(Color(255, 255, 0, 0), 1);
gBmp->DrawEllipse(&p, 0, 0, rect.right, rect.bottom);
//Create a string.
WCHAR string[] = L"尚未签章";
// Initialize arguments.
Gdiplus::Font myFont(L"Arial", 16);
PointF origin(0.0f, 0.0f);
SolidBrush blackBrush(Color(255, 0, 0, 0));
// Draw string.
gBmp->DrawString(string, -1, &myFont, origin, &blackBrush);
然后我在OnDraw()函数中用如下语句
HBITMAP hbmp;
m_pBmp->GetHBITMAP(Gdiplus::Color(0, 255, 255, 255), &hbmp);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
HBITMAP hOldBmp = (HBITMAP)::SelectObject(MemDC.GetSafeHdc(), hbmp);
pdc->StretchBlt(0, 0, rcBounds.right, rcBounds.bottom,
&MemDC, 0, 0, rcBounds.right, rcBounds.bottom, SRCCOPY);
::SelectObject(MemDC.GetSafeHdc(), hOldBmp);
MemDC.DeleteDC();