Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
1

Рисование фигур

19.06.2013, 20:58. Показов 3525. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я реализовал рисование прямоугольника и эллипса таким способом, как в пэинте (при нажатии и движении мыши фигура растягивается и стягивается), используя свойство Pen.Mode со значением pmNotXor при нажатии и движении, и pmCopy при отпускании. так вот, прямоугольник рисуется норм, а вот эллипс появляется только при отпускании кнопки мыши, когда мышь двигается его не видно. Для обоих инструментов весь код одинаковый, кроме методов рисования. Должно ли так быть, или всё же эллипс должен тоже рисоваться при движении мыши?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2013, 20:58
Ответы с готовыми решениями:

рисование фигур на image
Добрый вечер. Помогите пожалуйста сделать так что бы координаты фигур указывались курсором мышки....

Рисование фигур
Разобрался как нарисовать фигу, но как сделать когда зажал кнопку мыши то появляется контур этой...

Рисование фигур
написать программу которая спрашивает у пользователя какую фигуру надо нарисовать: 1 -...

Рисование фигур
Программа вывода прямоугольного треугольника заполненного звездочками с вершиной N с использование...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
21.06.2013, 12:18 2
Нормально эллипс рисуется при движении мыши (нарисовал прямо на форме, но смысл от этого не меняется):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if drawing then // нажата кнопка мыши?
  begin
    if (pX > -1) and (pY > -1) then // Предыдущие координаты мыши
      self.Canvas.Ellipse(sX, sY, pX, pY); // стираем старую окружность
 
    self.Canvas.Ellipse(sX, sY, X, Y); // и рисуем новую (sX, sY - точка, где мышь была нажата)
    pX := X; pY := Y; // На следующем шаге текущие координаты уже будут предыдущими
  end;
end;
Если у тебя не показывается - приводи свой код, что-то значит, делаешь не так...
1
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
21.06.2013, 22:30  [ТС] 3
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
StartX:=X;
StartY:=Y;
OldX:=X;
OldY:=Y;
If Ellipse.Down then // Кнопка инструмента "Эллипс"
    begin
    de:=True;
    Image1.Canvas.Pen.Mode:=pmNotXor;
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
If de then
 with Image1.Canvas do begin
 Canvas.Ellipse(StartX,StartY,OldX,OldY);
 Canvas.Ellipse(StartX,StartY,X,Y);
 OldX:=X;
 OldY:=Y;
 end;
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
If Ellipse.Down then
begin
Image1.Canvas.Pen.Mode:=pmCopy;
Image1.Canvas.Ellipse(StartX,StartY,X,Y);
de:=False;
end;
Не могу понять, что неправильно. Прямоугольник по аналогии отлично рисуется.
0
angstrom
21.06.2013, 23:21 4
Здесь у тебя логическая ошибка
Цитата Сообщение от Jonny_Hacker Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
  If de then
  with Image1.Canvas do begin
  Canvas.Ellipse(StartX,StartY,OldX,OldY);
  Canvas.Ellipse(StartX,StartY,X,Y);
  OldX:=X;
  OldY:=Y;
 end;
объявляешь with Image1.Canvas do, а затем рисуешь на форме Canvas.Ellipse(StartX,StartY,OldX,OldY)
исправь на
Delphi
1
2
3
4
5
6
7
8
  If de then
  with Image1.Canvas do
  begin
    Ellipse(StartPos.X, StartPos.Y, OldPos.X, OldPos.Y);
    Ellipse(StartPos.X, StartPos.Y, X, Y);
    OldPos.X := X;
    OldPos.Y := Y;
  end;
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
24.06.2013, 08:54  [ТС] 5
angstrom, с твоим кодом вообще какая то фигня получается - эллипс, который нужно нарисовать также не видно, но помимо этого рисуется ещё и левый эллипс))

UI, твой код функционирует также как мой - эллипса не видно.

Короче, вот прога (без ехешника).
0
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
24.06.2013, 08:55  [ТС] 6
Вот она
Вложения
Тип файла: rar graphedit.rar (57.3 Кб, 59 просмотров)
0
angstrom
24.06.2013, 11:11 7
Цитата Сообщение от Jonny_Hacker Посмотреть сообщение
с твоим кодом вообще какая то фигня получается
Да? Думаешь я не проверил, прежде чем писать? Прекрасно всё рисуется, если правильно делать.
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var
  StartPos, OldPos : TPoint;
  Capture : Boolean;
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  StartPos.X := X;
  StartPos.Y := Y;
  OldPos.X := X;
  OldPos.Y := Y;
//  if Ellipse.Down then
  with Image1.Canvas do
  begin
    Capture := True;
    Pen.Mode  := pmNotXor;
    Pen.Width := 1;
    Pen.Color := clBlack;
    Brush.Style := bsClear;
  end;
end;
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Capture then
  with Image1.Canvas do
  begin
    Ellipse(StartPos.X, StartPos.Y, OldPos.X, OldPos.Y);
    Ellipse(StartPos.X, StartPos.Y, X, Y);
    OldPos.X := X;
    OldPos.Y := Y;
  end;
end;
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
//  if Ellipse.Down then
  with Image1.Canvas do
  begin
    Pen.Mode := pmCopy;
    Ellipse(StartPos.X, StartPos.Y, X, Y);
    Capture := False;
  end;
end;
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
24.06.2013, 11:28  [ТС] 8
Прошу прощения, погарячился с выводами. И вправду, работает, спасибо! Но я всё равно не понимаю, почему прямоугольник с моим кодом рисуется отлично, а эллипс нет.
0
angstrom
24.06.2013, 11:33 9
С прямоугольником кода не видел, но может там нет той ошибки, что допущена при рисовании эллипса, когда идёт объявление - with Image1.Canvas, а рисовании проводится на канве формы - Canvas.Ellipse.
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
24.06.2013, 12:03  [ТС] 10
омг) Какой же я растяпа) Ты же объяснил ещё в первом сообщении, я только сейчас увидел. Спасибо большое за помощь!!!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
24.06.2013, 12:06 11
Цитата Сообщение от Jonny_Hacker Посмотреть сообщение
твой код функционирует также как мой - эллипса не видно.
Я не выкладываю непроверенные коды...
1
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 17
24.06.2013, 23:22  [ТС] 12
Извини UI, это я просто идиот) Но теперь я всё понял и буду осторожен с выводами. Спасибо, ребята!
0
24.06.2013, 23:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2013, 23:22
Помогаю со студенческими работами здесь

Рисование фигур
Описать базовый класс Фигура, который имеет один виртуальный метод void Draw (Graphics g). Описать...

Рисование фигур
Сделал пример с книги, должен по идее рисоваться круг и результат быть такой, как в книге: ...

Рисование фигур
Кароч, пытаюсь нарисовать несколько одинаковых элементов на экране, но вылезает ошибка, хз как...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru