C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 30 - Перенос картинки на поверхность, используя GDI / DirectDraw / Microsoft DirectX

Шаг 30 - Перенос картинки на поверхность, используя GDI

Мы попробуем перенести картинку при помощи GDI. Механизм переноса совершенно одинаков, так как GDI представлено в виде API функций. В минимальном виде.

LoadImage (VB небольшие отличия)
CreateCompatibleDC
SelectObject
BitBlt

Загружаем картинку из ресурсов и получаем указатель на нее. Создаем совместимый контекст устройства, выбираем в этот контекст картинку и используем функцию BitBlt для переноса изображения. Мы создадим функцию ImageToSurface, в которую будем передавать ссылку на поверхность и идентификатор ресурса, в котором находится картинка.

Visual Basic
Visual C++

Visual Basic

Нам необходимо добавить описание функций и констант Win32 API.

'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

Создаем функцию и пишем код. Но есть одна маленькая мелочь. На форме нам нужно завести объект Picture и сделать его невидимым.

30_1.gif (2352 b)

Ну а теперь пишем сам код.

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

Все примеры, которые я встречал, использовали BMP файлы отдельные, а не в ресурсах. Честное слово, я потратил почти 5 часов, чтобы дойти вот до этой строчки.

SelectObject hCompt, DirectDraw.Picture1.Picture

Зачитываем картинку в объект Picture из ресурсов и потом можем использовать свойство Picture для выбора в контексте устройства. Вызовем мы эту функцию в момент очистки внутри ClearSurfSecond. Если мы можем сразу положить картинку, зачем мучаться, стирать, тратить время.

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

Можно сразу при запуске вызвать Flip, что бы картинка была видна.

Private Sub Form_Load()
.........

DirectDrawClass.Flips
End Sub

Запускается программа, и Вы наслаждаетесь картинкой.

Visual C++

Пишем функцию. В VC++ проблем в данном случае меньше и не надо мудрить с картинкой.

BOOL CDirectDraw::ImageToSurface(LPDIRECTDRAWSURFACE sr, long rID)
{
	HANDLE hBMP;
	HDC hdc;
	hBMP=LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(rID),
		IMAGE_BITMAP, 0, 0,  LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
	if (hBMP == NULL) return FALSE;
	rezult = sr->GetDC(&hdc);
	if(rezult!=DD_OK) return FALSE;
    	HDC hCompt = CreateCompatibleDC(hdc);
	SelectObject(hCompt,hBMP);
	BitBlt(hdc, 0, 0, 640, 480, hCompt, 0, 0, SRCCOPY);
	sr->ReleaseDC(hdc);  
	return TRUE;
}

Вызовем мы эту функцию в момент очистки внутри ClearSurfSecond. Если мы можем сразу положить картинку, зачем мучаться, стирать, тратить время.

BOOL CDirectDraw::ClearSurfSecond()
{
//memset(&DdsdSecond,0,sizeof(DDSURFACEDESC));
//DdsdSecond.dwSize = sizeof(DDSURFACEDESC);
//if (SecondarySurf->Lock(NULL,&DdsdSecond,DDLOCK_WAIT |
//	DDLOCK_SURFACEMEMORYPTR,NULL)!=DD_OK) return FALSE;
//	char* buf = (char*)DdsdSecond.lpSurface;
//	memset(buf,0,(DdsdSecond.dwHeight * DdsdSecond.dwHeight)); 
//
//if (SecondarySurf->Unlock(NULL)!=DD_OK) return FALSE; 

return ImageToSurface(SecondarySurf,IDB_BITMAP1);

}

Можно сразу при запуске вызвать Flip, что бы картинка была видна.

BOOL CDirectDlg::OnInitDialog()
{
	//......
	cDirecDraw.Flips(); 
	return TRUE;  // return TRUE  unless you set the focus to a control
}

Запускается программа, и Вы наслаждаетесь картинкой.


Загрузить проект | | |
Автор Каев Артем.
[AD]