Рисование сетки как в дизайнере

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Рисование сетки как в дизайнере

Сообщение 7bit » 05.07.2023 00:31:43

Приветствую, форумчане. Кто-нибудь знает как в дизайнере форм реализовано рисование сетки (точки на форме)? Куда смотреть в исходниках?
7bit
новенький
 
Сообщения: 36
Зарегистрирован: 01.10.2011 12:35:52

Re: Рисование сетки как в дизайнере

Сообщение Alex2013 » 05.07.2023 14:44:41

7bit писал(а):Приветствую, форумчане. Кто-нибудь знает как в дизайнере форм реализовано рисование сетки (точки на форме)? Куда смотреть в исходниках?

Не понял в чем проблема?

Код: Выделить всё
// Прорисовка  рабочего поля MagSize - размерность сетки .

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
   I,J:LongInt;

begin
//...
  I:=0;J:=0;

While I< ScrollBar1.Position+panel2.Height do begin
    Inc(i,MagSize);
    While J< ScrollBar2.Position+panel2.Width do begin
    Inc(J,MagSize);
    PaintBox1.Canvas.Pixels[j,i]:=clGray;
   end;
     j:=0;
  end;
//...
end;


Изображение
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Рисование сетки как в дизайнере

Сообщение 7bit » 05.07.2023 21:17:38

Медленно. Brush.Bitmap работает быстрее, но clDefault - черный. Думаю на этом варианте остановиться, но может есть вариант лучше. Вот как это в Lazarus реализовано?..
7bit
новенький
 
Сообщения: 36
Зарегистрирован: 01.10.2011 12:35:52

Re: Рисование сетки как в дизайнере

Сообщение Alex2013 » 05.07.2023 23:09:04

7bit писал(а):Медленно. Brush.Bitmap работает быстрее, но clDefault - черный. Думаю на этом варианте остановиться, но может есть вариант лучше. Вот как это в Lazarus реализовано?..

Разумеется Canvas.Pixels[j,i] очень медленный метод но там обычно несколько десятков точек отрисовать нужно .
Нужно быстрее ? Тогда например так.
Код: Выделить всё
// Только 24 Бита !
Procedure Set_Pixel(Var BB:TBitmap;X,Y,C:Integer);
Type
TA=Array[0..1] of byte;
var
PA:^TA;
n:integer;
begin
if bb = NIL then exit;
// if not InR(x,0,bb.Width-1) then exit;
// if not InR(y,0,bb.Height-1) then exit;

Bb.BeginUpdate; ;
pa:=Pointer(BB.RawImage.Data);
N:=Y*(BB.Width*3)+X*3;
pa^[n]  :=Blue(C);
pa^[n+1]:=Green(C);
pa^[n+2]:=red(C);
Bb.EndUpdate;
end;


А в Lazarus реализовано скорее всего через буферизацию ( просто не видно как прорисовывается )
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Рисование сетки как в дизайнере

Сообщение xchgeaxeax » 06.07.2023 00:31:25

Или создайте Bitmap размером в шаг сетки по вертикали и горизонтали, потом в координатах 0, 0 поставьте точку на этом Bitmap и после по этой Bitmap создайте PatternBrush

Код: Выделить всё
procedure TDisplayForm.FormPaint(Sender: TObject);
var
  brs: TBrush;
begin
  brs := TBrush.Create;
  brs.Bitmap := TBitmap.Create;
  with brs.Bitmap do begin
    Width := 10;
    Height := 10;
    Canvas.Pixels[0, 0] := clWhite;
  end;
  Canvas.Brush := brs;
  Canvas.FillRect(ClientRect);
end;
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Re: Рисование сетки как в дизайнере

Сообщение 7bit » 07.07.2023 00:04:06

xchgeaxeax писал(а):Или создайте Bitmap размером в шаг сетки по вертикали и горизонтали, потом в координатах 0, 0 поставьте точку на этом Bitmap и после по этой Bitmap создайте PatternBrush

Но в этом случае clDefault черный.
7bit
новенький
 
Сообщения: 36
Зарегистрирован: 01.10.2011 12:35:52

Re: Рисование сетки как в дизайнере

Сообщение xchgeaxeax » 07.07.2023 00:40:13

Вам надо рассказать как установить цвет кисти для фона Bitmap?

ADD: Вы не смогли повторить последнюю строчку внутри блока with .. do, предварительно установив там же Canvas.Brush.Color...
Screenshot_20230706_234752.png


P.S. Если опять не догадаетесь, тогда вы можете скопировать цвет Canvas.Brush.Color из Form1.Color, тогда цвет фона не поменяется, а только появятся точки.
P.S.S. Если Form1.Color = clDefault, тогда можно считать цвет фона из того же Canvas.Pixels[0, 0] вне блока with .. do. Если опять не догадаетесь...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Re: Рисование сетки как в дизайнере

Сообщение 7bit » 13.07.2023 22:40:14

xchgeaxeax писал(а):P.S.S. Если Form1.Color = clDefault, тогда можно считать цвет фона из того же Canvas.Pixels[0, 0] вне блока with .. do. Если опять не догадаетесь...

Спасибо, не догадался :)
7bit
новенький
 
Сообщения: 36
Зарегистрирован: 01.10.2011 12:35:52


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru