Форум программистов, компьютерный форум CyberForum.ru

Нужно сохранить нарисованное мышкой на поверхности DirectX в BMP файл - C++

Восстановить пароль Регистрация
Другие темы раздела
Visual C++ Поддерживает ли библиотека MFC программирование под OpenGL? http://www.cyberforum.ru/cpp-beginners/thread485934.html
У меня возник такой вопрос: Поддерживает ли библиотека MFC программирование под OpenGL?
C++ CStatic::Create что это за индентификатор? Вот фрагмент из справки MFC BOOL CStatic::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff ); , где nID-идентификатор статического элемента управления. Кто-нибудь объясните мне плиз, что это за индентификатор? http://www.cyberforum.ru/cpp-beginners/thread485853.html
C++ Как правильно отцентрировать текст в Edit ?
Раньше я использовал стиль WS_BORDER для создания Edit для редактирования одной строки. Теперь WS_BORDER я убрал и отрисовываю рамку самостоятельно. Но после этого текст в Edit отображается сдвинутым вверх. Флаг ES_CENTER центрирует его не только по вертиали, но и по горизонтали, поэтому он не годится. Как бы мне вернуть текст в исходное положение ? Размеры GetClientRect(hWindow, &r),...
C++ VScroll в броузере
Пишу на C#, но ,думаю, на любом другом языке тоже самое. Короче, как у WebBrowsera убрать вертикальную полосу прокрутки?
C++ Как преобразовать int в char? http://www.cyberforum.ru/cpp-beginners/thread485780.html
Прошу подсказать, как же все-таки преобразовывать int в char?
C++ ATL::Outlook::Delete MailItem Доброго дня суток! Скажите плиз, почему я не могу удалить MailItem: в обработчике OnSend я получаю текущее письмо как mItem типа _MailItemPtr затем пишу _MailItemPtr mItem2 = mItem->Copy(); .... работаю с mItem2 .... mItem2->Delete(); сообщение из Outbox'a не удаляеться :( подробнее

Показать сообщение отдельно
gidm
0 / 0 / 0
Регистрация: 02.06.2008
Сообщений: 3
22.06.2010, 07:53     Нужно сохранить нарисованное мышкой на поверхности DirectX в BMP файл
Здравствуйте! Помогите с проблемой сохранения картинки нарисованной на поверхности.
Задача состоит в следующем: есть поверхность pImage типа IDirectDrawSurface7, на ней мышкой рисуем так:
Код
void MouseMove(DWORD x, DWORD y, DWORD button)
{
	if ((button == MOUSE_DOWN_LEFT) && ((nOldMouseX != x) || (nOldMouseY != y))) 
	{		
		HDC hdc;
		pImage->GetDC(&hdc);
		if (hdc)
		{
			if (sPainting == PEN)
			{
				SelectObject(hdc, CreatePen(PS_SOLID, 0, RGB(128, 128, 0)));
				MoveToEx(hdc, nOldMouseX-xlCanvas, nOldMouseY-ylCanvas, NULL);
				LineTo(hdc, x-xlCanvas, y-ylCanvas);
			}
			pImage->ReleaseDC(hdc);
		}
		else
			WriteLog('Can`t get DC');

		nOldMouseX = x;
		nOldMouseY = y;
	}
}
Функция работает и на поверхности предварительно залитой белым цветом рисуется черным цветом все что мышкой водится. Но вот когда я хочу сохранить это художестов в виде Bitmap с помощью следующей функции:
[code]
void SaveBitmap()
{
HFILE hf = NULL;
OFSTRUCT OfStruct;
HDC hdc = NULL;
HDC compatibleDC = NULL;
BITMAP bmp;
HBITMAP hbm = NULL;
LPBYTE lpBits = NULL;
PBITMAPINFO pbi = NULL;
PBITMAPINFOHEADER pbih = NULL;
BITMAPFILEHEADER bfh;
UINT cb;
BYTE *hp;

pImage->GetDC(&hdc);
if (hdc != NULL)
{
if((compatibleDC = CreateCompatibleDC(hdc))!= NULL)
if((hbm = CreateCompatibleBitmap(hdc, widthCanvas, heightCanvas)) != NULL)
{
SelectObject(compatibleDC, hbm);
if (GetObject(hbm, sizeof(BITMAP), (LPSTR)&bmp))
{
WriteLog('%d %d %d %d %d %d',
bmp.bmType,
bmp.bmBits,
bmp.bmPlanes,
bmp.bmWidth,
bmp.bmHeight,
bmp.bmPlanes * bmp.bmBitsPixel);
if ((WORD)(bmp.bmPlanes * bmp.bmBitsPixel) == (WORD)24
|| (WORD)(bmp.bmPlanes * bmp.bmBitsPixel) == (WORD)32)
{
if ((pbi = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER))) != NULL)
{
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth = bmp.bmWidth;
pbi->bmiHeader.biHeight = bmp.bmHeight;
pbi->bmiHeader.biPlanes = bmp.bmPlanes;
pbi->bmiHeader.biBitCount = bmp.bmBitsPixel;
pbi->bmiHeader.biCompression = BI_RGB;
pbi->bmiHeader.biSizeImage =
((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount +
31) & ~31) / 8 * pbi->bmiHeader.biHeight;
pbi->bmiHeader.biClrImportant = 0;
pbih = (PBITMAPINFOHEADER)pbi;
lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
if (!lpBits)
WriteLog('Can`t global alloc memory lpBits');
if (!GetDIBits(hdc, hbm, 0, (WORD)pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS))
WriteLog('Can`t get dib bits');

if ((hf = OpenFile('1.bmp', &OfStruct, OF_CREATE | OF_READWRITE)) != HFILE_ERROR)
{
bfh.bfType = 0x4D42;
bfh.bfSize = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) + pbi->bmiHeader.biSizeImage;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER);
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
if ((cb = _lwrite(hf, (LPSTR)&bfh, sizeof(BITMAPFILEHEADER))) != HFILE_ERROR)
{
WriteLog('%d', cb);
if ((cb = _lwrite(hf, (LPSTR)&(pbi->bmiHeader), sizeof(BITMAPINFOHEADER))) != HFILE_ERROR)
{
WriteLog('%d', cb);
//hp = lpBits;
if ((cb = _lwrite(hf, (LPSTR)lpBits, pbi->bmiHeader.biSizeImage))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 02:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru