Necesito ayuda para configurar una imagen transparente en el portapapeles. Sigo recibiendo "el mango no es válido". Básicamente, necesito un "segundo par de ojos" para mirar el siguiente código. (El proyecto de trabajo completo en ftp://missico.net/ImageVisualizer.zip.)Necesita ayuda Configuración de una imagen con fondo transparente en el Portapapeles
Esta es una biblioteca de clases de Debug Visualizer de imagen, pero hice que el proyecto incluido se ejecutara como un ejecutable para la prueba. (Tenga en cuenta que ventana es una ventana de caja de herramientas y mostrar en barra de tareas está configurado en falso.) Estaba cansado de tener que realizar una captura de pantalla en la ventana de caja de herramientas, abrir la captura de pantalla con un editor de imagen y luego eliminar el fondo agregado porque fue una captura de pantalla. Así que pensé que rápidamente pondría la imagen transparente en el portapapeles. Bueno, el problema es ... no hay soporte de transparencia para Clipboard.SetImage. Google al rescate ... no del todo.
Esto es lo que tengo hasta ahora. Saqué de varias fuentes. Vea el código para la referencia principal. Mi problema es el "identificador no válido" cuando uso CF_DIBV5. ¿Debo usar BITMAPV5HEADER y CreateDIBitmap?
Cualquier ayuda de su parte GDI/GDI + Wizards sería muy apreciada.
public static void SetClipboardData(Bitmap bitmap, IntPtr hDC) {
const uint SRCCOPY = 0x00CC0020;
const int CF_DIBV5 = 17;
const int CF_BITMAP = 2;
//'reference
//'http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/816a35f6-9530-442b-9647-e856602cc0e2
IntPtr memDC = CreateCompatibleDC(hDC);
IntPtr memBM = CreateCompatibleBitmap(hDC, bitmap.Width, bitmap.Height);
SelectObject(memDC, memBM);
using (Graphics g = Graphics.FromImage(bitmap)) {
IntPtr hBitmapDC = g.GetHdc();
IntPtr hBitmap = bitmap.GetHbitmap();
SelectObject(hBitmapDC, hBitmap);
BitBlt(memDC, 0, 0, bitmap.Width, bitmap.Height, hBitmapDC, 0, 0, SRCCOPY);
if (!OpenClipboard(IntPtr.Zero)) {
throw new System.Runtime.InteropServices.ExternalException("Could not open Clipboard", new Win32Exception());
}
if (!EmptyClipboard()) {
throw new System.Runtime.InteropServices.ExternalException("Unable to empty Clipboard", new Win32Exception());
}
//IntPtr hClipboard = SetClipboardData(CF_BITMAP, memBM); //works but image is not transparent
//all my attempts result in SetClipboardData returning hClipboard = IntPtr.Zero
IntPtr hClipboard = SetClipboardData(CF_DIBV5, memBM);
//because
if (hClipboard == IntPtr.Zero) {
// InnerException: System.ComponentModel.Win32Exception
// Message="The handle is invalid"
// ErrorCode=-2147467259
// NativeErrorCode=6
// InnerException:
throw new System.Runtime.InteropServices.ExternalException("Could not put data on Clipboard", new Win32Exception());
}
if (!CloseClipboard()) {
throw new System.Runtime.InteropServices.ExternalException("Could not close Clipboard", new Win32Exception());
}
g.ReleaseHdc(hBitmapDC);
}
}
private void __copyMenuItem_Click(object sender, EventArgs e) {
using (Graphics g = __pictureBox.CreateGraphics()) {
IntPtr hDC = g.GetHdc();
MemoryStream ms = new MemoryStream();
__pictureBox.Image.Save(ms, ImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
Image imag = Image.FromStream(ms);
// Derive BitMap object using Image instance, so that you can avoid the issue
//"a graphics object cannot be created from an image that has an indexed pixel format"
Bitmap img = new Bitmap(new Bitmap(imag));
SetClipboardData(img, hDC);
g.ReleaseHdc();
}
}
¿Puede aclarar qué paso le da el error de manejo no válido? –