CompatibleDC и BitBlt

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

CompatibleDC и BitBlt

Сообщение ANDLL » 16.01.2004 (Пт) 11:17

Здравствуйте!

Вот такая задача:
На форме есть Picture1(PictureBox). Его AutoRedraw=False(обязательно!), ScaleMode=vbPixel

Далее идет код:

Код: Выделить всё
If hCopyDC <> 0 Then DeleteDC hCopyDC
hCopyDC = CreateCompatibleDC(Picture1.hdc)
BitBlt hCopyDC, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hdc, 0, 0, vbSrcCopy


Этот код ресует чего-то в PictureBox'е, а затем сохраняет его содержимое в CompatibleDC. Потом, когда надо, я снова копирую изображение с этого DC на picturebox.
И ничего не выходит!
BitBlt возвращает всегла 1, а PictureBox остается пустым
Подскажите, где ошибка.

Или хотябы дайте исходник, который сохранял бы изображение PictureBox в ОЗУ, а потом снова загружал его, когда потребуется.

Заранее спасибо.

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

Сообщение xolod » 16.01.2004 (Пт) 13:16

Намудрил ты чего-то :shock:

Вот примерчик небольшой:

Private Declare Function SaveDC Lib "gdi32" Alias "SaveDC" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" Alias "CreateCompatibleBitmap" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function SetPixel Lib "gdi32" Alias "SetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Declare 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
Private Declare Function RestoreDC Lib "gdi32" Alias "RestoreDC" (ByVal hdc As Long, ByVal nSavedDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" Alias "DeleteDC" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal hObject As Long) As Long

Private Const SRCCOPY = &HCC0020


Public Sub DRAW_PROC()

' Помести на форму рамку с изображением, назови ее Pic
' Сохраним DC для последующего восстановления
dim hDCPic as Long
hDCPic = SaveDC(Pic.hdc)

'Создаем DC памяти (совместимый естевственно)
dim dcComp as Long
dcComp = CreateCompatibleDC(Pic.hdc)

Dim wip as Long
Dim hip as Long

wip = pic.Width / Screen.TwipsPerPixelX
hip = pic.Height / Screen.TwipsPerPixelY

'Создаем растровое изображение
Dim hBitmap as Long
Dim lDummy as long
hBitmap = CreateCompatibleBitmap(Pic.hdc, wip, hip)
lDummy = SelectObject(dcComp, hBitmap)

'Выбираем случайный цвет пиксела между 0 и 2^24 - 1
Dim r as Long, c as Long, l as Long
Randomize Timer
For r = 0 to wip - 1
For c = 0 to hip - 1
l = Rnd * (2 ^ 24 -1)
SetPixel dcComp, r, c, l
Next c
Next r

BitBlt Pic.hdc, 0, 0, wip, hip, dcComp, 0, 0, SRCCOPY

RestoreDC Pic.hdc, hDCPic
DeleteDC dcComp
DeleteObject hBitmap

End Sub

'*************************************
'Пример создает "образ" pic в памяти, разрисовывает его разными цветами и восстанавливает на pic. Должно охватить все твои потребности

ЗЫ: А вообще тебе на www.msdn.com в раздел GDI/GDI+

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

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 16.01.2004 (Пт) 14:00

>Или хотябы дайте исходник, который сохранял бы изображение PictureBox в ОЗУ, а потом снова загружал его, когда потребуется.

Нате, держите.
Код: Выделить всё
Dim p As StdPicture
Set p = Picture1.Picture
' делаем что нужно ...
Picture1.Picture = p

А вместо всякого блиттинга я бы рекомендовал метод PaintPicture.

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

Сообщение xolod » 16.01.2004 (Пт) 14:07

StdPicture ?
Можно и так.. Но VB и так иягко говоря не быстр, а использую встроенные средства мы замедляем его еще больше..

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

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.01.2004 (Пт) 18:10

___СПАСИБО___


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 19

    TopList