Нет насчет прокрутки не канаетxolod писал(а):Ну и конечно, можно просто добавить возможность прокрутки в стандартный PictureBox, чтобы не заниматься всякого рода квадратными колесами
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 писал(а):Ну-ну... Волшебное средство от всех бед, BitBlt?
Возможно поможет перерисовка по таймеру, а не по маус муву.XairOn писал(а):Да, тем более что BitBlt в данном случае не канает, как заметил tyomitch.
Я вопрос в этом топике уже задавал, но все же попробую ещё раз: такая проблема - когда я изображение перетаскиваю (Image внутри PictureBox'а), то видно как это изображение перерисовывается (т.е. мерцает) как этого можно избежать?
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
'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
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
XairOn писал(а):KDima, таймер тоже не канает - каритнка мерцает и дергается ужасно
BitBlt pic1.hdc, 1, 1, 100, 100, pic2.hdc, 1, 1, 0
Рисует стильные чёрные квадраты
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
KDima писал(а):Спасибо за ответ по чёрным стильным квадратам.
Математика!
Берём пиксель и рисуем его как два/полтора
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27