2011-07-05 107 views
-2

以及我有一个关于透明度的问题,我想保存为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; 
    } 
+0

不,这个想法当然不是**相同。您尝试复制的C#代码是使用.NET Framework编写的,它不仅包装了GDI +,还为程序员提供了一系列方便的可重用代码库。在编写本地非托管C++时,您必须自己完成所有工作,因为这些库尚未为您编写。你不能简单地将C#代码翻译成C++代码,但它不是一个语言问题,这是一个库问题。 'MakeTransparent()'函数无处可寻。 –

+0

感谢科迪我调查,你是对的,但那么我怎么转换一个位图与白色背景的透明位图?,我使用BitBlt建议,并使用SRCAND和SRCPAINT做的工作,但不工作,我得到一个黑色的图像或白色的图像,我不知道如何使用工字母光罩蒙版创建透明度:/ –

回答

-1

使用GDIPlus。它适用于alpha。 Gdi在某些时候可能会使用alpha。

+0

你好,谢谢,我没有使用gdi我使用包含jpeglib的CxImage是非常好的和简单的,但问题是不是从图书馆是更多的逻辑我猜,在我提到他们使用一个函数MakeTransparent(C#)只是在C++这个功能不存在 –

+0

这个答案不是很有用。它没有解释*提交者应该如何使用来自C++应用程序的GDI +。而且它也很模糊:“Gdi在某些时候与alpha不兼容”。不,它不。它的工作原理与设计完全一样。没有什么是随机的,而且这种情况只有时才会发生。更有用的是解释GDI的局限性并将它们与GDI +进行比较。 –

+0

我的意思是,GDI +支持alpha混合。 “首先,GDI +通过提供新功能扩展了GDI的功能,例如渐变刷和alpha混合。” (http://msdn.microsoft.com/en-us/library/ms536338(VS.85).aspx)。对不起,我没有使用GDI +的示例,但Internet包含许多示例。我认为糟糕的回答总比没有好。 – Unick