Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1

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

15.05.2016, 15:19. Показов 2976. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Проблема с рисованием на Image.
Мне нужно нарисовать круг и квадрат.

Позиции первоначальной точки я получаю из события от MouseDown (Image) и далее в MouseMove(Image) идет рисование объекта от начальной точки до той куда ведет пользователь, НО ВОТ НЕЗАДАЧА рисуется как бы наложением т.е я к примеру потянул в нижний угол а потом "ОЙ я не хотел так много закрашивать" и потянул посредине, и тут я вижу такую картину что все тупо закрасилось и не вернуть в исходное состояние.

Как сделать чтобы пользователь мог закрасить именно то что ему надо даже если он ошибся и выделил слишком много?

У меня стоит прозрачность т.е рисую только линии не закрашивая внутренности прямоугольника\круга, но опять же какая-то фигня! Рисуется прозрачно но почему то создает линии еще внутри ><. Как этого избежать?

Код:

C++
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <time.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit9.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm9 *Form9;
 
int X1,Y1,X2,Y2;
int drw;
bool lock = false;
//---------------------------------------------------------------------------
__fastcall TForm9::TForm9(TComponent* Owner)
    : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm9::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
    if(lock == true)
    {
        if(drw == 1)
        {
            Image1->Canvas->LineTo(X,Y);
            Image1->Canvas->Pen->Width = 2;
            Image1->Canvas->Pen->Color = clRed;
        }
        if(drw == 2)
        {
            Image1->Canvas->Brush->Style=bsClear;
            Image1->Canvas->Pen->Width = 10;
            Image1->Canvas->Pen->Color = clGreen;
            Image1->Canvas->Ellipse(X1,Y1,X,Y);
        }
        if(drw == 3)
        {
            Image1->Canvas->Pen->Width = 10;
            Image1->Canvas->Brush->Style=bsClear;
            Image1->Canvas->Pen->Color = clGreen;
            Image1->Canvas->Rectangle(X1,Y1,X,Y);
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm9::AddText1Click(TObject *Sender)
{
    Edit1->Left = X1;
    Edit1->Top = Y1;
    Button1->Top = Y1;
    Button1->Left = X1 + 125;
    Button2->Top = Y1;
    Button2->Left = X1 + 175;
    Button3->Top = Y1;
    Button3->Left = X1 + 225;
    Edit1->Visible = true;
    Button1->Visible = true;
    Button2->Visible = true;
    Button3->Visible = true;
    X2=X1;
    Y2=Y1;
    drw = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm9::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if(Key == 13)
    {
        Image1->Canvas->Brush->Style=bsClear;
        Image1->Canvas->TextOutW(X2,Y2,Edit1->Text);
        Edit1->Clear();
        Edit1->Visible = false;
        Button1->Visible = false;
        Button2->Visible = false;
        Button3->Visible = false;
    }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm9::Button1Click(TObject *Sender)
{
    if(FontDialog1->Execute())
    {
        Edit1->Font->Color = FontDialog1->Font->Color;
        Edit1->Font->Name = FontDialog1->Font->Name;
        Edit1->Font->Size = FontDialog1->Font->Size;
        Edit1->Font->Charset = FontDialog1->Font->Charset;
        Image1->Canvas->Font->Color = FontDialog1->Font->Color;
        Image1->Canvas->Font->Name = FontDialog1->Font->Name;
        Image1->Canvas->Font->Size = FontDialog1->Font->Size;
        Image1->Canvas->Font->Charset = FontDialog1->Font->Charset;
        Button1->Height = Edit1->Height;
        Button2->Height = Edit1->Height;
        Button3->Height = Edit1->Height;
    }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm9::Button2Click(TObject *Sender)
{
        Image1->Canvas->Brush->Style=bsClear;
        Image1->Canvas->TextOutW(X2,Y2,Edit1->Text);
        Edit1->Clear();
        Edit1->Visible = false;
        Button1->Visible = false;
        Button2->Visible = false;
        Button3->Visible = false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm9::Button3Click(TObject *Sender)
{
    Edit1->Clear();
    Edit1->Visible = false;
    Button1->Visible = false;
    Button2->Visible = false;
    Button3->Visible = false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm9::S1Click(TObject *Sender)
{
    if(SavePictureDialog1->Execute())
        Image1->Picture->SaveToFile(SavePictureDialog1->FileName);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm9::Circle1Click(TObject *Sender)
{
    drw = 2;
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm9::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    Image1->Canvas->MoveTo(X,Y);
    X1 = X;
    Y1 = Y;
    lock = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm9::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    lock = false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm9::Rectangle1Click(TObject *Sender)
{
    drw = 3;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm9::Draw1Click(TObject *Sender)
{
    drw = 1;
}
//---------------------------------------------------------------------------
Переменная drw - отвечает за то что выбрал пользователь,

1 - просто рисует (Это работает нормально),
2 - рисует круг,
3 - квадрат.

Прикрепил гифку.
Миниатюры
Рисование фигур на канве  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2016, 15:19
Ответы с готовыми решениями:

Рисование на канве
У меня есть текст, затем рисую прямоугольник на канве и этот текст перекрывается прямоугольником (рис. 1). Как сделать, чтобы Label был...

Рисование текста на канве
Помогите пожалуйста разобраться с проблемой: текст Label1 не отображается на Panel1 void __fastcall TForm1::Button1Click(TObject...

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

3
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.05.2016, 15:50
Компонент TImage не очищает сам свою канву. Если не делать этого ручками, то все, что было нарисовано, остается, а новое рисуется поверх. Обработчик движения курсора срабатывает с определенной частотой в зависимоти от скорости перемещения курсора и при каждом срабатывании рисуется фигура - новая поверх всего, что было нарисовано до этого.
Один из выходов - очищать канву в обработчике Image1MouseMove, потом рисовать подлежащее изображение, потом рисовать фигуру по координатам курсора.
0
2 / 2 / 3
Регистрация: 18.10.2014
Сообщений: 98
Записей в блоге: 1
15.05.2016, 16:39  [ТС]
BRcr, Т.е как я понял нужно всегда перезаливать рисунок в image, можно ли обойтись скажем так TBitMap размером с Image и вывести его на экран, т.о TBitMap должен быть наложен на Image и когда пользователь закончил рисовать, BitMap просто добавится на Image или как это реализовать -.-
Ведь если всегда обновлять (стирать BitMap) у него не будет разве белого фона? Т.е он получается закрасит Image..
Совершенно запутался
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.05.2016, 20:02
Более разумный выход - не использовать плохо подходящий для задачи компонент, а именно TImage.
Гораздо проще написать обработчик OnPaint для TPaintBox или для формы и там уже выводить все по порядочку, а очистку предоставить системе. Вот и вот, к примеру, но можно найти на форуме примеры и попроще при желании, их полно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2016, 20:02
Помогаю со студенческими работами здесь

Стрелки - рисование на канве Image
Помогите пожалуйста научиться рисовать стрелочки в Image с помощью Canvas'а. Язык и среда разработки C++ Builder. Даны координаты двух...

Рисование на канве, событие OnMouseMove
Доброго всем времени суток. Прошу помощи в решении. Задача такова: Приложение рисует на канве компонента TImage сетку в виде...

Рисование нa канве TImage с загруженным png
Здравствуйте. Загружаю в image png. После этого при попытке что либо нарисовать на канве выдает сообщение &quot;Can only modify an image if...

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 19.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru