Мне нужна помощь в настройке прозрачного изображения в буфер обмена. Я продолжаю получать «дескриптор недействителен». В принципе, мне нужен «второй набор глаз», чтобы просмотреть следующий код. (Полный рабочий проект на ftp://missico.net/ImageVisualizer.zip.)Нужна помощь Настройка изображения с прозрачным фоном в буфер обмена
Это изображение библиотеки классов Debug Visualizer, но я включил проект, который будет запущен как исполняемый файл для тестирования. (Обратите внимание, что окно - это окно панели инструментов, а на панели задач отображается значение false.) Мне было надоело выполнять захват экрана в окне панели инструментов, открывать захват экрана с помощью редактора изображений, а затем удалять добавленный фон, потому что он был захват экрана. Поэтому я решил быстро поместить прозрачное изображение в буфер обмена. Ну, проблема в том, что ... нет поддержки прозрачности для Clipboard.SetImage. Google на помощь ... не совсем.
Это то, что у меня есть до сих пор. Я вытащил из нескольких источников. См. Код для основной ссылки. Моя проблема заключается в «недопустимом дескрипторе» при использовании CF_DIBV5. Нужно ли использовать BITMAPV5HEADER и CreateDIBitmap?
Любая помощь от вас GDI/GDI + Wizards была бы очень благодарна.
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();
}
}
Можете ли вы уточнить, какой шаг дает вам неправильную ошибку? –