Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: CL | DM;

Вниз

Вывод текста на bitmap   Найти похожие ветки 

 
vgb ©   (2003-12-07 21:19) [0]

Как реализовать сабж? В принципе вопрос можно свести к получению DC данного растра, (на всякий случай сообщаю - создан посредством вызова CreateDIBitmap).
Видел на данном форуме вопрос похожего характера (копирование экрана в BMP), там было предложено использовать TBitmap из модуля Graphics, в моем случае подобный подход, конечно же, тоже решает все вопросы, ну, по крайней мере, все кроме одного - я хочу РАЗОБРАТЬСЯ в этих дебрях Win API. Посему данный подход не приемлем…


 
ДухКороляАртура ©   (2003-12-07 21:48) [1]


procedure TForm1.Button1Click(Sender: TObject);
var
OldBkMode : Integer;
begin
Image1.Picture.Bitmap.Canvas.Font.Color := clBlue;
OldBkMode := SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,TRANSPARENT);
Image1.Picture.Bitmap.Canvas.TextOut(10, 10, "Hi everybody");
SetBkMode(Image1.Picture.Bitmap.Canvas.Handle,OldBkMode);
end;


 
VGB ©   (2003-12-07 23:29) [2]

To ДухКороляАртура © (07.12.03 21:48) [1]
Хм... Интересный подход с учетом того, что это раздел WinAPI:)

А более существенные реализации будут???


 
Игорь Шевченко ©   (2003-12-07 23:34) [3]

VGB © (07.12.03 23:29)

Hint: В модуле Graphics.pas все на WinAPI написано...


 
MBo ©   (2003-12-08 07:04) [4]

>к получению DC данного растра
Это неверно.

Общие принципы: битмап выбирается в контекст устройства, и текст выводится (например, TextOut) на этот контекст.


 
vgb ©   (2003-12-08 14:18) [5]

Всем большое спасибо за уделенное внимание моему вопросу, проблема решена. Кому интересно сообщаю:

После просмотра модуля Graphics (до чего же не люблю ковырятся в исходниках VCL...), а также повторного просмотра Helpа выяснилось, что

1. Мой вопрос был несколько некорректно составлен, т.к. HBitmap, HBrush, HPen и т.д. одного поля ягоды т.е. HGDIOBJ. И как уже сказал MBo


> битмап выбирается в контекст устройства,
> и текст выводится (например, TextOut) на этот контекст.


2. Из описания SelectObject:
"Bitmaps can be selected for memory device contexts only, and for only one device context at a time."

3. Несложно было выяснить что этот самый memory device context можно получить путем CreateCompatibleDC.

Собрав все в кучу получаем (пишу по памяти):


var
bmp: HBitmap;
DC, bmpDC: HDC;
...

begin
...
DC:= GetDC(MainWindowHandle);
CreateDIBitmap(DC, ...);
...
bmpDC:= CreateCompatibleDC(DC);
SelectObject(bmpDC, bmp);
//А вот теперь можно и TextOut и Rectangle на растр:)))
TextOut(bmpDC, "Я сделал ЭТО!!!", 15);
...
//Есесно не забыть вернуть все ресурсы
end;


To ALL
Предложение: ИМХО не плохо было бы нацарапать статейку на эту тему, она бы многим ОЧЕНЬ помогла разабраться в этих АПИ, по крайней мере таким как я:)

PS: HELP это СИЛА...


 
VGB ©   (2003-12-08 21:10) [6]

Какого %%%, у меня снова проблема:(

перед созданием растра (квадратной формы) функцией CreateDIBitmap пытаюсь инициализировать массив битов содержащий цвета, чтобы получить, к примеру красный фон

var
Bits: PByteArray;
Width, i: Integer;
...
begin
...
GetMem(Bits, 3 * Width * Width);
for i:=0 to 3 * Width * Width - 1 do
case i mod 3 of
0: Bits[i]:= 0;
1: Bits[i]:= 0;
2: Bits[i]:= 255;
end;
...
end;

Но вот беда, обнаружилось, что если квадратный растр имеет ширину 4n или 4n+3, то все пучкем, битмап красный.
Но если он имеет ширину 4n+1 или 4n+2, то он заполняется горизонтальными полосами в один пиксель красного, зеленого и синего.

Помогите, по какому правилу заполнять данный массив в зависимости от ширины и высоты растра. С квадратными, путем некоторых подсчетов, я может и разберусь, но если придется и для прямоугольных расчитывать, я просто %%%%%%%...
Жду готовых рещений:) Буду очень признателен.

PS: Можно конечно просто залить битмап, но понять данный принцип всеже охото, а вось пригодится, я даже уверен в этом...


 
miek ©   (2003-12-08 21:46) [7]

Все дело в формате растра. Если формат 8, 16 или 24 бит, то в конце скан-линий добавляются байты выравнивания, которые и сбивают всю заливку. Нужно заливать по скан-линийм, а не весь блок целиком.


 
VGB ©   (2003-12-08 22:55) [8]

To miek © (08.12.03 21:46) [7]
Ага!!!, теперь понятно, выходит также, что если все же заливать весь блок, то я не правильно расчитывал размер выделяемый для хранения байтов (ну и соответственно инициализировал), т.к. не учитывал это. Чтож, теперь с заливкой по сканлиниям все понятно, буду разбираться с заливкой целиком.
ОГРОМНОЕ СПАСИБО за предоставленную информацию!!!



Страницы: 1 вся ветка

Текущий архив: 2004.02.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-29314
elected
2004-01-30 00:09
2004.02.10
Как сделать виртуальный файл.


3-29225
highlander
2004-01-19 14:31
2004.02.10
Хитрый запрос :)


14-29603
Натуся
2004-01-18 18:15
2004.02.10
Цифры в буквы


3-29227
qwe
2004-01-19 20:06
2004.02.10
execute statement


3-29232
Марат
2004-01-19 14:03
2004.02.10
DBGrid