Не могу подобрать свойство к PictureBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Не могу подобрать свойство к PictureBox

Сообщение XairOn » 24.12.2004 (Пт) 13:40

Здравствуйте, у меня возникла такая проблема: есть изображение в PictureBox'е, но оно большое и всё не помещается, я хочу, что бы пользователь мог сам перетаскивать это изображение внутри PictureBox'а, а как это сделать я понять не могу, сначала думал менять своиства Top\Left, но они весь PictureBox перемещают, а мне нужно менять только координаты изображения внутри PictureBox'а. Как это можно сделать?

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

Сообщение alibek » 24.12.2004 (Пт) 13:51

Изображение выводишь на Image, который размещен внутри PictureBox. И двигаешь Image.
Или же используешь скрытый Image (в качестве источника изображения), а в PictureBox используешь PaintPicture.
Lasciate ogni speranza, voi ch'entrate.

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 24.12.2004 (Пт) 16:32

Спасибо, оба способа канают, но есть одно "НО" — когда начинаешь перетаскивать картинку, получается не очень красивый эффект, а именно - левый верхний угол Image1 помещенного в PictureBox и содержащего картинку переносится в координаты курсора мыши, а нужно, что бы Image1 перемещался именно из той точки, из которой его начал перемещать пользователь. Как этого добиться?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.12.2004 (Пт) 16:40

При _MouseDown на Image1 сохраняй точку, куда ткнули. При _MouseMove вычитай её координаты из координат мыши.
Изображение

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 24.12.2004 (Пт) 17:22

Ну и конечно, можно просто добавить возможность прокрутки в стандартный PictureBox, чтобы не заниматься всякого рода квадратными колесами :wink:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 24.12.2004 (Пт) 21:45

xolod писал(а):Ну и конечно, можно просто добавить возможность прокрутки в стандартный PictureBox, чтобы не заниматься всякого рода квадратными колесами :wink:
Нет насчет прокрутки не канает :-(

И тут ещё одна проблемка возникла - когда я изображение перетаскиваю внутри PictureBox'а оно как бы мерцает т.е. видно как изображение перерисовывается, как этого избежать???

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 24.12.2004 (Пт) 22:45

XairOn тебе поможет:

BitBlt


Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

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

Параметры:

hDestDC: Идентификатор контекста устройства приемника
x,y: координаты левого верхнего угла прямоугольника назначения.
nWidth, nHeight: Ширина и высота прямоугольника назначения и исходного битового образца.
hSrcDC: Идентификатор контекста устройства источника.
xSrc, ySrc: Координаты левого верхнего угла исходного битового образа.
dwRop: Код операции. Допустимые значения:

VbDstInvert - Инвертирует цвет в контексте приемника.

VbMergeCopy - Цвет полученного изображения определяется при помощи операции And над исходным цветом и цветом шаблона.
VbMergePaint - Цвет полученного изображения определяется при помощи операции Or над исходным цветом и цветом шаблона.
VbNotSrcCopy - Инвертируемое исходное изображение копируется в контекст приемника.

VbNotSrcErase - Инвертирует изображение, получаемое при помощи операции Or над исходным цветом и цветом в точке назначения.

VbPatCopy - Шаблон копируется в контекст приемника.

VbPatInvert - Цвет полученного изображения определяется при помощи операции Xor над цветом в точке назначения и цветом шаблона.

VbPatPaint - Цвет полученного изображения определяется при помощи операции Or над инвертированным цветом изображения и шаблоном.

VbSrcAnd - Цвет полученного изображения определяется при помощи операции Or над исходным цветом и цветом в точке назначения.
VbSrcErase - Цвет полученного изображения определяется при помощи операции And над исходным цветом и инвертированным цветом в точке назначения.

VbSrcInvert - Цвет полученного изображения определяется при помощи операции Xor над исходным цветом и цветом в точке назначения.

VbSrcPaint - Цвет полученного изображения определяется при помощи операции Or над исходным цветом и цветом в точке назначения.


А.Ю. Гарнаев, 2000
Visual Basic 6.0: Разработка приложений

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.12.2004 (Пт) 23:29

Ну-ну... Волшебное средство от всех бед, BitBlt?
Изображение

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 25.12.2004 (Сб) 20:55

tyomitch писал(а):Ну-ну... Волшебное средство от всех бед, BitBlt?
А что, нет?!

Быстрее только DirectX BltFast
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.12.2004 (Сб) 21:00

Я не спорю, что своё назначение - копирование прямоугольных областей - BitBlt делает быстро. Я спорю, что он здесь применим.
Изображение

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 26.12.2004 (Вс) 16:37

Непонял! В чём проблема? :wink:
:arrow: По маус дауну мы запоминаем каорды
:arrow: по маус муву вычисляем, что скопировать
:arrow: BitBlt
:arrow: по маус ап отстаём от пользователя :)
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.12.2004 (Вс) 18:04

Проблемы нет... И с Image внутри PictureBox проблемы тоже нет. Зачем BitBlt-то? ;-)
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 26.12.2004 (Вс) 20:03

Да, тем более что BitBlt в данном случае не канает, как заметил tyomitch.

Я вопрос в этом топике уже задавал, но все же попробую ещё раз: такая проблема - когда я изображение перетаскиваю (Image внутри PictureBox'а), то видно как это изображение перерисовывается (т.е. мерцает) как этого можно избежать?

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 26.12.2004 (Вс) 20:09

XairOn писал(а):Да, тем более что BitBlt в данном случае не канает, как заметил tyomitch.

Я вопрос в этом топике уже задавал, но все же попробую ещё раз: такая проблема - когда я изображение перетаскиваю (Image внутри PictureBox'а), то видно как это изображение перерисовывается (т.е. мерцает) как этого можно избежать?
Возможно поможет перерисовка по таймеру, а не по маус муву.
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 26.12.2004 (Вс) 23:13

Возможно поможет перерисовка по таймеру, а не по маус муву.


Интересно, а это ещё как???

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 26.12.2004 (Вс) 23:38

Легко!
По маус муву мы определяем вектор смещения.
А по таймеру два раза в секунду перемещяем на вектор имагу (блитим из нужного места)
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 27.12.2004 (Пн) 2:15

Вот и у меня была такая же проблема, карта не помещалась на экран, тока я ее вот так решил:
Код: Выделить всё
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Private Sub picMap_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim lngReturnValue As Long
    If Button = 1 Then
        Call ReleaseCapture
        lngReturnValue = SendMessage(PicMap.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
End Sub
الفيجوال بيسك الرابح

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 27.12.2004 (Пн) 11:26

GM API-Guide рулит :-)
Отсюда вытекает другой вопрос, мне нужно, что бы картинка которую перетаскивает пользователь внутри PictureBox'а всегда польностью закрывала его, а то не красиво получается т.е. если например пользователь тащит картинку и координата её левого верхнего угла стала равна нулю (т.е. при дальнейшем перемещении виден PictureBox внутри которого это происходит) нужно запретить пользователю тащить её дальше. Вобщем взгляние на код и подскажите как сделать так, что бы картинка всегда полностью закрывала PictureBox:
Код: Выделить всё
'Picture2 должен находиться внутри Picture1
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam

As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Private Sub Picture2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim lngReturnValue As Long
    If (Button = 1) And (f = True) Then
        Call ReleaseCapture
        lngReturnValue = SendMessage(Picture2.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
End Sub

Function f() As Boolean
f = True
If Picture2.Left + 15 >= 0 Then
Picture2.Left = -30
f = False
End If
If Picture2.Width - Abs(Picture2.Left + 15) <= Picture1.Width Then
Picture2.Left = Picture2.Left + 30
f = False
End If
If Picture2.Top + 15 >= 0 Then
Picture2.Top = -30
f = False
End If
If Picture2.Height - Abs(Picture2.Top + 15) <= Picture1.Height Then
Picture2.Top = Picture2.Top + 30
f = False
End If
End Function


Спасибо!!!

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 27.12.2004 (Пн) 16:33

KDima, таймер тоже не канает - каритнка мерцает и дергается ужасно :-(

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 27.12.2004 (Пн) 21:44

Дык а вот такой тупой метод:
Private Sub picMap_MouseMove(Button As Integer,
Shift As Integer, X As Single, Y As Single)
static isdrag as boolean
Dim lngReturnValue As Long
If Button = 1 Then
Call ReleaseCapture
lngReturnValue = SendMessage(PicMap.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
isdrag = true
else
if isdrag then
isdrag = false
restoreit
end if
End If

End Sub
[/code]
RestoreIt проверяtn все что нужно и возращает в угол.
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 27.12.2004 (Пн) 21:56

Вот и RestoreIt накатал:
Код: Выделить всё
Private Sub RestoreIt()
If picMap.Left < 0 Then picMap.Left = 0
If picMap.Top < 0 Then picMap.Top = 0
If picMap.Left > PicContainer.Width - picMap.Width Then picMap.Left = PicContainer.Width - picMap.Width
If picMap.Top > PicContainer.Height - picMap.Height Then picMap.Top = PicContainer.Height - picMap.Height
End Sub
الفيجوال بيسك الرابح

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 27.12.2004 (Пн) 22:00

XairOn писал(а):KDima, таймер тоже не канает - каритнка мерцает и дергается ужасно :-(


Я уже тестанул :)
Вердикт - ужас!


Попытался написать с BitBlt'ём....
Нефига!
У меня есть Пикчуры pic1 И pic2

Код: Выделить всё
BitBlt pic1.hdc, 1, 1, 100, 100, pic2.hdc, 1, 1, 0


Рисует стильные чёрные квадраты :)
Помогите! Что я делаю неправильно?

З.Ы. На мой мозг сказалась долгая работа с DirectX :)
З.Ы.Ы. Почему ничего нельзя закачать на форум?
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 28.12.2004 (Вт) 9:13

Рисует стильные чёрные квадраты


Так а нолик зачем в конец дописал, там константа нужна правильная, для копирования так вот будет:
Код: Выделить всё
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Const SRCCOPY = &HCC0020

Private Sub Pic1_Click()
BitBlt Pic1.hDC, 1, 1, 100, 100, Pic2.hDC, 1, 1, SRCCOPY
End Sub

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 28.12.2004 (Вт) 9:18

GM, я может чего-то не понимаю, вот сейчас например не могу понять чем твой код от моего отличается? Я нашел всего одно отличие, это то, что после того как каритнка перемещена и пользователь отпускает кнопку мыши картинка перемещается в правый нижний угол - а зачем??? Понимаешь, я хочу что бы пользователь вообще не мог перетащить картинку за пределы контейнера содержащего её? И что в моем, что в твоем коде этот глюк присутствует!

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 28.12.2004 (Вт) 21:57

Возникла ещё одна проблемка: как увеличить изображение находящееся в PictureBox'е? Width и Height увеличивают сам PictureBox, а изображение находящееся в нем не меняется! В данном случае Image не канает и функции типа PaintPicture, BitBlt, StretchBlt тоже не годятся. Надо его как-то по-другому растянуть.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.12.2004 (Вт) 22:02

Picture1.PaintPicture(...)

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 28.12.2004 (Вт) 22:07

Математика!
Берём пиксель и рисуем его как два/полтора :)

Спасибо за ответ по чёрным стильным квадратам.
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 28.12.2004 (Вт) 22:23

KDima писал(а):Спасибо за ответ по чёрным стильным квадратам.

Всегда пожалуйста.

Математика!
Берём пиксель и рисуем его как два/полтора

А это как, простите!

KDima
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 759
Зарегистрирован: 14.07.2004 (Ср) 23:14
Откуда: СПб

Сообщение KDima » 28.12.2004 (Вт) 23:01

Хех! Опять рисует чёрный квадрат!!!
Хороший прогер не тот, кто всё знает, хороший прогер знает, где найти знание.

Последний раз редактировалось: Administrator (15.07.2004 (Вт) 00:01), всего редактировалось 999 раз(а)

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 29.12.2004 (Ср) 4:20

KDima, вот-вот.

След.

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

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

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

    TopList