Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 00:05   #1
Reclaimer
 
Регистрация: 15.01.2012
Сообщений: 5
По умолчанию Передать метафайл в буфер обмена

Здравствуйте!
Необходимо передать метафайл в буфер обмена.
Для записи в буфер метафайла, доступного другим приложениям Windows, следует воспользоваться функциями API Windows, так как классы NET.Framework реализуют эту операцию некорректно.
Даётся код класса, который позволит передавать метафайл в буфер:
Код:
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication3
{
    public class ClipboardMetafileHelper
    {
        [DllImport("user32.dll")]
        static extern bool OpenClipboard(IntPtr hWndNewOwner);
        [DllImport("user32.dll")]
        static extern bool EmptyClipboard();
        [DllImport("user32.dll")]
        static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);
        [DllImport("user32.dll")]
        static extern bool CloseClipboard();
        [DllImport("gdi32.dll")]
        static extern IntPtr CopyEnhMetaFile(IntPtr hemfSrc, IntPtr hNULL);
        [DllImport("gdi32.dll")]
        static extern bool DeleteEnhMetaFile(IntPtr hemf);

        static public bool PutEnhMetafileOnClipboard(IntPtr hWnd, Metafile mf)
        {
            bool bResult = false;
            IntPtr hEMF, hEMF2;
            hEMF = mf.GetHenhmetafile();//недопустимый параметр. ArgumentException не обработано
            if (!hEMF.Equals(new IntPtr(0)))
            {
                MessageBox.Show("!hEMF.Equals(new IntPtr(0))");
                hEMF2 = CopyEnhMetaFile(hEMF, new IntPtr(0));
                if (!hEMF2.Equals(new IntPtr(0)))
                {
                    MessageBox.Show("!hEMF2.Equals(new IntPtr(0))");
                    if (OpenClipboard(hWnd))
                    {
                        MessageBox.Show("OpenClipboard(hWnd)");
                        if (EmptyClipboard())
                        {
                            MessageBox.Show("EmptyClipboard()");
                            IntPtr hRes = SetClipboardData(14 /*CF_ENHMETAFILE*/, hEMF2);
                            bResult = hRes.Equals(hEMF2);
                            CloseClipboard();
                        }
                    }
                }
                DeleteEnhMetaFile(hEMF);
            }
            return bResult;
        }

    }
}
Далее создаю метафайл и пытаюсь передать в буфер с помощью статического метода PutEnhMetafileOnClipboard,
но при попытке выполнения метода программа останавливается и ругается на hEMF = mf.GetHenhmetafile();

Код:
            Graphics gr = CreateGraphics();
            gr = addAllRectToGraphics();//функция, где прорисовываются необходимые фигуры
            IntPtr dc = gr.GetHdc();          
            Metafile mf = new Metafile(dc, EmfType.EmfOnly);
            gr.ReleaseHdc(dc);
            gr.Dispose();
            ClipboardMetafileHelper.PutEnhMetafileOnClipboard(this.Handle, mf));
Reclaimer вне форума Ответить с цитированием
Старый 23.05.2012, 18:00   #2
Reclaimer
 
Регистрация: 15.01.2012
Сообщений: 5
По умолчанию

Так, всё же вот пример, как создавать метафайл и объекты Graphics, чтобы можно было передать в буфер обмена:
Код:
Graphics grfx = CreateGraphics();
            IntPtr dc = grfx.GetHdc();
            Metafile mf = new Metafile(dc, EmfType.EmfOnly);
            Graphics gr = Graphics.FromImage(mf);

            foreach (Rect rt in array)
                if (rt.getSelection()) rt.Draw(gr, 0, 0); //рисуем нужные объекты

            grfx.ReleaseHdc(dc);
            grfx.Dispose();
            gr.Dispose();

            if (ClipboardMetafileHelper.PutEnhMetafileOnClipboard(this.Handle, mf))  MessageBox.Show("Скопировано в буффер!");
Reclaimer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Буфер обмена DolgoDoom Общие вопросы Delphi 6 30.05.2011 13:59
буфер обмена DeDoK Win Api 1 25.10.2010 19:08
Буфер обмена dmitriegorovih Общие вопросы Delphi 13 09.09.2010 12:54
буфер обмена olimpus Microsoft Office Excel 2 19.09.2009 08:52
буфер обмена __@cmd@__ Общие вопросы Delphi 2 04.02.2009 12:24