以及我有一个关于透明度的问题,我想保存为PNG文件,此刻我在系统中的光标的屏幕截图,并保存为PNG,这工作良好的白色箭头,手和其他游标,但在使用游标的时候,如工字钢或“不”游标,这有一个问题,解释是每个游标都有一个蒙版和一个颜色位图合并,并导致透明光标,但工字梁和其他人没有颜色位图,他们只有在同一个位图中包含颜色和掩码的掩码,我参考这篇文章:C# - Capturing the Mouse cursor image以及他们使用C#,但想法是相同的。在白色背景上的透明度位图C++ winapi
在我的代码我使用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做的工作,但不工作,我得到一个黑色的图像或白色的图像,我不知道如何使用工字母光罩蒙版创建透明度:/ –