Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.03.2011, 23:55
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию рисование на PaintBox

собственно делаю рисовалку для двоих, человек создает сервер и к нему подключаешься и рисуете вместе,
Передаю при рисовании координаты другому человеку и там принимаю и рисую, но проблема в том что принимаютсяони почемуто както с краю все чиркаются линии коряво,
и еще вопрос, отриовку твою и второго нужно разными ведь
???:= T8Bit.Create; делать, иначе если только одним то часто менять нужно будет атрибуты притом что в это время рисует он и ты, но вот пробовал двумя разными
Код:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Draw(-10, -10, VScreen);
PaintBox1.Canvas.Draw(-10, -10, VScreen2);

так на PaintBox1 видно только 1 последний VScreen2, как их отрисвать чтоб оба были видны?
Ответить с цитированием
  #2  
Старый 17.03.2011, 15:21
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

вроде решил проблему с координатами
но вот проблема мне бы от второго человека рисовать другой переменной T8bit все бы ничего рисую ей но в событии

Код:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Draw(-10, -10, VScreen);
end;

если давать еще
Код:
PaintBox1.Canvas.Draw(-10, -10, VScreen); 
PaintBox1.Canvas.Draw(-10, -10, "VScreen2");
то показывается только рисунок от VScreen2 тобишь последнего, как сделать чтобы рисунок был от двух виден?

Последний раз редактировалось ALexandr555, 17.03.2011 в 15:31.
Ответить с цитированием
  #3  
Старый 17.03.2011, 16:16
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Либо использовать TransparentColor, либо передавать не изображение, а массив точек, или линий, которые добавил пользователь, то есть холст должен быть один, а рисуют на нем двое, если один рисует линию, то передаем на сервер ее координаты вместе с атрибутами и отрисовываем.
Так же, можно пойти и другим путем, в начале программы создаем холст и копию холста, когда отправляется пакет, то сравниваем оба холста, создаем массив разницы точек и отправляем его, и сохраняем новую копию холста.
Ответить с цитированием
  #4  
Старый 17.03.2011, 16:28
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
передаем на сервер ее координаты вместе с атрибутами и отрисовываем
так и делаю так вы имеете ввиду как же рисовать линию?
Ответить с цитированием
  #5  
Старый 17.03.2011, 17:28
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

И так, все сначала, что вы хотите? Что конкретно не получается? Что вы передаете из клиентской части серверной?, и что передает серверная часть клиентской? Что такое VScreen и VScreen2?

Сдается мне вы неправильный способ изначально начали проробатывать, ответьте на вышеуказанные вопросы и я подскажу как лучше сделать.
Ответить с цитированием
  #6  
Старый 17.03.2011, 17:52
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MouseDowned then
    begin
      X:=X+10;
      Y:=Y+10;
      VScreen.Canvas.LineTo(X, Y);
      serversocket1.socket.connections[1].sendtext('linet¶'+IntToStr(X)+'='+IntToStr(Y));
      PaintBox1Paint(nil);
    end;
end;

Вот при движении рисую и отправляю координаты, там все отрисовывается как надо, но в если я буду отправлять с атрибутами и прочим, то в это время же, рисовать человек у себя тоже может, и выйдет что если сменить атрибут то сменится и у тебя, и в это время могут то линии другие начиркаться, то твой цвет в другой перейдет.

Поэтому я и хотел сделать две переменные.
Код:
  VScreen: T8Bit;
  VScreen2: T8Bit;
Одна твоя, другая второго человека, чтобы косяков не было такихю

Код:
VScreen := T8Bit.Create;
  VScreen.Init(PaintBox1.Width + 20, PaintBox1.Height + 20);
  VScreen.Canvas.Pen.Color := clBlack;
  VScreen.Canvas.Pen.Width := 5;
VScreen2:= T8Bit.Create;
  VScreen2.Init(PaintBox1.Width + 20, PaintBox1.Height + 20);
  VScreen2.Canvas.Pen.Color := clBlack;
  VScreen2.Canvas.Pen.Width := 5;

создаются они так

сам класс 8бит

Код:
T8Bit = class(TBitmap)   // класс восьмибитной картинки с градациями серого
  private
    Scan: array[0..1023{этим числом ограничена максимальная высота}] of PByte;
    BitHeight, BitWidth:Integer;
  public
    constructor Create; override;
    procedure Init(AWidth, AHeight: Integer);
    procedure Clear(Color: Byte);
  end;

init процедура что при создании
Код:
procedure T8Bit.Init(AWidth, AHeight: Integer);
var i:Integer;
    Pal:PLogPalette;
    NewPal:HPalette;
begin
  PixelFormat := pf8bit;
  Width := AWidth;
  Height := AHeight;
  BitHeight:=AHeight;
  BitWidth:=AWidth;
  GetMem(Pal, 256*4 + 40);
  Pal.palVersion := $300;
  Pal.palNumEntries := 256;

  for i := 0 to 255 do
  begin
    Pal.palPalEntry[i].peRed :=   Byte(i);
    Pal.palPalEntry[i].peGreen := Byte(i);
    Pal.palPalEntry[i].peBlue :=  Byte(i);
    Pal.palPalEntry[i].peFlags:=0;
  end;
  NewPal := CreatePalette( Pal^ );
  Palette := NewPal;
  GDIFlush;
  FreeMem(Pal);


  for i:=0 to BitHeight-1 do
    begin
      Scan[i]:=ScanLine[i];
      FillChar(PByte(Scan[i])^, AWidth, 255);
    end;

end;

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

Последний раз редактировалось ALexandr555, 17.03.2011 в 18:00.
Ответить с цитированием
  #7  
Старый 17.03.2011, 19:21
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

а ну так проблема то в чем
Код:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Draw(-10, -10, VScreen);
end;

вот эта операция должна выполняться после неё токо отображается рисунок если выполняется
Код:
PaintBox1.Canvas.Draw(-10, -10, VScreen);
то видно только надписи нарисованные VScreen
Код:
VScreen.Canvas.LineTo(X, Y);
а если выполнять
Код:
 PaintBox1.Canvas.Draw(-10, -10, VScreen2);
то видны надписи нарисованные только VScreen2
Код:
VScreen2.Canvas.LineTo(X, Y);
тобишь другим человеком вобщем выходит либо твое либо другого ты можешь видеть, мне кажется должно быть чтото чтобы видеть обе
Ответить с цитированием
  #8  
Старый 17.03.2011, 20:03
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

как понял VScreen это буфер с него и выводится на пинт бокс, нельзя ли вот одновременно рисовать в один буфер просто при одновременном рисовании сбивается,
Код:
VScreen.Canvas.LineTo(X, Y);
рисует один человек, и тут приходит от другого человека
Код:
VScreen.Canvas.LineTo(X, Y);
и из за этого от черточки того места где рисует один человек, рисуется черточка к месту где рисует другой
Ответить с цитированием
  #9  
Старый 18.03.2011, 02:48
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от ALexandr555
если сменить атрибут то сменится и у тебя
Перед отрисовкой, надо сохранить старое состояние атрибутов пера, применить новые, отрисовать, и вернуть на старые. Тогда все будет норм.
Цитата:
Сообщение от ALexandr555
и из за этого от черточки того места где рисует один человек, рисуется черточка к месту где рисует другой
Передавать надо не только координаты последней точки, но и координаты первой (откуда начато рисование), а перед отрисовкой линии устанавливать перо в новое положение MoveTO(X,Y), сохраняя старое, после отрисовки возвращать перо на старое положение, тогда проблем не будет.

Вывести VScreen и VScreen2 на один холст без (частичных) потерь невозможно, для вашего варианта должен существовать только один VScreen, на котором должна воспроизводится отрисовка с обоих компьютеров.

Пакеты отправляемые через serversocket1 надо разделять каким либо способом, а на принимающей стороне, следить приходящими пакетами, так как могут быть отправлены две и более линий в одном пакете, то есть будет два запроса, но они могут прийти одним пакетом, эту ситуацию надо отрабатывать.
Ответить с цитированием
  #10  
Старый 18.03.2011, 13:52
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Перед отрисовкой, надо сохранить старое состояние атрибутов пера, применить новые, отрисовать, и вернуть на старые. Тогда все будет норм.
так то да в принципе так наверно и над будет делать но проблема в
Цитата:
Передавать надо не только координаты последней точки, но и координаты первой (откуда начато рисование), а перед отрисовкой линии устанавливать перо в новое положение MoveTO(X,Y), сохраняя старое, после отрисовки возвращать перо на старое положение, тогда проблем не будет.
ну я пробовал MoveTO(X,Y), при быстром движении одни точки


Цитата:
Пакеты отправляемые через serversocket1 надо разделять каким либо способом, а на принимающей стороне, следить приходящими пакетами, так как могут быть отправлены две и более линий в одном пакете, то есть будет два запроса, но они могут прийти одним пакетом, эту ситуацию надо отрабатывать.
с этим проблем нет я тестировал все обрабатывается если в пакете больше 1 одного какого либо значения
Ответить с цитированием
  #11  
Старый 18.03.2011, 14:57
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

я склоняюсь к тому чтобы добавить в canvas MoveTo2 и LineTo2
Ответить с цитированием
  #12  
Старый 18.03.2011, 15:50
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Что не получается, я вот предыдущего не понял, что значит когда быстро двигаешь, только точки получаются, пиши внятнее. детальнее, разберемся..
Ответить с цитированием
  #13  
Старый 18.03.2011, 17:01
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Я вижу 2 варианта:
1. Если использовать для каждого рисующего отдельный буфер (TBitmap), то можно делать маску изображения и потом на пейнт бох накладывать изображение по маске.
2. Создать (к примеру) "буфер" атрибутов на каждого рисующего. И не делать MoveTo, LineTo, а набор процедур типа Line(From, To, Attrib), где Attrib - атрибуты рисующего.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #14  
Старый 18.03.2011, 17:23
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Asinkrit
если команды вида
Код:
VScreen.Canvas.MoveTo(X, Y);
 VScreen.Canvas.LineTo(X,Y);
при быстром движении мышкой, они не соединяются, точки рисуются
Ответить с цитированием
  #15  
Старый 18.03.2011, 17:59
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Я вижу 2 варианта:
1. Если использовать для каждого рисующего отдельный буфер (TBitmap), то можно делать маску изображения и потом на пейнт бох накладывать изображение по маске.
2. Создать (к примеру) "буфер" атрибутов на каждого рисующего. И не делать MoveTo, LineTo, а набор процедур типа Line(From, To, Attrib), где Attrib - атрибуты рисующего.
1- если цвета разные увы не будет нормально, будет накладываться цвет последнего
2- не совсем понял что будут эти процедуры делать и что значат From, To
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter