Частенько для того чтобы написать текст пользуюсь функциями GDI ( TextOut и др. )
При этом вызывается MySurface.GetDC(h); ...
А если я например сделаю так
MySurface = allocmem(SurfaceWidth*SurfaceHeight*(BPP/8));
т.е. просто выделю опр. кусок памяти, можно ли для него получить HDC.
Ведь в результате это по сути и происходит — текст отображается в память выделенной при создании поверхности.
PZ>А если я например сделаю так PZ> MySurface = allocmem(SurfaceWidth*SurfaceHeight*(BPP/8));
Если я правильно понимаю вопрос, тебе нужно создать в памяти совместимый контекст, рисовать там, а потом отображать на реальный?
Если так, то поступай следующим образом:
1)CreateCompatibleDC — создаем в памяти совместимый контекст
2)CreateCompatibleBitmap — создаем совместимый битмэп
3)рисуем уже туда
4)BitBlt — когда необходимо копируем из памяти на реальный контекст
GT>Если я правильно понимаю вопрос, тебе нужно создать в памяти совместимый контекст, рисовать там, а потом отображать на реальный?
Ну почти так.
Допустим у меня имеется область памяти 1, которую я трактую как изображение.которая создается
при помощи allocmem(size)...т.е. не битмэп ...а чисто массив WORD например ( для 16 битного режима ).
Также есть понятие области видео-памяти 2 где находится видимый экран.
Я копирую данные из области 1 в область 2 и получаю картинку на экране.
Иногда нужно в область 1 вывести текст. Пока приходится придумывать всякие методы типа:
— создать битмэп. вывести на него текст . просканить и занести соотв. точки в область 1. удалить битмэп.
— создать Surface. затем GetDC, вывести текст , залочить , просканить, разлочить, удалить.
Все это выглядит довольно громоздко и на мой взгляд неправильный подход.
GT>Если так, то поступай следующим образом: GT>1)CreateCompatibleDC — создаем в памяти совместимый контекст
Возможно это решение, а я потом смогу получить указатель на память . т.е. чтобы остальные функции нормально работали ?. Т.е. эта функция выделяет опр. кусок памяти или как ?.
GT>2)CreateCompatibleBitmap — создаем совместимый битмэп GT>3)рисуем уже туда GT>4)BitBlt — когда необходимо копируем из памяти на реальный контекст
Главное чтобы память была выделена в оперативке и была непрерывной...и на нее можно было применять функции типа TextOut...т.к. самому реализовать кажется достаточно сложной задачей ( учитывая параметры фонта и пр.)
Здравствуйте, PavZ, Вы писали:
PZ>Главное чтобы память была выделена в оперативке и была непрерывной...и на нее можно было применять функции типа TextOut...т.к. самому реализовать кажется достаточно сложной задачей ( учитывая параметры фонта и пр.)
С этим контекстом можно работать так-же как с реальным (выделяется область в памяти и для неё создаётся контекст, совместимый с контекстом реального устройства)
а работает всё гораздо быстрее, т.к. не происходит физического вывода на экран
GT>С этим контекстом можно работать так-же как с реальным (выделяется область в памяти и для неё создаётся контекст, совместимый с контекстом реального устройства) GT>а работает всё гораздо быстрее, т.к. не происходит физического вывода на экран
Ок. А как получить указатель на выделеную память ? в доках не нашел про эту фичу ничего.
GT>>С этим контекстом можно работать так-же как с реальным (выделяется область в памяти и для неё создаётся контекст, совместимый с контекстом реального устройства) GT>>а работает всё гораздо быстрее, т.к. не происходит физического вывода на экран
PZ>Ок. А как получить указатель на выделеную память ? в доках не нашел про эту фичу ничего.
Копать тебе нужно в сторону CreateDIBSection:
CreateDIBSection
The CreateDIBSection function creates a DIB that applications can write to directly. The function gives you a pointer to the location of the bitmap bit values. You can supply a handle to a file-mapping object that the function will use to create the bitmap, or you can let the system allocate the memory for the bitmap.
HBITMAP CreateDIBSection(
HDC hdc, // handle to DC
CONST BITMAPINFO *pbmi, // bitmap data
UINT iUsage, // data type indicator
VOID **ppvBits, // bit values
HANDLE hSection, // handle to file mapping object
DWORD dwOffset // offset to bitmap bit values
);
После создания ты имеешь указатель на непрерывный участок памяти и плюс к этому,HBITMAP ,
с которым ты можешь работать посредством GDI.
Создаешь, выбираешь ее на предварительно созданном MemDC (CreateCompatibleDC)
и рисуешь.
Пошарься в интернете насчет готового класса CDib.Я сам такой сделал — работает и с DIBами и с JPEGами и
очено прост в использовании.
И что-то подобное есть на www.codeguru.com
Здравствуйте, B_A_D, Вы писали:
B_A>Копать тебе нужно в сторону CreateDIBSection:
B_A>[code]
B_A>CreateDIBSection
А можно что-нибудь сделать, если указатель на изображение уже имеется (имеется другая структура, преставляющая битмап)? Как получить HBITMAP так, чтобы он сам память не выделял (ну и соответсвенно не прибивал )?
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, swamp, Вы писали:
БП>Как получить HBITMAP так, чтобы он сам память не выделял (ну и соответсвенно не прибивал )?
БП>HBITMAP никак, HDC можно. Для этого нужно создать c этой памяти IDirectDraw7 поверхность, а у нее спросить HDC. БП>Павел.
Соответственно не будет работать там где нет DirectX 7 (если я не ошибаюсь он по умолчанию ставится на Windows 2000?)...
Здравствуйте, swamp, Вы писали:
S> Соответственно не будет работать там где нет DirectX 7 (если я не ошибаюсь он по умолчанию ставится на Windows 2000?)...
Ну тогда используйте IDirectDrawSurface4 или вообще IDirectDrawSurface. Это возможность появилась еще в самом первом директе
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, swamp, Вы писали:
S>> Соответственно не будет работать там где нет DirectX 7 (если я не ошибаюсь он по умолчанию ставится на Windows 2000?)... БП>Ну тогда используйте IDirectDrawSurface4 или вообще IDirectDrawSurface. Это возможность появилась еще в самом первом директе
А на каких виндах такие директы стоят гарантированно?
S> А на каких виндах такие директы стоят гарантированно?
Помоему на всех старше 95-х...
кстати прикол — 95-е называют игровой системой ... а директ икса на ней по умолчанию нет.
а NT4.0 который ругают что он не для игр, так там DirectX3 по умолчанию и IDirectDraw там есть.
S>> А на каких виндах такие директы стоят гарантированно?
PZ>Помоему на всех старше 95-х... PZ>кстати прикол — 95-е называют игровой системой ... а директ икса на ней по умолчанию нет. PZ>а NT4.0 который ругают что он не для игр, так там DirectX3 по умолчанию и IDirectDraw там есть.
Клево! Т.е. будет работать на win9x начиная с win98 и winnt начиная с nt4?
Кстати, есть ли какие-нибудь преимущества у IDirectDraw7 перед просто IDirectDraw?
S> Клево! Т.е. будет работать на win9x начиная с win98 и winnt начиная с nt4?
Ну да ...
S> Кстати, есть ли какие-нибудь преимущества у IDirectDraw7 перед просто IDirectDraw?
Ну одно время когда делал скроллинг экрана получалось что на DirectDraw были дергунчики
на DirectDraw7 получалось плавно. Но это все использовалось директ-иксовское...BltFast
и прочая фигня.
Из возможностей DirectDraw помоему лучше использовать только
FDDSPrimary.Lock.
Скопировать необх. данные ...
FDDSPrimary.Unlock.
или
FDDSBack.Lock.
Скопировать необх. данные ...
FDDSBack.Unlock.
Flip;
S>> Клево! Т.е. будет работать на win9x начиная с win98 и winnt начиная с nt4? PZ>Ну да ...
Это меняет дело...
S>> Кстати, есть ли какие-нибудь преимущества у IDirectDraw7 перед просто IDirectDraw?
PZ>Ну одно время когда делал скроллинг экрана получалось что на DirectDraw были дергунчики PZ>на DirectDraw7 получалось плавно. Но это все использовалось директ-иксовское...BltFast PZ>и прочая фигня.
Ну тогда если нет DirectDraw7 то работать через просто DirectDraw, тогда тормоза — проблемы того, кто ленится поставить себе DirectX7
PZ>Из возможностей DirectDraw помоему лучше использовать только
Мне собственно надо на кусок памяти сделать HDC чтобы туда что-нибудь нарисовать (например линию) через GDI и чтобы эти изменения применились на битмапе естетсвенно. Создавать HBITMAPы и копировать память туда-сюда не в кайф...
Кстати, можно где-нибудь глянуть сампл, демонстрирующий как это проделать? А то я с директом никогда дела не имел...
S> Мне собственно надо на кусок памяти сделать HDC чтобы туда что-нибудь нарисовать (например линию) через GDI и чтобы эти изменения применились на битмапе естетсвенно. Создавать HBITMAPы и копировать память туда-сюда не в кайф...
S> Кстати, можно где-нибудь глянуть сампл, демонстрирующий как это проделать? А то я с директом никогда дела не имел...
Немного непонятно...причем здесь директ, если это просто кусок памяти...
если это DirectDrawSurface ( собственно при использовании DirectX )
то делается так:
А как получить уже на выделеную память HDC я пока сам не понял.
Выше обсуждалось что нужно изначально об этом заботиться и выделять память другим способом.
пока не пробовал...
S>> Мне собственно надо на кусок памяти сделать HDC чтобы туда что-нибудь нарисовать (например линию) через GDI и чтобы эти изменения применились на битмапе естетсвенно. Создавать HBITMAPы и копировать память туда-сюда не в кайф...
S>> Кстати, можно где-нибудь глянуть сампл, демонстрирующий как это проделать? А то я с директом никогда дела не имел...
PZ>Немного непонятно...причем здесь директ, если это просто кусок памяти...
PZ>если это DirectDrawSurface ( собственно при использовании DirectX ) PZ>то делается так:
PZ> HDC hdc; PZ> MySurface->GetDC(hdc); PZ> MoveTo(hdc,0,0); PZ> LineTo(hdc,100,0); PZ> MySurface->ReleaseDC(hdc);
PZ>А как получить уже на выделеную память HDC я пока сам не понял. PZ>Выше обсуждалось что нужно изначально об этом заботиться и выделять память другим способом. PZ>пока не пробовал...
А как сделать MySurface из сырого битмапа (т.е. указателя на данные, ширины/высоты, глубины цвета и т.п.)?