Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объясните пожалуйста как пользоваться scanline и region?


MVP ©   (2006-04-02 14:22:00) 

Допустим scanline форму и все черные пикселы в ней поменять  на белые?

А так же как пользоваться region?
CreateEllipticRgn, CombineRgn, OffsetRgn, PaintRgn и т.п.?
Применение:
1. Создаем эллипт. регион, отрезаем с помощью combine линшнее,
повторяем скока надо.
2. Объединяем с помощью combine.
3. Оффсетом на 1 делаем восемь регионов - выше/ниже, правее/левее, комбинация. Объединяем.
4. Из п.3 вырезаем п.2.
5. Рисуем п.4.

CreateEllipticRgn - задаю его, а он не отображается на форме. Я не знаю как его правильно применить.


MVP   (2006-04-02 17:59:00) [1]

Ну в смысле Красными линиями сверху на рисунке


MVP   (2006-04-02 17:32:00) [2]

var
Rgn : array [1..12] of Cardinal;
begin
with Image1 do
Canvas.Brush.Color := clRed;
Canvas.Pen.Color := clRed;
Rgn[1] := CreateEllipticRgn (100, 100, 200, 200);
Rgn[2] := CreaterectRgn (50, 50, 150, 150);
Rgn[3] := CreaterectRgn (50, 50, 150, 150);
Rgn[4] := CreaterectRgn (50, 50, 150, 150);
Rgn[5] := CreaterectRgn (50, 50, 150, 150);
Rgn[6] := CreaterectRgn (50, 50, 150, 150);
CombineRgn (Rgn[2], Rgn[1], Rgn[2], RGN_AND);
CombineRgn (Rgn[3], Rgn[1], Rgn[3], RGN_AND);
CombineRgn (Rgn[4], Rgn[1], Rgn[4], RGN_AND);
CombineRgn (Rgn[5], Rgn[1], Rgn[5], RGN_AND);
CombineRgn (Rgn[6], Rgn[1], Rgn[6], RGN_AND);
//CombineRgn (Rgn[1], Rgn[1], Rgn[2], RGN_AND);
OffsetRgn(Rgn[3], 1, 0);
OffsetRgn(Rgn[4], 0, 1);
OffsetRgn(Rgn[5], -1, 0);
OffsetRgn(Rgn[6], 0, -1);
//CombineRgn (Rgn[3], Rgn[1], Rgn[3], RGN_XOR);
CombineRgn (Rgn[3], Rgn[2], Rgn[3], RGN_XOR);
CombineRgn (Rgn[4], Rgn[2], Rgn[4], RGN_XOR);
CombineRgn (Rgn[5], Rgn[2], Rgn[5], RGN_XOR);
CombineRgn (Rgn[6], Rgn[2], Rgn[6], RGN_XOR);
PaintRgn(Canvas.Handle, rgn[3]);
PaintRgn(Canvas.Handle, rgn[4]);
PaintRgn(Canvas.Handle, rgn[5]);
PaintRgn(Canvas.Handle, rgn[6]);

Простите, если я надоел. Но вот полученный сектор я XORом вывожу сверху на Image, и его цвет не красный, а типа как негатив какой-то. Как выводить чтоб было красная линия, а под ней прозрачный фон?


antonn   (2006-04-02 17:22:00) [3]

MVP   (02.04.06 14:22)
Допустим scanline форму и все черные пикселы в ней поменять  на белые?

сканлайн только у TBitmap
http://kladovka.net.ru/index.cgi?pid=list&rid=252(там нет комментов, только код)


EvS   (2006-04-02 17:06:00) [4]

Что неверно?

Rgn[3] := Rgn[1];


MBo   (2006-04-02 17:03:00) [5]

>Что неверно?
Это один и тот же регион.
Копию можно создать через CombineRGN c RGN_COPY


MVP   (2006-04-02 16:58:00) [6]

var
Rgn : array [1..12] of Cardinal;
begin
Canvas.Brush.Color := clRed;
Canvas.Pen.Color := clRed;
Rgn[1] := CreateEllipticRgn (100, 100, 200, 200);
Rgn[2] := CreaterectRgn (50, 50, 150, 150);
CombineRgn (Rgn[1], Rgn[1], Rgn[2], RGN_AND);
Rgn[3] := Rgn[1];
OffsetRgn(Rgn[3], 100, 100);
PaintRgn(Canvas.Handle, rgn[1]);


С помощью ОффСета, хочу получить копию Rgn[1], только смещенную на 100, 100. При выводе как Rgn[1] так и Rgn[3], получаются смещенными на 100, 100. Что неверно?


MVP   (2006-04-02 15:53:00) [7]


> Рисуй на канве формы в обработчике события OnPaint

А на Битмап никак нельзя?


MVP   (2006-04-02 15:49:00) [8]

Просто я уже писал, мне нужны контура пересекающихся фигур.
Я использую так
if Pixels = цвет такой-то then Pixels := цвет такой-то

Выходит очень долго, и ещё зависит от частоты проца, мне посоветовали сделать или регионами или сканлайном. Но как пользоваться или тем или тем я не понимаю. Объясните пожалуйста.


MVP   (2006-04-02 15:43:00) [9]

а объясни как, я не пойму, что битмап убрать и рисовать в ОнПаинт на канве формы?
И ещё, со сканлайнами не поможешь?
Допустим scanline форму и все черные пикселы в ней поменять  на белые?


Джо   (2006-04-02 15:39:00) [10]

> [5] MVP   (02.04.06 15:32)
> Ну в смысле чтоб отображалось на форме

Рисуй на канве формы в обработчике события OnPaint.


MVP   (2006-04-02 15:32:00) [11]

Ну в смысле чтоб отображалось на форме


MVP   (2006-04-02 15:24:00) [12]

ааа, а мне надо на канву


Джо   (2006-04-02 15:17:00) [13]

> вот пишу, что тут неправильно, регион не прорисовывается

А на чем он должен прорисовываться? В приведенном коде все рисуется на изображении "в памяти", визуального отображения нет.


MVP   (2006-04-02 15:13:00) [14]

var
Bit : TBitmap;
Rgn:Cardinal;
begin
Bit := TBitmap.Create;
Bit.Width := 300;
Bit.Height := 300;
Bit.Canvas.Brush.Color := clRed;
Bit.Canvas.Pen.Color := clRed;
Rgn := CreateEllipticRgn (100, 100, 200, 200);
FillRgn(Bit.Canvas.Handle, rgn, Bit.Canvas.Brush.Handle);
Bit.Free;

вот пишу, что тут неправильно, регион не прорисовывается

и со сканлайном, помогите плиз


MBo   (2006-04-02 14:35:00) [15]

в справке Region Functions  есть несколько функций для рисования регионов


Наверх

Титульная страница Поиск, карта сайта Написать письмо