Простейший примерчик вырезания рисунка из StdPicture

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Простейший примерчик вырезания рисунка из StdPicture

Сообщение Andrey Fedorov » 27.09.2010 (Пн) 20:04

Просьба подсказать простейший способ как из рисунка, находящегося в одном StdPicture, вырезать прямоугольную область в другой StdPicture...
В принципе сделал сам, но слишком сложно - уверен что можно значительно проще...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение alibek » 27.09.2010 (Пн) 21:25

Простейший — PaintPicture.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Andrey Fedorov » 27.09.2010 (Пн) 22:33

alibek писал(а):Простейший — PaintPicture.


Только вот у StdPicture такого метода нет...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 27.09.2010 (Пн) 23:59

IPictureDisp::Render?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Andrey Fedorov » 28.09.2010 (Вт) 0:09

Хакер писал(а):IPictureDisp::Render?


Пробовал, но что-то не получилось :( Возможно с hDC запутался - с графикой я крайне редко работаю...

Примерчик можно? На VB6 - вырезать из одного StdPicture и поместить в другой StdPicture...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 28.09.2010 (Вт) 0:17

Давай сначала разберёмся.

Есть встроенный в VB6 (и реализуемый непосредственно в msvbvm60) класс StdPicture.
А есть происходящий из COM (и не специфичный только для VB) интерфейс IPicture и его Dispatch-собрат IPictureDisp.
Про них можно сказать, что указанный класс поддерживает указанный интерфейс.

И теперь два вопроса:
1) Исходная картинка: это объект именно класса StdPicture или просто объект какого-то произвольного класса (в т.ч. и StdPicture), поддерживающий IPicture(Disp)?
2) Выходная картинка обязана быть именно объектом класса StdPicture, или объектом любого класса (в том числе StdPicture, но может быть даже своего!), поддерживающим IPicture(Disp)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Andrey Fedorov » 28.09.2010 (Вт) 11:06

Хакер писал(а):Давай сначала разберёмся.

И теперь два вопроса:
1) Исходная картинка: это объект именно класса StdPicture или просто объект какого-то произвольного класса (в т.ч. и StdPicture), поддерживающий IPicture(Disp)?
2) Выходная картинка обязана быть именно объектом класса StdPicture, или объектом любого класса (в том числе StdPicture, но может быть даже своего!), поддерживающим IPicture(Disp)?


1 и 2 - StdPicture.

В принципе вопрос можно снять - все одно реализовал на GDI+ - работает как надо...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 28.09.2010 (Вт) 19:08

Нет, не надо снимать вопрос :D Меня тоже это интересует. И чтобы без gdi+
Хакер писал(а):1) Исходная картинка: это объект именно класса StdPicture или просто объект какого-то произвольного класса (в т.ч. и StdPicture), поддерживающий IPicture(Disp)?
2) Выходная картинка обязана быть именно объектом класса StdPicture, или объектом любого класса (в том числе StdPicture, но может быть даже своего!), поддерживающим IPicture(Disp)?

1 А какие ещё объекты его поддерживают (из известных)?
2. Пусть произвольным... Пусть "даже своим" Как сделать этот "даже свой" объект? Как вообще пользоваться IPicture и что есть Disp?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 28.09.2010 (Вт) 22:12

arthur2 писал(а):1 А какие ещё объекты его поддерживают (из известных)?

Смысл (фишка) в создании таких своих.

arthur2 писал(а):Пусть "даже своим" Как сделать этот "даже свой" объект?

Создать свой класс, который реализует интерфейс IPicture(Disp).

arthur2 писал(а):и что есть Disp

Кусок имени интерфейса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 28.09.2010 (Вт) 22:24

Создаю класс, имплиментю IPicture... дальше куда?

Как-то пытался методом тыка рыть в этом направлении, но никуда не урыл :oops:
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 28.09.2010 (Вт) 22:26

дальше куда?

Всё, используешь объекты своего класса как объекты, поддерживающие IPicture(Disp).

Например так:
Код: Выделить всё
Set Me.Picture = New VeryNonStdPicture

где VeryNonStdPicture — твой класс, поддерживающий IPicture(Disp).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 28.09.2010 (Вт) 22:40

Ну толкни дальше! До этого места я вроде бы уже доходил.

Кстати, имплементить тоже не получается - бейсик не признает такого своего класса, выдавая обрывающееся на полуслове сообщение без номера ошибки:
Код: Выделить всё
Implements IPictureDisp

Ошибка компелляции:

Неверное взаимодействие для Реализаций: Взаимодействие содержит области данных<дальше ничего>
(только больно не пинай за "русский" бейсик - другого под рукой нету :(
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 28.09.2010 (Вт) 22:45

Родное определение интерфейса ты не реализуешь, там «As Any» в последнем параметре метода Render.

Надо свой определить, с тем же IID-ом, но с отличающимся определением.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 28.09.2010 (Вт) 22:48

О, кстати: IPicture дал симплиментить, хотя в подсказке его не появлялось...
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 28.09.2010 (Вт) 22:49

Хакер писал(а):Надо свой определить, с тем же IID-ом, но с отличающимся определением.
Как? Писать Тлб, в которой вместо эни объявить лонг?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 28.09.2010 (Вт) 22:54

arthur2 писал(а):Как? Писать Тлб, в которой вместо эни объявить лонг?

Да, только не Long, а что там, LPRECT?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 28.09.2010 (Вт) 23:01

IID-ы нашел, как написать- вроде, представляю... куда после этого - ума не прилажу - представляю на уровне каких-то смутных ощущений :oops:

Можно будет сделать, например, как-то так: Set Me.Image= New VeryNonStdPicture ?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 28.09.2010 (Вт) 23:53

куда после этого - ума не прилажу - представляю на уровне каких-то смутных ощущений :oops:

Ты должен реализовать все члены интерфейса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 29.09.2010 (Ср) 11:15

Пытаюсь написать тлб :)

Где взять определение типа VARIANT_BOOL? Пока заменил на лонг - тлб скомпилировалась.

Проект с имплиментированным моим IPicture выдает ошибку
Неверное взаимодействие для Реализаций: способ имеет только выходной LCID параметр
Что это? Какой из способов - не уточняется :oops:
Артур
 
   

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

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Viper » 29.09.2010 (Ср) 17:40

Код: Выделить всё
typedef short VARIANT_BOOL;
То есть не Long, а Integer.
Код: Выделить всё
VARIANT_TRUE = 0xFFFF;
VARIANT_FALSE = 0x0000;
Весь мир матрица, а мы в нем потоки байтов!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 29.09.2010 (Ср) 18:14

VARIANT_BOOL оказался шотом :)
От ошибки избавился, поменяв в определениях нескольких параметров [out] на [in,out]. Тлб скомпилировалась, интерфейс заимплиментился :)

Set Me.Picture = New VeryNonStdPicture дает несоответствие типа :?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 30.09.2010 (Чт) 20:45

Что не так?

Тлб вроде бы получилась. Вот это работает:
Код: Выделить всё
Dim p As myTlb.IPicture
Set p = Me.Picture

Что-нибудь вроде set pic1.picture=p тоже работает и картинка переносится. Значит, вроде бы, тлб получилась правильной и интерфейс рабочим.

Я создал класс cMyPic и в нем сделал Implements myTlb.IPicture, реализовал всё, что там высыпалось :)

Почему тогда
Код: Выделить всё
Dim c As cMyPic
Set c = p
дает несоответствие типа?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 6:04

Значит неправильная реализация.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 13:26

В cMyPic: Implements myTlb.IPicture и все его методы

Код: Выделить всё
Dim p As myTlb.IPicture
Set p = New cMyPic
Работает. Можно подергать свойства p.ляляля - и код в cMyPic откликается.

Код: Выделить всё
Dim p As myTlb.IPicture
Set p = Me.Picture
Set pic1.Picture = p
Тоже работает. Картинка загружается.

А вот так:
Код: Выделить всё
Dim p As myTlb.IPicture
Set p = New cMyPic
Set pic1.Picture = p
уже не работает.
Реализация неправильная - это понятно, но почему тогда первый и второй вариант работают?

И как сделать правильную реализацию?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 13:32

arthur2 писал(а):о почему тогда первый и второй вариант работают?

  1. Потому что свойства можно дёргать в любом случае в общем порядке. Потому что реализация будет откликаться, даже если она неправильная.
  2. Потому что класс StdPicture реализует интерфейс IPicture, а твой класс (с неправильной реализацией) здесь вообще никак не участвует.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 14:41

Хакер писал(а):Потому что класс StdPicture реализует интерфейс IPicture, а твой класс (с неправильной реализацией) здесь вообще никак не участвует.

Но ведь этот IPicture берется из моей тлб. Значит, интерфейс правильный?

Как тогда может быть неправильная реализация у правильного интерфейса?

В первом примере меня удивляет не то, что свойства откликаются (это действительно понятно), а то, что в классе реализован тот же самый IPicture из моей тлб, который нормально срабатывает во втором примере.

И, кстати, дабы не путало, stdole2 я из референцев отключил. Так что откуда берется StdPicture, мне вообще не понятно

И как же все-таки сделать правильную реализацию?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 14:59

Как тогда может быть неправильная реализация у правильного интерфейса?


Элементартно:

Код: Выделить всё
Private Sub IPicture_Render(...)
     ' Пишем тут всякую чушь
End Sub


arthur2 писал(а):Так что откуда берется StdPicture, мне вообще не понятно

Ну и что, это встроенный в VB класс.

И как же все-таки сделать правильную реализацию?И как же все-таки сделать правильную реализацию?

Почитай в MSDN секцию «How to implement» (или «When to implement»).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 16:43

Еще раз по порядку:
Раз картинки через IPicture из моей тлб загружаются, это означает, что интерфейс (в тлб) правильный? Или не обязательно? Проблема в тлб? Или в том, как я реализую интерфейс уже в проекте?

Хакер писал(а):
Код: Выделить всё
Private Sub IPicture_Render(...)
     ' Пишем тут всякую чушь
End Sub
Выходит, если написать не чушь, то всё заработает? Я почему-то думал, что даже если вообще ничего не писать, оставив все методы пустыми, то при условии, что интерфейс "тот самый" - со всеми методами и с правильным идентификатором - по меньшей мере само присвоение должно получиться.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 01.10.2010 (Пт) 17:20

Раз картинки через IPicture из моей тлб загружаются,

Чё? Где такое?

Выходит, если написать не чушь, то всё заработает? Я почему-то думал, что даже если вообще ничего не писать, оставив все методы пустыми, то при условии, что интерфейс "тот самый" - со всеми методами и с правильным идентификатором - по меньшей мере само присвоение должно получиться.

Это глубочайшее (я даже не в состоянии передать степень) заблуждение. К тому же, нет никакого присвоения вообще. Есть Set-хендлер, а что в нём — угадай сам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 01.10.2010 (Пт) 17:45

Хакер писал(а):Чё? Где такое?

Хакер писал(а):Есть Set-хендлер, а что в нём — угадай сам.
Код: Выделить всё
Dim p As myTlb.IPicture
Set p = LoadPicture("test.bmp")
Set Me.Picture = p

Артур писал(а):картинки через IPicture из моей тлб загружаются
Или всё равно нет?
Артур
 
   

След.

Вернуться в Visual Basic 1–6

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

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

    TopList