Чтение графики из Clipboard'a

Программирование на Visual Basic for Applications
Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Чтение графики из Clipboard'a

Сообщение Алик » 01.09.2006 (Пт) 13:30

Коллеги! маленький вопрос. Как мне достать картинку из буфера обмена на контрол в форме. Может быть есть какой нибудь контрол сторонних производителей или у кого есть класс...Благодарен! (VBA!!)

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Сообщение Димитрий » 01.09.2006 (Пт) 14:13

Если не заморачиватся с API, то можно использовать RichTextBox:

RichTextBox1.SetFocus
SendKeys "^м", True

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.09.2006 (Пт) 14:46

а есть ли в VBA CLipboard?

добавлено позже:

сие было ответом на посто, которого тут (выше) уже нет.

По теме:

автору стоит посмортреть в сторону метода GetFromClipboard и его родственников
Последний раз редактировалось Viper 01.09.2006 (Пт) 14:54, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 01.09.2006 (Пт) 14:47

!Viper! писал(а):а есть ли в VBA CLipboard?

нэт

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 01.09.2006 (Пт) 14:54

Код:
Clipboard.GetData(CF_BITMAP)
Можно подробнее как с этим работать в VBA?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.09.2006 (Пт) 14:55

Алик писал(а):Код:
Clipboard.GetData(CF_BITMAP)
Можно подробнее как с этим работать в VBA?


с этим - никак, смотри мой пост выше
Весь мир матрица, а мы в нем потоки байтов!

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 01.09.2006 (Пт) 14:57

Алик писал(а):Код:
Clipboard.GetData(CF_BITMAP)
Можно подробнее как с этим работать в VBA?

Я поторопился, проверил в VBA и удалил пост. По теме:
Код: Выделить всё
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" (ByVal wFormat As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Declare Function SetClipboardViewer Lib "user32" (ByVal hWnd As Long) As Long

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 01.09.2006 (Пт) 14:59

с этим - никак, смотри мой пост выше
вот и я об этом, библиотеку VB можно подключить , подключить olestd. но даже с этим нельзя работать. Может через API можно как то пересылая физическую память по hDC?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.09.2006 (Пт) 15:02

ты посты то читай, хоть иногда

добавлено

Метод Selection.Paste прекрасно вставляет все что есть в буфере обмена.
Последний раз редактировалось Viper 01.09.2006 (Пт) 15:06, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 01.09.2006 (Пт) 15:06

Код:
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" (ByVal wFormat As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Declare Function SetClipboardViewer Lib "user32" (ByVal hWnd As Long) As Long

по GetClipboardData я получу хендл блока памяти и как мне с этим работать дальше?

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 01.09.2006 (Пт) 15:13

Метод Selection.Paste прекрасно вставляет все что есть в буфере обмена.
Где в VBA этот метод?
По поводу "метода" GetFromClipboard объясни поподробнее плиз!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.09.2006 (Сб) 10:37

Поясняю. Пишешь в макросе строку

Код: Выделить всё
Selection.Paste


При выполнении эта команда вставит в текщую позицию содержимое буфера обмена. Если в буфере будет кртинка, то вставит картинку, если там будет строка, то строку. Насчет GetFromClipboard, то она работает со строками и тебе не подойдет.

З.Ы. И вот все это вышесказанное можно узнать в справке по VBA, введя строку поиска "Clipboard". посему возникает вопрос, почему автор вопроса не сделал это самостоятельно?
Весь мир матрица, а мы в нем потоки байтов!

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 03.09.2006 (Вс) 17:08

Автору,
Слушай, ты писал что хочешь, поместит на контроль этот рисунок.
может прямо его туда поместить, напр:
Код: Выделить всё
Me.CommandButton1.Picture = LoadPicture("c:...\AAA.bmp")

Me.Image1.Picture = LoadPicture("c:...\AAA.bmp")

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 04.09.2006 (Пн) 20:54

Viper! я пробовал это делать, мне нужно достать картинку и разместить её в графическом поле формы, все вставки из буфера заблокированы в любое поле кроме присоединенной рамки объекта, но когда я вставляю в рамку из буфера, на меня ругается интерпритатор о невозможности создать объект. В чем проблема?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.09.2006 (Вт) 7:07

Код в студию! Чем больше кода, тем больше шансов на ответ
Весь мир матрица, а мы в нем потоки байтов!

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 05.09.2006 (Вт) 11:23

На форме свободная рамка
указываем класс OLE "Paint.Picture"
далее по коду:

Me.OLE1.Class = "Paint.Picture"
Me.OLE1.Action = acOLEPaste
после этого говорится, что невозможно выполнить операцию вставки

может я неправильно определяю объект?

на форме создана рамка с именем OLE1 и все
по нажатию кнопки выполняются выше приведенный код
до этого принудительно из Paint'a в буфер копирую кусок рисунка

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.09.2006 (Вт) 11:40

А разместить на форме например Image и вставить в него картинку что мешает? Или нужно именно из буфера обмена?
Весь мир матрица, а мы в нем потоки байтов!

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 05.09.2006 (Вт) 12:44

Я понимаю, что можно и из файла, как человек из Тбилиси предлогал, но в том и собака зарылась, что мне нужен именно буфер обмена.

Я графические данные из другого приложения (присоединенные потоки) через Clip передаю.
В другом приложении что бы дров не ломать проще через буфер

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 05.09.2006 (Вт) 17:54

Вот состряпал, на скорую руку. (Надеюсь там нет больших ошибок и не вызову гнев GSerg-а :) )
Вложения
PasteBitmap_from ClipBoard.rar
(13.64 Кб) Скачиваний: 166

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 05.09.2006 (Вт) 20:17

Небольшие проблемы.... Dim IPic As IPictureDisp

На последней строчке кода выдает ошибку: не удается открыть файл и указывает хендл считанного растра из Clipa (hBitmap)

Как это уживается с тем, что в качестве источника рисунка назначается файл (путь) в контроле

Кстати у меня ACCESS, не знаешь случайно имя класса формы MSA?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.09.2006 (Вт) 21:16

А какая разница, какое оно? Ну изменится оно в следующем офисе, и чего?.. Ищите по заголовку. Заголовок в начале загрузки ставьте в cstr(rnd). В конце загрузки - обратно...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 06.09.2006 (Ср) 10:29

А какая разница, какое оно? Ну изменится оно в следующем офисе, и чего?.. Ищите по заголовку. Заголовок в начале загрузки ставьте в cstr(rnd). В конце загрузки - обратно...
Да,спасибо это работает на ура, но хотелось красоты.....и....знаний

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.09.2006 (Ср) 10:34

Ценность недокументированных знаний в данном конкретном случае невелика. Ибо MS тут никому ничего не должна, и будет спокойно менять имя класса как ей нравится...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Алик
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 24.08.2006 (Чт) 21:28

Сообщение Алик » 06.09.2006 (Ср) 11:13

Я задавал вопрос про чтение названий задач из панели задя Windows и в "кирпичах" по Вашему ответу (GSerg) скачал код приспособил его в VBA и сравниваю с названием соответствующего окна нужной мне задачи, что бы скрыть только его. Все работает, но как-то нестабильно, ьо все в поряде, то нет и заметил, что это зависит от добавления или удаления окон в панели задач, в чем может быть проблема?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 10

    TopList