Мы попробуем перенести картинку при помощи GDI. Механизм переноса совершенно одинаков, так как GDI представлено в виде API функций. В минимальном виде.
LoadImage (VB небольшие отличия) CreateCompatibleDC SelectObject BitBlt
Загружаем картинку из ресурсов и получаем указатель на нее. Создаем совместимый контекст устройства, выбираем в этот контекст картинку и используем функцию BitBlt для переноса изображения. Мы создадим функцию ImageToSurface, в которую будем передавать ссылку на поверхность и идентификатор ресурса, в котором находится картинка.
Visual Basic Нам необходимо добавить описание функций и констант Win32 API.
Создаем функцию и пишем код. Но есть одна маленькая мелочь. На форме нам нужно завести объект Picture и сделать его невидимым.
Ну а теперь пишем сам код.
Все примеры, которые я встречал, использовали BMP файлы отдельные, а не в ресурсах. Честное слово, я потратил почти 5 часов, чтобы дойти вот до этой строчки.
Зачитываем картинку в объект Picture из ресурсов и потом можем использовать свойство Picture для выбора в контексте устройства. Вызовем мы эту функцию в момент очистки внутри ClearSurfSecond. Если мы можем сразу положить картинку, зачем мучаться, стирать, тратить время.
Можно сразу при запуске вызвать Flip, что бы картинка была видна.
Visual C++
Visual Basic
'WIN32 API SECTION
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 Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Const LR_CREATEDIBSECTION = 8192
Private Const LR_SHARED = &H8000
Private Const SRCCOPY = &HCC0020
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, _
ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
'END WIN32 API SECTION
Public Function ImageToSurface(sr As DirectDrawSurface7, rID As Long) As Boolean
On Error GoTo Errors:
DirectDraw.Picture1.Picture = LoadResPicture(rID, vbResBitmap)
a = sr.GetDC
hCompt = CreateCompatibleDC(a)
SelectObject hCompt, DirectDraw.Picture1.Picture
BitBlt a, 0, 0, 640, 480, hCompt, 0, 0, SRCCOPY
sr.ReleaseDC (a)
ImageToSurface = True
Exit Function
Errors:
ImageToSurface = False
End Function
SelectObject hCompt, DirectDraw.Picture1.Picture
Public Function ClearSurfSecond() As Boolean
On Error GoTo Errors:
' Dim tempRECT As RECT
' Dim MyArray() As Byte
' SecondarySurf.Lock tempRECT, DdsdSecond, DDLOCK_WAIT Or DDLOCK_SURFACEMEMORYPTR, 0
' SecondarySurf.GetLockedArray MyArray()
' For x = 0 To DdsdSecond.lWidth - 1
' For y = 0 To DdsdSecond.lHeight - 1
' MyArray(x, y) = 0
' Next y
' Next x
' SecondarySurf.Unlock tempRECT
ClearSurfSecond = ImageToSurface(SecondarySurf, 101)
Exit Function
Errors:
ClearSurfSecond = False
End Function
Private Sub Form_Load()
.........
DirectDrawClass.Flips
End Sub