![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
1. А чем вам мешают разные цвета?
2. From, To: TPoint; - координаты начала и конца линии, или координаты прямоугольник и т.п. |
|
#17
|
||||
|
||||
|
1- при наложении на паинтбокс последний наложеный цвет будет перекрывать тот что под ним,
2- имеешь ввиду такого вида? Код:
procedure Line(From, To, Attrib); //атрибуты.... VScreen.Canvas.MoveTo(From); VScreen.Canvas.LineTo(To); end; |
|
#18
|
||||
|
||||
|
Ясно. про первый вариант догнал.
Ну а по второму... тебе важно видеть что рисует твой оппонент в процессе рисования? или (допустим) достаточно увидеть то, что он нарисовал "фигуру"? |
|
#19
|
||||
|
||||
|
важно видеть процесс
|
|
#20
|
||||
|
||||
|
Дело в том, что я не знаю как ты реализуешь процесс отрисовки и какой результат хочешь получить. Как у тебя происходит рисование? Что должно передаваться оппоненту?
К примеру MsPaint: когда ты рисуешь линию, ты нажатием мышки устанавливаешь точку начала и, пока ты не отпустишь мышь, можешь "двигать" конец линии в произвольном положении. Так вот в чем вопрос: должен ли оппонент видеть как ты "таскаешь" конец линии, или же достаточно увидеть что линия нарисовалась от сих до сих?... ну а потом следующая фигура. |
|
#21
|
||||
|
||||
|
хм я пока делаю лишь простую рисовку без вссяких прямых линий
Код:
VScreen.Canvas.MoveTo(X, Y);
ClientSocket1.Socket.SendText('movet¶'+IntToStr(X)+'='+IntToStr(Y));
PaintBox1Paint(nil);Код:
VScreen.Canvas.LineTo(X, Y);
ClientSocket1.Socket.SendText('linet¶'+IntToStr(X)+'='+IntToStr(Y));
PaintBox1Paint(nil);и при получении такого пакета идет отрисовка вырезаются из него координаты и отрисовываем, тоесть выясняется что это нажатие или ведение мышки, и рисуется а и сам VScreen Код:
VScreen := TBitmap.Create; VScreen.Width:=PaintBox1.ClientWidth; VScreen.Height:=PaintBox1.ClientHeight; VScreen.Canvas.Pen.Color := clBlack; VScreen.Canvas.Pen.Width := 5; |
|
#22
|
|||
|
|||
|
Ну так надо отправлять X1, X2, Y1, Y2 для линии,
при OnMouseDown сохранять X1, Y1, при OnMouseUp сохранять X2, Y2 и все это отправлять, а на принимающей стороне, сохраняем координаты пера в, скажем, tmpX, tmpY, после рисуем линию, координаты которой приняли MoveTo(X1,Y1);LineTo(X2,Y2); и возвращаем перо на место: MoveTo(tmpX,tmpY); и тогда все будет норм. |
|
#23
|
||||
|
||||
|
дак у меня нет таких линий как ты говоришь,
допустим я вожу вожу мышкой и при отпускании у меня сохранятся координаты от начала до конца получится прямая обычная |
|
#24
|
||||
|
||||
|
А смысл пересылать МовТу, ЛайнТу? Может проще переслать координаты линии и все?
Я бы сделал так: Код:
type
TFigure = (fLine, fRectangle, fEllipse); // тип фигуры, которую рисуем (линия, прямоугольник, элипс)
TDrawCommand = packed record // команда на рисование
PenColor, BrushColor: TColor; // цвет кисти и цвет заливки
LineWidth: Integer; // толщина линии
BrushStyle: TBrushStyle; // стиль заливки
PenStyle: TPenStyle; // стиль линии
Figure: TFigure; // тип фигуры для отрисовки
Position: TRect; // положение фигуры
endВпринципе, это уже готовый пакет для передачи, причем с фиксированнм размером!!! Код:
Отправка:
var
cmd: TDrawCommand;
begin
with cmd do
begin
// выставляем нужные значения
end;
ClientSocket1.Socket.SendBuf(dc, SizeOf(cmd));
end;
Получение:
var
cmd: TDrawCommand;
begin
Socket.ReceiveBuf(cdm, SizeOf(cmd))
end;После получения не надо разбирать полученные данные! Единствоенное, надо контроллировать размер приходящих данных и т.п. (см. как работать с сокетами). Ну и уже вся информация для рисования есть! Поясню про Position: TRect; 1. Если у тебя тип фигуры fLine (линия), то Position.TopLeft - это начало линии (MoveTo), а Position.BottomRight - конец линии. 2. Если фигура fRectangle или fEllipse - это координаты прямоугольника, в который вписывается рисуемая фигура. Я бы так делал. |
|
#25
|
||||
|
||||
|
чтото я не понял как это например применять при рисовке самому на паинт боксе
|
|
#26
|
||||
|
||||
|
Поскольку все так плохо, пришлось сделать рабочий пример.
Итак, я не делал передачу по сети. Вместо этого у меня таймер раз в три секунды "выплевывает" команду на отрисовку случайно фигуры. Остальное все как в MsPaint ![]() Я реализовал буферный объект, который получает команды от всех рисующих, будь то по сети, будь то рисующий в своем окне....ну или таймер как в примере ![]() Последний раз редактировалось dr. F.I.N., 12.01.2012 в 17:09. |
|
#27
|
||||
|
||||
|
+
спасибо большое! незнаю будет ли нормально работать так как надо завтра буду тогда пытаться сделать) |
|
#28
|
||||
|
||||
|
Ну, собственно, нечего было делать и решил я реализовать сетевую рисовалку. Ничего не изменял в первой версии программы, только добавил сеть. Тестировал на одном компе (1 сервер) с 10 клиентами. Все красиво и без ошибок прошло. Конечно сетевой вариант реализован не в идеале, но работает. Всю задачу за тебя решил
![]() Последний раз редактировалось dr. F.I.N., 12.01.2012 в 17:09. |
|
#29
|
||||
|
||||
|
Спасибо, жаль конечно, я хотел сам доделать) в принципе так и сделаю по примеру этому)
Спасибо еще раз) |