Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получение из клипбоарда вордовой картинки

10K
01 июня 2006 года
dzeaman
14 / / 17.10.2005
Имеется ворд-документ с картинкой. После ShapeRange.Select() картинка попадает в буфер обмена. Задача: шарпом считать это дело оттуда.

Стандартный дотнетовский Clipboard такую ботву не видит. Clipboard.ContainsData(DataFormats.EnhancedMetafile) возвращает false, равно как и все другие форматы. Естественно, GetData и GetDataObject тоже молчат.

Микрософт говорит что-то типа того, что у дотнета какой-то свой, особенный формат клипбоарда, не совместимый в частности с вордом. Отлично, лезем в user32.dll.

Экстерн IsClipboardFormatAvailable(14) /* CF_ENHMETAFILE = 14 */ возвращает - о чудо! - true. Однако, GetClipboardData(14) - нуль-поинтер.

Наконец, обнаружился код апишника на С++, который такой метафайл из буфера читает, и даже выводит картинку на экран. Пялился на код часа два - так и не понял, в чем принципиальное отличие использования апишных методов.

Мучусь - уже замучился =)
Поможите кто чем можете...

Заранее благодарен
273
04 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
Значит, я сделал так:
Открыл MS Word. Засунул туда специальной вставкой JPG фотку. Далее написал Windows Forms приложение, разместил туда PictureBox pictureBox1 и кнопульку Button pasteButton. В обработчике кнопки написал:
 
Код:
private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = Clipboard.GetImage();
        }

Далее сохраняю документа ворда (для пущей уверенности, что подвоха нет). Открываю, выделяю фотку, нажимаю Ctrl+C. Запускаю своё приложение и картинка без проблем вставляется в PictureBox. Пробовал потом и bmp, и gif засунуть, даже Windows Meta File засовывал, всё вставляет. Писал на .NET Framework 2.0. Если не веришь, могу выслать исходник и ворд-документ с картинкой.
10K
05 июня 2006 года
dzeaman
14 / / 17.10.2005
Особенно насчет метафайла...
Если никаких особенностей кода нет и присутствуют только пикчербокс и кнопка с одним событием - извините, я не настолько туп, чтоб такой код просить ;)
А вот вордовый документ интересен... Фишка в том, что у меня при копировании методом Ctrl+C в ворде в буфер попадает EnhancedMetafile. Так что GetImage возвращает null хоть убей...

Кстати.
Я сделал открытие, что клипбоард просто недоступен (читать: нулевой), если в проекте нет формы (например, в самом обычном таком классе). Видимо, клипбоарду позарез нужен хендл на форму. Так что я уже научился доходить до такого:
<Immediate Window>
Clipboard.ContainsData(DataFormats.EnhancedMetafile)
true
Правда, после этого неизменно идет:
Clipboard.GetData(DataFormats.EnhancedMetafile)
null

Не веришь - могу выслать исходник и ворд-документ с картинкой ;)
273
05 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
[quote=dzeaman]Особенно насчет метафайла...
Если никаких особенностей кода нет и присутствуют только пикчербокс и кнопка с одним событием - извините, я не настолько туп, чтоб такой код просить ;)
[/quote]
Да никто и не говорит, что ты тупой.
[QUOTE=dzeman]
Не веришь - могу выслать исходник и ворд-документ с картинкой ;)
[/QUOTE]
Давай ворд-документ с картинкой.
10K
05 июня 2006 года
dzeaman
14 / / 17.10.2005
Не EnhancedMetafile, а MetafilePict - и все работает.

Однако, в классе клипбоард все равно какой-то недоступный, и что с этим делать - непонятно. Особенно если учесть, что метод класса запускается отдельным потоком в другом проекте, так что даже метод главной формы, который бы получал изображение из клипбоарда, не вызвать из-за кросс-референса...

Ладно, это уже лирика... Будем думать...
Спасибо за уделенное время...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог