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

Рисование в Delphi по нажатию левой кнопки мыши

13.06.2019, 20:47. Показов 2992. Ответов 9

Author24 — интернет-сервис помощи студентам
Всем привет, как сделать так, чтобы рисование производилось в процедурах PicMouseDown и PicMouseMove по зажатию левой кнопки мыши, а не по определению координат курсора мыши с последующим рисованием. Что нужно изменить?Заранее большое спасибо.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
procedure TForm1.picMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
press:=true;
x0:=x;
y0:=y;
x2:=x;
y2:=y;
bmp.Canvas.Moveto(x,y);
c:=true;
 
if (LineButton.Down)or (RectButton.Down) or (EllipseButton.Down)then
begin
bmp.Canvas.Pen.Mode:=pmnotxor;
c:=false;
if not Press then exit;
press:=false;
bmp1.transparentcolor:=colordialog1.Color;
 
if ColorDelete.Down then
begin
bmp1.Transparent:=true;
bmp1.Canvas.CopyRect(Rect(0,0,bmp1.width,bmp1.height),bmp.Canvas,Rect(0,0,bmp.Width,bmp.Height));
with bmp.Canvas do
begin
pen.Mode:=pmcopy;pen.Color:=clwhite;
pen.Width:=4; lineto(x,y);
end;
bmp.Canvas.Draw(0,0,bmp1);
end;
 
if DeleteButton.Down then
bmp.Canvas.Pen.Color:=clwhite;
end;
 
if FloodFillButton.Down then
if Button = mbLeft then
begin
bmp.Canvas.Brush.Color:=ColorBox1.Selected;
bmp.Canvas.FloodFill(x,y,bmp.Canvas.Pixels[x,y],fsSurface);
end
else begin
  bmp.Canvas.Brush.Color:=cl;
  bmp.Canvas.FloodFill(x,y,bmp.Canvas.Pixels[x,y],fsSurface)
end;
PicPaint(Sender);
 
 
end;
 
procedure TForm1.picMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
x3:=x;y3:=y;
if not Press then
begin
  if (ColorDelete.Down=true) or (DeleteButton.Down=True) then
begin
Pic.Canvas.Draw(0,0,bmp);
Pic.Canvas.Draw(x-3,y-3,bmp2);
end;
Exit
end;
 
if RectButton.Down then
begin
bmp.Canvas.Brush.Style:=bssolid;
bmp.Canvas.Rectangle(x0,y0,x,y);
x2:=x;y2:=y;
bmp.Canvas.Brush.Style:=bsSolid;
end;
 
if EllipseButton.Down then
begin
bmp.Canvas.Brush.Style:=bsClear;
bmp.Canvas.Ellipse(x0,y0,x2,y2);
bmp.Canvas.Ellipse(x0,y0,x,y);
x2:=x;y2:=y;
bmp.Canvas.Brush.Style:=bsSolid;
end;
 
if (PencilButton.Down) then bmp.Canvas.LineTo(x,y);
 
if DeleteButton.Down then
begin
with bmp.Canvas do
begin
Pen.Color:=clWhite;
LineTo(x,y)
end;
end;
 
if ColorDelete.Down then
begin
bmp1.Transparent:=true;
bmp1.Canvas.CopyRect(Rect(0,0,bmp1.width,bmp1.Height),bmp.Canvas,Rect(0,0,bmp.Width,bmp.height));
bmp1.transparentcolor:=colordialog1.Color;
with bmp.Canvas do
begin
pen.Mode:=pmCopy;
pen.Color:=clWhite;
pen.Color:=clWhite;
pen.Width:=2;
lineto(x,y);
end;
end;
 
if LineButton.Down then
begin
with bmp.Canvas do
begin
moveto(x0,y0);lineto(x2,y2);
moveto(x0,y0);lineto(x,y);
x2:=x;y2:=y;
end;
end;
 
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2019, 20:47
Ответы с готовыми решениями:

Автокликер (по нажатию левой кнопки мыши)
Вообщем нужно сделать простенький автокликер, в секунду кликал 15-18 кликов желательно что-бы...

Появление рисунка по нажатию левой кнопки мыши
Всем привет!Я хотел у вас поинтересоваться,как реализовать следующее: Нажатие левой кнопки мыши ->...

Открытие/закрытие окна по нажатию/отжатию левой кнопки мыши
Нужно чтобы программа выполняла открытие дочернего окна при нажатии левой кнопки мыши, а при...

Как реализовать комбо атаки по нажатию левой кнопки мыши?
есть три анимации для удара персонажа, обрабатываю атаку в скрипте по нажатию на Mouse0, как можно...

9
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.06.2019, 21:23 2
чтобы рисование производилось в процедурах PicMouseDown и PicMouseMove по зажатию левой кнопки мыши,
По нажатию кнопки мыши только в процедуре OnMouseDown, а что нужно нарисовать по нажатию?
0
1 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 116
13.06.2019, 21:26  [ТС] 3
LineButton нужно)
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.06.2019, 21:30 4
Думаете Вы что-то объяснили?
0
1 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 116
13.06.2019, 21:35  [ТС] 5
Мне рисование обычным карандашом необходимо, такое рисование похожее как у Paint, не знаю как сделать что-то типа такого. А не один раз нажмёшь на карандаш и дальше не отменишь рисование по нажатию левой кнопки мыши
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.06.2019, 21:50 6
Вообще мышью рисуют так (на канве формы)
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
var
  Form1: TForm1;
  f:boolean;
implementation
 
{$R *.dfm}
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if ssleft in shift then
 begin
  f:=true;
  canvas.Moveto(x,y);
 end;
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if f then Canvas.Lineto(x, y);
end;
 
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
f:=false;
end;
0
1 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 116
18.06.2019, 17:31  [ТС] 7
Delphi
1
if ssleft in shift then
что означает эта строчка кода?)
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
18.06.2019, 17:33 8
Если нажата левая кнопка мыши.
0
Модератор
3635 / 2153 / 762
Регистрация: 15.11.2015
Сообщений: 8,644
18.06.2019, 17:46 9
Цитата Сообщение от Evgeny20 Посмотреть сообщение
что означает эта строчка кода?)
Переменная Shift имеет тип TShiftState. А он определён так:
Delphi
1
2
  TShiftState = set of (ssShift, ssAlt, ssCtrl,
    ssLeft, ssRight, ssMiddle, ssDouble);
Конструкция ssleft in shift проверяет, есть ли в Shift значение ssLeft и возвращает true если есть.

Добавлено через 38 секунд
Одновременно там могут быть несколько значений.

Добавлено через 3 минуты
Ещё можно проверять переменную Button. Она может иметь только одно значение.
Delphi
1
if Button = mbLeft then ...
1
1 / 1 / 0
Регистрация: 09.09.2017
Сообщений: 116
18.06.2019, 20:17  [ТС] 10
спасибо, хотел спросить насчёт одной ошибки: когда рисую карандашом PencilButton, тогда работают кнопки и EllipseButton, RectButton,LineButton. Фигуры можно нарисовать в данном случае, а если не рисовать карандашом, то не работает рисование фигур, кнопки не работают
Delphi
1
2
Этот способ попроще выглядит с рисованием по нажатию левой кнопки мыши
if Button = mbLeft then ...
Добавлено через 48 минут
забыл добавить процедуру противоположную OnMouseDown
проблема с PencilButton решилась, рисует по нажатию левой кнопки мыши, но вот c LineButton, RectButton, EllipseButton так не рисует почему-то
Delphi
1
2
3
4
5
procedure TForm1.picMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
press:=false;
end;
0
18.06.2019, 20:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2019, 20:17
Помогаю со студенческими работами здесь

Обменять верхнюю и нижнюю части экрана по нажатию левой кнопки мыши
Доброго времени суток! Нужна программа, которая заполнит 0-ю страницу видеопамяти произвольным...

Смена картинки в picturebox winforms по нажатию правой/левой кнопки мыши
как реализовать смену картинки по правому или левому/нажатию кнопки мыши? Помогите плиз

Обменять верхнюю и нижнюю части экрана по нажатию левой кнопки мыши
Задание: Заполнить 0-вую строку видеопамяти любым текстом. При нажатии на леву клавишу мышки...

Рисование мышкой. При нажатии левой кнопки мыши и ее перемещении рисуется кривая
У меня vb 2010 надо написать программу при нажатии левой кнопки мышки и ее перемещении рисуется...


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

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