Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Вниз

Вывод текста на 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
7-29635
ikivio
2003-11-23 07:38
2004.02.10
Привилегии записи в реестр.


4-29651
AlexEN
2003-12-08 07:32
2004.02.10
Перемешение формы.


3-29248
Vic
2004-01-19 10:26
2004.02.10
Список таблиц access


14-29550
SPeller
2004-01-20 18:48
2004.02.10
Баг в Дельфи или что-то другое?


1-29330
dima_matrix
2004-01-27 20:55
2004.02.10
Форма в новом потоке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский