Форум: "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.01 c