【发布时间】:2011-09-28 23:45:23
【问题描述】:
嗯,我有一个关于我想保存为 png 文件的位图文件的透明度的问题,目前我在系统中截取光标并将其保存为 png,这项工作很好,白色箭头,手和其他光标,但在使用 I 型光标或“非”光标之类的光标时会出现问题,解释是每个光标都有一个遮罩和一个颜色位图,它们组合并产生透明光标,但 I 型光标和其他光标没有颜色位图,他们只有在同一个位图中包含颜色和遮罩的遮罩,我参考这篇文章:C# - Capturing the Mouse cursor image 他们使用 C#,但想法是一样的。
在我的代码中,我使用 C++,我设法创建了一个光标,但背景颜色为白色,我不知道如何将其转换为透明颜色,在帖子中我提到使用函数 MakeTransparent,有什么想法吗?感谢您的帮助:D
CURSORINFO cursor;
ICONINFO cursorIconInfo;
HICON cursorIcon;
cursor.cbSize=sizeof(CURSORINFO);
GetCursorInfo(&cursor);
GetIconInfo(cursor.hCursor,&cursorIconInfo);
//cursorIcon=CopyIcon(cursor.hCursor);
//GetIconInfo(LoadCursor(NULL,IDC_ARROW),&cursorIconInfo);
//cursorIcon=CreateIconIndirect(&cursorIconInfo);
CxImage* imag=new CxImage();
/*imag->CreateFromHICON(cursorIcon);
imag->Save("cursor.png",CXIMAGE_FORMAT_PNG);*/
BITMAP bm;
//CImage* imag=new CImage();
GetObject(cursorIconInfo.hbmMask,sizeof(BITMAP),&bm);
if(bm.bmHeight == bm.bmWidth*2){
HDC screendc=CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
HDC cursormaskDC=CreateCompatibleDC(screendc);
HDC cursorfinalDC=CreateCompatibleDC(screendc);
HBITMAP cursormask=CreateCompatibleBitmap(screendc,bm.bmWidth,bm.bmWidth);
HBITMAP cursorfinal=CreateCompatibleBitmap(screendc,bm.bmWidth,bm.bmWidth);
SelectObject(cursormaskDC,cursorIconInfo.hbmMask);
SelectObject(cursorfinalDC,cursorfinal);
BitBlt(cursorfinalDC,0,0,bm.bmWidth,bm.bmWidth,cursormaskDC,0,bm.bmWidth,SRCCOPY);
BitBlt(cursorfinalDC,0,0,bm.bmWidth,bm.bmWidth,cursormaskDC,0,0,SRCINVERT);
/*cursorIconInfo.hbmColor=cursorcolor;
cursorIconInfo.hbmMask=cursormask;
cursorIcon=CreateIconIndirect(&cursorIconInfo);
imag->CreateFromHICON(cursorIcon);
imag->Save("cursorPrub.png",CXIMAGE_FORMAT_PNG);*/
imag->CreateFromHBITMAP(cursorfinal);
imag->Save("cursor.png",CXIMAGE_FORMAT_PNG);
DeleteObject(cursorIconInfo.hbmMask);
DeleteObject(cursorIconInfo.hbmColor);
DestroyIcon(cursorIcon);
imag->Destroy();
return;
}
【问题讨论】:
-
不,这个想法肯定不相同。您尝试复制的 C# 代码是使用 .NET Framework 编写的,该框架不仅封装了 GDI+,还为程序员提供了大量方便、可重用的代码库。当您编写本机、非托管 C++ 时,您必须自己完成所有工作,因为这些库还没有为您编写。您不能简单地将 C# 代码翻译成 C++ 代码,但这不是语言问题,而是库问题。
MakeTransparent()函数将无处可寻。 -
感谢科迪,我对此进行了调查,您是对的,但是我如何将具有白色背景的位图转换为透明位图?,我使用建议的 BitBlt,并使用 SRCAND 和 SRCPAINT 来做工作,但不工作,我得到一个黑色图像或白色图像,我不知道如何使用工字梁遮罩来创建透明度:/
标签: c++ visual-c++ bitmap transparency