powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание независимого MemoryDC
12 сообщений из 12, страница 1 из 1
Создание независимого MemoryDC
    #34702896
Ste@lth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть задачи такова, необходимо написать DLL-ку, которая будет строить BITMAP по заданным параметрам, что необходимо:

1. на этом BITMAP-е писать текст, используя шрифты системы, то есть что-нибудь типа DrawText
2. иметь доступ непосредственно к памяти образа картинки, чтобы можно было рисовать руками без функций API
3. иметь возможность задавать параметры BITMAP-а, такие как размер и BPP

А теперь проблема: т.к. DrawText пишет только в DC, то решил создать его через CreateDC, при указании имени устройства DISPLAY естественно нельзя поменять глубину цвета BPP, создать без указания устройства наподобе CreateDC(NULL,NULL,NULL,&devmode) не получается, не создает и все, хотя структуру devmode заполнил уже всю, не помогает...

Вот и вопрос, как все-таки создать независимый MemoryDC, или как выводить текст напрямую в BITMAP?
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34702949
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ste@lth wrote:

> А теперь проблема: т.к. DrawText пишет только в DC, то решил создать его
> через CreateDC, при указании имени устройства DISPLAY естественно нельзя
> поменять глубину цвета BPP, создать без указания устройства наподобе
> CreateDC(NULL,NULL,NULL,&devmode) не получается, не создает и все, хотя
> структуру devmode заполнил уже всю, не помогает...
>
> Вот и вопрос, как все-таки создать независимый MemoryDC, или как выводить
> текст напрямую в BITMAP?
Точно не помню, но посмотрите функции типа CreateCompatibleDC. Ещё в MSDN
есть пример взятия скриншота с экрана при помощи как раз таких вот функций,
но его надо рыть (находится по словам "display snapshot" или что-то вроде
того).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34703608
Ste@lth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CreateCompatibleDC создает совместимый контекст с указанным, если 0 то с экраном, но еще раз повторюсь, как мне тогда указать BPP?
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705125
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ste@lth wrote:

> CreateCompatibleDC создает совместимый контекст с указанным, если 0 то с
> экраном, но еще раз повторюсь, как мне тогда указать BPP?
Млин. Я студию полгода назад снес, когда на линукс перешел. Счас попробую на
msdn поискать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705132
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ste@lth wrote:

> CreateCompatibleDC создает совместимый контекст с указанным, если 0 то с
> экраном, но еще раз повторюсь, как мне тогда указать BPP?
>
Вот не судьба была заглянуть на
msdn
заглянуть?
[quote]
The original bitmap in a memory DC is simply a placeholder. Its dimensions
are one pixel by one pixel. Before an application can begin drawing, it
must select a bitmap with the appropriate width and height into the DC by
calling the SelectObject function. To create a bitmap of the appropriate
dimensions, use the CreateBitmap, CreateBitmapIndirect, or
CreateCompatibleBitmap function. After the bitmap is selected into the
memory DC, the system replaces the single-bit array with an array large
enough to store color information for the specified rectangle of pixels.
[/quote]
Там сказано, что при создании memoryDC битмап по умолчанию 1x1x1bpp и
бесполезен, но можно создать новый битмап при помощи CreateBitmap или
CreateBitmapIndirect, выбрать его (используя memoryDC) при помощи
SelectObject и рисовать уже на нём. А CreateBitmapIndirect как раз "creates
a bitmap with the specified width, height, and color format (color planes
and bits-per-pixel).".

Вы это искали?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705207
Ste@lth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм, похоже на правду...
просто где-то читал что цветность контекста и битмапа должны совпадать... буду проводить опыты...
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705209
Ste@lth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот и проверил, HDC имеет 32 бита, мне надо создать 16-битный битмап, в результате SelectObject возвращает 0
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	hdc=CreateCompatibleDC( 0 );
	memset(&bmp, 0 ,sizeof(BITMAP));
	bmp.bmBitsPixel= 16 ;
	bmp.bmWidth=Info->bwidth;
	bmp.bmHeight=Info->bheight;
	bmp.bmBits=bitmapArray;
	bmp.bmPlanes= 1 ;
	bmp.bmWidthBytes=Info->bwidth* 2 ;
	hbmp=CreateBitmapIndirect(&bmp);
	gdiobj=SelectObject(hdc,hbmp);

изменил на 32 бита и все нормально
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	hdc=CreateCompatibleDC( 0 );
	memset(&bmp, 0 ,sizeof(BITMAP));
	bmp.bmBitsPixel= 32 ;
	bmp.bmWidth=Info->bwidth;
	bmp.bmHeight=Info->bheight;
	bmp.bmBits=bitmapArray;
	bmp.bmPlanes= 1 ;
	bmp.bmWidthBytes=Info->bwidth* 4 ;
	hbmp=CreateBitmapIndirect(&bmp);
	gdiobj=SelectObject(hdc,hbmp);

может я в чем не прав?
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705454
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ste@lth wrote:

> вот и проверил, HDC имеет 32 бита, мне надо создать 16-битный битмап, в
> результате SelectObject возвращает 0
А как насчет GetLastError?

И, собственно, для чего вам именно 16-битный битмап? Как я понимаю, если вы
хотите его рисовать, то вам должно быть все-равно, сколько в нем цветов.
Если вам нужно выводитб на экран 16битный буфер с цветом, то лучше
использовать SetDIBitsToDevice
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705754
Ste@lth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно написать функцию формирующую битмап независимо от того на каком компе запускается, не привязываясь к контексту... и потом битмап не для вывода на экран а для формирования файла, посему и требуется иметь возможность менять глубину цвета как захочет пользователь...
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705759
Ste@lth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и GetLastError вернул 0
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705923
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ste@lth wrote:

> Нужно написать функцию формирующую битмап независимо от того на каком
> компе запускается, не привязываясь к контексту... и потом битмап не для
> вывода на экран а для формирования файла, посему и требуется иметь
> возможность менять глубину цвета как захочет пользователь...
Посмотрите дельфийские исходники TBitmap. Там это должно быть реализовано.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание независимого MemoryDC
    #34705925
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV wrote:

> Там это должно быть реализовано.
Просто я бы сделал свой класс, и рендерил бы содержимое через
SetDIBitsToDevice.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание независимого MemoryDC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]