![]() |
|
Модераторы: Rickert |
![]()
|
|
| this |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 12.9.2005 Репутация: нет Всего: 1 |
Подскажите пожалуйста, как можно из БМП - файла перенести на DirectDraw - поверхность перенести определенный участок изображения(например начиная с 100 пикселей справа и 100 писелей сверху). Мне нужно из файла содержащего кадры анимации перенести эти кадры на соответсвующие поверхности.
|
|||
|
||||
| Emantuohtiw |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 13.10.2005 Где: The sky where I g o to be free Репутация: нет Всего: нет |
Так ты пиши в память начиная с 100 100 пикселя.
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
разобраться довольно просто
//----------------------------------------------------------------------------- // Name: CDisplay::CreateSurfaceFromBitmap() // Desc: Create a DirectDrawSurface from a bitmap resource or bitmap file. // Use MAKEINTRESOURCE() to pass a constant into strBMP. //----------------------------------------------------------------------------- HRESULT CDisplay::CreateSurfaceFromBitmap( CSurface** ppSurface, TCHAR* strBMP, DWORD dwDesiredWidth, DWORD dwDesiredHeight ) { HRESULT hr; HBITMAP hBMP = NULL; BITMAP bmp; DDSURFACEDESC2 ddsd; if( m_pDD == NULL || strBMP == NULL || ppSurface == NULL ) return E_INVALIDARG; *ppSurface = NULL; // Try to load the bitmap as a resource, if that fails, try it as a file hBMP = (HBITMAP) LoadImage( GetModuleHandle(NULL), strBMP, IMAGE_BITMAP, dwDesiredWidth, dwDesiredHeight, LR_CREATEDIBSECTION ); if( hBMP == NULL ) { hBMP = (HBITMAP) LoadImage( NULL, strBMP, IMAGE_BITMAP, dwDesiredWidth, dwDesiredHeight, LR_LOADFROMFILE | LR_CREATEDIBSECTION ); if( hBMP == NULL ) return E_FAIL; } // Get size of the bitmap GetObject( hBMP, sizeof(bmp), &bmp ); // Create a DirectDrawSurface for this bitmap ZeroMemory( &ddsd, sizeof(ddsd) ); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = bmp.bmWidth; ddsd.dwHeight = bmp.bmHeight; (*ppSurface) = new CSurface(); if( FAILED( hr = (*ppSurface)->Create( m_pDD, &ddsd ) ) ) { delete (*ppSurface); return hr; } // Draw the bitmap on this surface if( FAILED( hr = (*ppSurface)->DrawBitmap( hBMP, 0, 0, 0, 0 ) ) ) { DeleteObject( hBMP ); return hr; } DeleteObject( hBMP ); return S_OK; } //----------------------------------------------------------------------------- // Name: CSurface::DrawBitmap() // Desc: Draws a bitmap over an entire DirectDrawSurface, stretching the // bitmap if nessasary //----------------------------------------------------------------------------- HRESULT CSurface::DrawBitmap( HBITMAP hBMP, DWORD dwBMPOriginX, DWORD dwBMPOriginY, DWORD dwBMPWidth, DWORD dwBMPHeight ) { HDC hDCImage; HDC hDC; BITMAP bmp; DDSURFACEDESC2 ddsd; HRESULT hr; if( hBMP == NULL || m_pdds == NULL ) return E_INVALIDARG; // Make sure this surface is restored. if( FAILED( hr = m_pdds->Restore() ) ) return hr; // Get the surface.description ddsd.dwSize = sizeof(ddsd); m_pdds->GetSurfaceDesc( &ddsd ); if( ddsd.ddpfPixelFormat.dwFlags == DDPF_FOURCC ) return E_NOTIMPL; // Select bitmap into a memoryDC so we can use it. hDCImage = CreateCompatibleDC( NULL ); if( NULL == hDCImage ) return E_FAIL; SelectObject( hDCImage, hBMP ); // Get size of the bitmap GetObject( hBMP, sizeof(bmp), &bmp ); // Use the passed size, unless zero dwBMPWidth = ( dwBMPWidth == 0 ) ? bmp.bmWidth : dwBMPWidth; dwBMPHeight = ( dwBMPHeight == 0 ) ? bmp.bmHeight : dwBMPHeight; // Stretch the bitmap to cover this surface if( FAILED( hr = m_pdds->GetDC( &hDC ) ) ) return hr; StretchBlt( hDC, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hDCImage, dwBMPOriginX, dwBMPOriginY, dwBMPWidth, dwBMPHeight, SRCCOPY ); if( FAILED( hr = m_pdds->ReleaseDC( hDC ) ) ) return hr; DeleteDC( hDCImage ); return S_OK; } |
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |