Скролл картинки

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Скролл картинки

Сообщение Fencer » 18.08.2005 (Чт) 10:11

У меня такая проблема: я загрузил в PictureBox картинку функцией BitBlt, но Пикчур остаётся такого же размера, какой я задал, а картинка больше его (хотя Autosize стоит true). Как можно привязать к Пикчуру scrollbars, или сделать так: жмешь на картинку, удерживая кнопку мыши, и, перемещая курсор, тащишь им картинку (внутри pictureBox'a) Надеюсь, я понятно изложил проблему :oops:
Заранее Большое Спасибо.
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 18.08.2005 (Чт) 10:18

Autosize будет работать, только если ты туда картинку загрузишь VB-шными методами самого пикчура, а именно LoadPicture(). Иначе, перед тем как блиттить, предварительно меняй размер пикчура, чтобы все влезло.

А вообще, странный ты: у тебя в подписи - ответ на все вопросы...

Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Сообщение Fencer » 19.09.2005 (Пн) 14:04

Всё-таки хотелось бы узнать, как можно сделать скролл картинки. К примеру, если в PictureBox'е картинка, выходящая за его пределы, то нажав и удерживая кнопку мыши, можно скроллировать картинку перетаскиванием. Сразу скажу - искал Гуглом и по форуму, пытался сделать сам, но - не выходит... :?
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)

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

Сообщение tyomitch » 19.09.2005 (Пн) 16:13

Чесслово, сам на этот форум уже не раз кидал этот код... И GSerg кидал... И мы ещё спорили, чей лучше ;-)
"Ищите, да обрящете" (с)
Изображение

Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Сообщение Fencer » 20.09.2005 (Вт) 11:44

tyomitch писал(а):Чесслово, сам на этот форум уже не раз кидал этот код... И GSerg кидал... И мы ещё спорили, чей лучше ;-)

Когда я искал по форуму, не нашёл ничего стоящего. А когда ввёл в поле "Автор" GSerg, а в поле "Что искать" picture, нашёл ваш спор почти сразу же... Мистика, однако :lol:
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)

Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Сообщение Fencer » 20.09.2005 (Вт) 11:51

боюсь, мы не совсем поняли друг друга :)
Вы писали способы, как таскать сам PictureBox, а мне надо, чтобы Picture был неподвижен, но картинка внутри него таскалась мышой... Это в том случае, если она (картинка, а не мышь :) ) выходит за пределы Пикчура.[/i]
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)

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

Сообщение tyomitch » 20.09.2005 (Вт) 18:50

Ок. Picture1 - видимый (в нём скроллинг), Picture2 - невидимый (в нём картинка целиком).

Код: Выделить всё
Option Explicit
Dim sx As Single, sy As Single
Dim dx As Single, dy As Single

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If (Button And vbLeftButton) Then dx = X - sx: dy = Y - sy
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If (Button And vbLeftButton) Then sx = X - dx: sy = Y - dy: Picture1.Refresh
End Sub

Private Sub Picture1_Paint()
    Picture1.PaintPicture Picture2, sx, sy
End Sub
Изображение

Sur
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 91
Зарегистрирован: 14.07.2003 (Пн) 20:54
Откуда: C2H5OH

Сообщение Sur » 21.09.2005 (Ср) 20:19

Я понимаю, что для новичков, но такое..... :shock:

Код: Выделить всё
Option Explicit
Private Const SRCCOPY = &HCC0020
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

Private CurX As Single
Private CurY As Single
Private OffsetX As Single
Private OffsetY As Single
Private xmin As Single
Private ymin As Single
Private Dragging As Boolean

Private Sub Form_Load()
'Picture1 - пустая рамка, Picture2 - наша картинка
Me.ScaleMode = vbPixels: Picture1.ScaleMode = vbPixels: Picture2.ScaleMode = vbPixels
Picture1.AutoRedraw = True: Picture1.AutoSize = False
Picture2.AutoRedraw = True: Picture2.AutoSize = False
xmin = Picture1.Width - Picture2.Width
ymin = Picture1.Height - Picture2.Height
CurX = 0
CurY = 0
DrawPicture
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Dragging = True
OffsetX = CurX - x
OffsetY = CurY - y
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
If Not Dragging Then Exit Sub
If Picture2.Width > Picture1.Width Then CurX = x + OffsetX
If Picture2.Height > Picture1.Height Then CurY = y + OffsetY
If CurX > 0 Then CurX = 0
If CurY > 0 Then CurY = 0
If CurX < xmin Then If xmin < 0 Then CurX = xmin
If CurY < ymin Then If ymin < 0 Then CurY = ymin
DrawPicture
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Dragging = False
End Sub

Private Sub DrawPicture()
BitBlt Picture1.hDC, CurX, CurY, Picture2.Width, Picture2.Height, Picture2.hDC, 0, 0, SRCCOPY
Picture1.Refresh
End Sub

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

Сообщение tyomitch » 21.09.2005 (Ср) 21:05

Sur писал(а):Я понимаю, что для новичков, но такое..... :shock:

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

Ну и в чём улучшения, кроме замены PaintPicture на BitBlt?
Изображение

Sur
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 91
Зарегистрирован: 14.07.2003 (Пн) 20:54
Откуда: C2H5OH

Сообщение Sur » 21.09.2005 (Ср) 21:47

Дергается очень.

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

Сообщение tyomitch » 21.09.2005 (Ср) 22:54

Sur писал(а):Дергается очень.

Хорошенькое улучшение :-?
Изображение

Al Khamid
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 274
Зарегистрирован: 11.02.2004 (Ср) 10:00
Откуда: Москва, Ховрино

Сообщение Al Khamid » 22.09.2005 (Чт) 8:48

Последний раз редактировалось Al Khamid 27.11.2007 (Вт) 0:53, всего редактировалось 1 раз.

Sur
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 91
Зарегистрирован: 14.07.2003 (Пн) 20:54
Откуда: C2H5OH

Сообщение Sur » 22.09.2005 (Чт) 11:35

tyomitch
ну твой пример у меня дергается. Может свойство какое я не выставил?

Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Сообщение Fencer » 22.09.2005 (Чт) 14:23

Sur писал(а):Я понимаю, что для новичков, но такое..... :shock:

Да ладно тебе... Я, например, не знал о том, что есть такой зверь - PaintPicture. Да-да, не знал :oops: :oops: :oops: . Вот теперь знаю :wink: . В конце концов, все же были когда-то "чайниками"
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)

Fencer
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 01.06.2005 (Ср) 16:19
Откуда: Новосибирск

Сообщение Fencer » 22.09.2005 (Чт) 14:26

Большое Спасибо вам, люди. Всё работает как надо, и Sur'овский код, и Тёмыча. :)
Искал Гуглом и Яндексом.
Искал по форуму.
Спрашивал соседа.
Пытался сделать сам.
Спасибо за помощь ;)


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

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

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

    TopList