![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Ridat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 21.6.2003 Репутация: нет Всего: нет |
Работаю с DirectDraw whis MFC
создаю CFame с базовым CWnd (WS_POPUP и WS_EX_TOPMOST) Есть g_lpDDSBack, создаю g_lpDDSOff - Off-Screen surface DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd,sizeof(ddsd)); ddsd.dwSize=sizeof(ddsd); ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;//|DDSD_PIXELFORMAT; ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN; ddsd.dwHeight=480; ddsd.dwWidth=640; hRet=g_lpDD7->CreateSurface(&ddsd,&g_lpDDSOff,NULL); Хочу вывести на нее картинку ID: BACK , 640X480X256 затем с помощью BltFast отражаю ее на g_lpDDSBack основная проблема внести в g_lpDDSOff - bitmap. Непонятно относительно палитры и не ясно, по тем примерам, которые есть, какую роль играет собственно bitmap, конкретно: Пример1: extern "C" IDirectDrawSurface7* DDLoadBitmap( IDirectDraw7* pdd, LPCSTR szBitmap, int dx, int dy) { HBITMAP hbm; BITMAP bm; DDSURFACEDESC2 ddsd; IDirectDrawSurface7 *pdds; // Загрузка bitmap hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); if (hbm == NULL) hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if (hbm == NULL) return NULL; // // берем ее размер // GetObject(hbm, sizeof(bm), &bm); // // создаем surface причем Off-screen // ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = bm.bmWidth; ddsd.dwHeight = bm.bmHeight; if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK) return NULL; ???: DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); DeleteObject(hbm); return pdds; } extern "C" HRESULT DDCopyBitmap(IDirectDrawSurface7* pdds, HBITMAP hbm, int x, int y, int dx, int dy) { HDC hdcImage; HDC hdc; BITMAP bm; DDSURFACEDESC2 ddsd; HRESULT hr; if (hbm == NULL || pdds == NULL) return E_FAIL; // // Make sure this surface is restored. // pdds->Restore(); // // Select bitmap into a memoryDC so we can use it. // hdcImage = CreateCompatibleDC(NULL); if (!hdcImage) OutputDebugString("createcompatible dc failed\n"); SelectObject(hdcImage, hbm); // // Get size of the bitmap // GetObject(hbm, sizeof(bm), &bm); dx = dx == 0 ? bm.bmWidth : dx; // Use the passed size, unless zero dy = dy == 0 ? bm.bmHeight : dy; // // Get size of surface. // ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; pdds->GetSurfaceDesc(&ddsd); if ((hr = pdds->GetDC(&hdc)) == DD_OK) { StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY); pdds->ReleaseDC(hdc); } DeleteDC(hdcImage); return hr; } В принципемне непонятно имеено работа под API с Bitmap, если я правельно понял как работает функция DDCopyBitmap, то существует bitmap, существует off-screen surface далее с помощью hdcImage = CreateCompatibleDC(NULL); мы созаем HDC непонятно с чем связанный, с ним соединяем bitmap SelectObject(hdcImage, hbm); если с кистью(HBRUSH) все понятно, то, что физически делает эта команда я не понимаю, а далее идет отражение одного (HDC)hdc в другой (HDC)hdcImage Пример2: HDC hTempDC; //Получаем контекст рабочего стола hTempDC=GetDC(HWND_DESKTOP); //Создаем контекст в памяти и растр, совместимый с Экраном hMemDC=CreateCompatibleDC(hTempDC); hMemBitmap=CreateCompatibleBitmap(hTempDC,nScreenX,nScreenY); //Заливаем содержимое контекста черным цветом SelectBitmap(hMemDC,hMemBitmap); SelectBrush(hMemDC,GetStockBrush(BLACK_BRUSH)); PatBlt(hMemDC,0,0,nScreenX,nScreenY,PATCOPY); //Копируем содержимое в память if (!LoadBMP(hMemDC,szFileName)) { return (FALSE); } //освобождаем временный контекс ReleaseDC(HWND_DESKTOP,hTempDC); тут используется хитрая процедура рисования рисунка и она не важна. Я перепробывал различные комбинации, что только я не делал. Ничто не ругается, но в off-screen черный экран! Итак еще раз формулирую вопрос, есть: g_lpDDSBack, создаю g_lpDDSOff - Off-Screen surface bitmap 640x480x256 вопрос: как загрузить bitmap в g_lpDDSOff, какая должна быть при этом g_lpDDSOff(вопрос относительно палитры) что нужно если bitmap: 640x480x24(16), как реагирует на такой ресурс MSVC++ и как реализовать туже задачу. С API я неработал, так, что относительно дискрипторов и работы с GDI имею общие прдставления, хотя есть MSDN Хотелось бы узнать что-нибудь о сущности HDC и HBITMAP. |
|||
|
||||
| kruchinin |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 19.4.2003 Репутация: нет Всего: нет |
По-моему зарузка картинки на любую поверхность DirectDraw будет одинаковопривожу пример:
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |