Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение изображения из буфера обмена, MS Word 
:(
    Опции темы
MFSham
Дата 6.5.2007, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



Имеется такой код:
Код

Word.Document Doc = MSWord.Documents.Open(...);
Image img;
...

try
{
     WordCell.Range.CopyAsPicture();    // копирует ячейку таблицы как изображение в буффер обмена
     if (Clipboard.ContainsImage())         // проверяет буффер на содержание изображения
         img = Clipboard.GetImage();
}
catch
{  ...  }         

Не понимаю почему, но метод Clipboard.ContainsImage() возвращает всегда false, хотя изображение в буффере имеется(проверял в пошаговом режиме). Пробовал подставлять на проверку вместо изображения другие объекты, но результат тот же.

Кто-нибудь знает почему?

--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
mr.DUDA
Дата 6.5.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



После копирования в клипборде что угодно но только не картинка. Например есть EnhancedMetafile и MetaFilePict. Лично у меня не получилось зачитать первое, а второе было MemoryStream-ом, из которого не создаётся Image.


--------------------
user posted image
PM MAIL WWW   Вверх
MFSham
Дата 6.5.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: нет
Всего: 3



У меня получилось реализовать то что я хотел. 
Может кому пригодится:
Код

using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class ClipboardMetafileHelper
{
    [DllImport("user32.dll")]
    static public extern bool OpenClipboard(IntPtr hWndNewOwner);        
    [DllImport("user32.dll")]        
    static public extern bool CloseClipboard();                
    [DllImport("user32.dll")]
    static public extern short IsClipboardFormatAvailable(uint uFormat);
    [DllImport("user32.dll")]
    static public extern IntPtr GetClipboardData(uint uFormat);                
}

private void btnDrawImage_Click(object sender, EventArgs e)
{
   Word.Application MSWord = new Word.Application();
   const int CF_ENHMETAFILE =14;                                
   IntPtr henmetafile;                                                                    
   Metafile metaFile;

   try
   {
       Word.Document Doc = MSWord.Documents.Open(...);
       ...
       WordCell.Range.CopyAsPicture();

       if (ClipboardMetafileHelper.OpenClipboard(this.Handle))      // используем вспомогательный класс
       {
           if (ClipboardMetafileHelper.IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0)
           {
               henmetafile = ClipboardMetafileHelper.GetClipboardData(CF_ENHMETAFILE);    
               metaFile = new Metafile(henmetafile, true);
               ClipboardMetafileHelper.CloseClipboard();
               pictureBox1.Image = new Bitmap(metaFile);
               pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
           }                                    
        }
   }
   catch   { ... }
}

Основную инфу брал отсюда.

Как видно, не обошлось без WinAPI, но тем не менее результат достигнут. Ура! smile  smile 
Картинка, правда, по размерам очень большая получается, хотя на самом дела не такая уж и большая. А когда размер уменьшаешь, качество изображения ухудшается, что не есть хорошо.

Я так и не понял различия между методами WordCell.Range.CopyAsPicture() и WordCell.Range.Copy(). Может в Clipboard оно как-то по особому передается, но я разницы абсолютно никакой не заметил.

И все-таки оно работает  smile 
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
stab
Дата 7.5.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



вся эта химия с win api нужна из-за того, что дотнетовский Clipboard использует олешный\комовский способ доступа к буферу обмена. в этом вся беда. зачем так сделали? неясно.  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1126 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.