Написать текст функциями GDI в память...
От: PavZ  
Дата: 02.07.03 14:31
Оценка:
Частенько для того чтобы написать текст пользуюсь функциями GDI ( TextOut и др. )
При этом вызывается MySurface.GetDC(h); ...

А если я например сделаю так
MySurface = allocmem(SurfaceWidth*SurfaceHeight*(BPP/8));
т.е. просто выделю опр. кусок памяти, можно ли для него получить HDC.
Ведь в результате это по сути и происходит — текст отображается в память выделенной при создании поверхности.
Re: перенаправление стандартного вывода
От: GarikTot  
Дата: 02.07.03 16:22
Оценка:
Здравствуйте, PavZ, Вы писали:


PZ>А если я например сделаю так

PZ> MySurface = allocmem(SurfaceWidth*SurfaceHeight*(BPP/8));

Если я правильно понимаю вопрос, тебе нужно создать в памяти совместимый контекст, рисовать там, а потом отображать на реальный?
Если так, то поступай следующим образом:
1)CreateCompatibleDC — создаем в памяти совместимый контекст
2)CreateCompatibleBitmap — создаем совместимый битмэп
3)рисуем уже туда
4)BitBlt — когда необходимо копируем из памяти на реальный контекст
Re[2]: перенаправление стандартного вывода
От: PavZ  
Дата: 03.07.03 14:30
Оценка:
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 — когда необходимо копируем из памяти на реальный контекст
Re[3]: p.s.
От: PavZ  
Дата: 03.07.03 14:39
Оценка:
Главное чтобы память была выделена в оперативке и была непрерывной...и на нее можно было применять функции типа TextOut...т.к. самому реализовать кажется достаточно сложной задачей ( учитывая параметры фонта и пр.)
Re[4]: перенаправление стандартного вывода
От: GarikTot  
Дата: 03.07.03 14:46
Оценка:
Здравствуйте, PavZ, Вы писали:

PZ>Главное чтобы память была выделена в оперативке и была непрерывной...и на нее можно было применять функции типа TextOut...т.к. самому реализовать кажется достаточно сложной задачей ( учитывая параметры фонта и пр.)


С этим контекстом можно работать так-же как с реальным (выделяется область в памяти и для неё создаётся контекст, совместимый с контекстом реального устройства)
а работает всё гораздо быстрее, т.к. не происходит физического вывода на экран
Re[5]: перенаправление стандартного вывода
От: PavZ  
Дата: 04.07.03 10:01
Оценка:
GT>С этим контекстом можно работать так-же как с реальным (выделяется область в памяти и для неё создаётся контекст, совместимый с контекстом реального устройства)
GT>а работает всё гораздо быстрее, т.к. не происходит физического вывода на экран

Ок. А как получить указатель на выделеную память ? в доках не нашел про эту фичу ничего.
Re[6]: перенаправление стандартного вывода
От: B_A_D Израиль  
Дата: 04.07.03 11:42
Оценка:
Здравствуйте, PavZ, Вы писали:



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
Re[7]: перенаправление стандартного вывода
От: PavZ  
Дата: 07.07.03 07:50
Оценка:
Ок. Спасибо за советы !
Побробую.
Re[7]: а если память уже выделена?
От: swamp Россия  
Дата: 09.07.03 09:03
Оценка:
Здравствуйте, B_A_D, Вы писали:

B_A>Копать тебе нужно в сторону CreateDIBSection:


B_A>[code]


B_A>CreateDIBSection


А можно что-нибудь сделать, если указатель на изображение уже имеется (имеется другая структура, преставляющая битмап)? Как получить HBITMAP так, чтобы он сам память не выделял (ну и соответсвенно не прибивал )?
Sincerely yours,
Andrew Simontsev.
Re[8]: а если память уже выделена?
От: Блудов Павел Россия  
Дата: 09.07.03 09:23
Оценка: 1 (1)
Здравствуйте, swamp, Вы писали:

Как получить HBITMAP так, чтобы он сам память не выделял (ну и соответсвенно не прибивал )?

HBITMAP никак, HDC можно. Для этого нужно создать c этой памяти IDirectDraw7 поверхность, а у нее спросить HDC.
Павел.
Re[9]: а если память уже выделена?
От: swamp Россия  
Дата: 09.07.03 09:42
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, swamp, Вы писали:


БП>Как получить HBITMAP так, чтобы он сам память не выделял (ну и соответсвенно не прибивал )?


БП>HBITMAP никак, HDC можно. Для этого нужно создать c этой памяти IDirectDraw7 поверхность, а у нее спросить HDC.

БП>Павел.

Соответственно не будет работать там где нет DirectX 7 (если я не ошибаюсь он по умолчанию ставится на Windows 2000?)...

В любом случае, спасибо большое за мысль.
Sincerely yours,
Andrew Simontsev.
Re[10]: а если память уже выделена?
От: Блудов Павел Россия  
Дата: 09.07.03 10:18
Оценка:
Здравствуйте, swamp, Вы писали:

S> Соответственно не будет работать там где нет DirectX 7 (если я не ошибаюсь он по умолчанию ставится на Windows 2000?)...

Ну тогда используйте IDirectDrawSurface4 или вообще IDirectDrawSurface. Это возможность появилась еще в самом первом директе
Re[11]: а если память уже выделена?
От: swamp Россия  
Дата: 09.07.03 10:33
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, swamp, Вы писали:


S>> Соответственно не будет работать там где нет DirectX 7 (если я не ошибаюсь он по умолчанию ставится на Windows 2000?)...

БП>Ну тогда используйте IDirectDrawSurface4 или вообще IDirectDrawSurface. Это возможность появилась еще в самом первом директе

А на каких виндах такие директы стоят гарантированно?
Sincerely yours,
Andrew Simontsev.
Re[12]: а если память уже выделена?
От: PavZ  
Дата: 09.07.03 11:29
Оценка: 2 (1)
S> А на каких виндах такие директы стоят гарантированно?

Помоему на всех старше 95-х...
кстати прикол — 95-е называют игровой системой ... а директ икса на ней по умолчанию нет.
а NT4.0 который ругают что он не для игр, так там DirectX3 по умолчанию и IDirectDraw там есть.
Re[13]: а если память уже выделена?
От: swamp Россия  
Дата: 09.07.03 12:23
Оценка:
Здравствуйте, PavZ, Вы писали:


S>> А на каких виндах такие директы стоят гарантированно?


PZ>Помоему на всех старше 95-х...

PZ>кстати прикол — 95-е называют игровой системой ... а директ икса на ней по умолчанию нет.
PZ>а NT4.0 который ругают что он не для игр, так там DirectX3 по умолчанию и IDirectDraw там есть.

Клево! Т.е. будет работать на win9x начиная с win98 и winnt начиная с nt4?

Кстати, есть ли какие-нибудь преимущества у IDirectDraw7 перед просто IDirectDraw?
Sincerely yours,
Andrew Simontsev.
Re[14]: а если память уже выделена?
От: PavZ  
Дата: 09.07.03 12:35
Оценка: 2 (1)
S> Клево! Т.е. будет работать на win9x начиная с win98 и winnt начиная с nt4?
Ну да ...

S> Кстати, есть ли какие-нибудь преимущества у IDirectDraw7 перед просто IDirectDraw?


Ну одно время когда делал скроллинг экрана получалось что на DirectDraw были дергунчики
на DirectDraw7 получалось плавно. Но это все использовалось директ-иксовское...BltFast
и прочая фигня.
Из возможностей DirectDraw помоему лучше использовать только

FDDSPrimary.Lock.
Скопировать необх. данные ...
FDDSPrimary.Unlock.

или

FDDSBack.Lock.
Скопировать необх. данные ...
FDDSBack.Unlock.
Flip;

ну и установку видеорежима.

создавать доп. поверхности = доп. гемор...
лучшая поверхность — выделить просто кусок оперативки...преимущества
в топике рядомhttp://rsdn.ru/Forum/Message.aspx?mid=319655&only=1
Re[15]: а если память уже выделена?
От: swamp Россия  
Дата: 09.07.03 13:06
Оценка:
Здравствуйте, PavZ, Вы писали:


S>> Клево! Т.е. будет работать на win9x начиная с win98 и winnt начиная с nt4?

PZ>Ну да ...

Это меняет дело...


S>> Кстати, есть ли какие-нибудь преимущества у IDirectDraw7 перед просто IDirectDraw?


PZ>Ну одно время когда делал скроллинг экрана получалось что на DirectDraw были дергунчики

PZ>на DirectDraw7 получалось плавно. Но это все использовалось директ-иксовское...BltFast
PZ>и прочая фигня.

Ну тогда если нет DirectDraw7 то работать через просто DirectDraw, тогда тормоза — проблемы того, кто ленится поставить себе DirectX7

PZ>Из возможностей DirectDraw помоему лучше использовать только


...

PZ>создавать доп. поверхности = доп. гемор...

PZ>лучшая поверхность — выделить просто кусок оперативки...преимущества
PZ>в топике рядомhttp://rsdn.ru/Forum/Message.aspx?mid=319655&only=1

Мне собственно надо на кусок памяти сделать HDC чтобы туда что-нибудь нарисовать (например линию) через GDI и чтобы эти изменения применились на битмапе естетсвенно. Создавать HBITMAPы и копировать память туда-сюда не в кайф...

Кстати, можно где-нибудь глянуть сампл, демонстрирующий как это проделать? А то я с директом никогда дела не имел...
Sincerely yours,
Andrew Simontsev.
Re[16]: а если память уже выделена?
От: PavZ  
Дата: 09.07.03 13:18
Оценка:
S> Мне собственно надо на кусок памяти сделать HDC чтобы туда что-нибудь нарисовать (например линию) через GDI и чтобы эти изменения применились на битмапе естетсвенно. Создавать HBITMAPы и копировать память туда-сюда не в кайф...

S> Кстати, можно где-нибудь глянуть сампл, демонстрирующий как это проделать? А то я с директом никогда дела не имел...


Немного непонятно...причем здесь директ, если это просто кусок памяти...

если это DirectDrawSurface ( собственно при использовании DirectX )
то делается так:

HDC hdc;
MySurface->GetDC(hdc);
MoveTo(hdc,0,0);
LineTo(hdc,100,0);
MySurface->ReleaseDC(hdc);

А как получить уже на выделеную память HDC я пока сам не понял.
Выше обсуждалось что нужно изначально об этом заботиться и выделять память другим способом.
пока не пробовал...
Re[17]: а если память уже выделена?
От: swamp Россия  
Дата: 09.07.03 14:29
Оценка:
Здравствуйте, PavZ, Вы писали:


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 из сырого битмапа (т.е. указателя на данные, ширины/высоты, глубины цвета и т.п.)?

ЗЫ Пойдет даже ссылка на MSDN
Sincerely yours,
Andrew Simontsev.
Re[18]: а если память уже выделена?
От: PavZ  
Дата: 09.07.03 14:40
Оценка: 1 (1)
S> А как сделать MySurface из сырого битмапа (т.е. указателя на данные, ширины/высоты, глубины цвета и т.п.)?

В SDK есть модуль ddutil.h ( соотв. ddutil.pas ) в нем есть функция DDLoadBitmap(LPSTR *Filename, ...);

Т.е. указываешь имя файла и она сама создает поверхность для твоего битмэпа с учетом палитры,
битности и пр.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.