C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как растянуть прямоугольник выделения?, Выделить область на Canvas
iAlexander
  Отправлено: 19.06.2004, 14:58


Дежурный стрелочник

Группа: Участник
Сообщений: 70



На Canvas'e нарисованы объекты. Их можно выделять щелчком мыши или выделением (ну как на рабочем столе Windows). Выделять-то я выделяю, но как отобразить прямоугольник выделения? Чтобы пользователю было это интуитивно понятно. Т.е. нажимаешь левую кнопку и тянешь, и получается выделяющий прямоугольник.
Билдер предоставляет такую возможность, или мне придется рисовать прямоугольник вручную с запоминанием образа области, по которой я рисую этим прямоугольником? wink.gif
Valdemar
Отправлено: 21.06.2004, 09:50


Мастер участка

Группа: Участник
Сообщений: 433



На скорую руку набросал пример. Правда есть в нем небольшие ошибки, но в качестве информации к размышлению, думаю сойдет.
CODE
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (Button!=mbLeft) return;
x=X;
y=Y;
x1=X;
y1=Y;
x2=X;
y2=Y;
f=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (Button!=mbLeft) {f=false; return;}
if (f1)
{
if (x<X) {r1.Left=x; r1.Right=X;}
else {r1.Left=X; r1.Right=x;}
if (y<Y) {r1.Top=y; r1.Bottom=Y;}
else {r1.Top=Y; r1.Bottom=y;}
Form1->Canvas->DrawFocusRect(r2);
}
f=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (f)
{
if (x<x1) {r1.Left=x; r1.Right=x1;}
else {r1.Left=x1; r1.Right=x;}
if (y<y1) {r1.Top=y; r1.Bottom=y1;}
else {r1.Top=y1; r1.Bottom=y;}
if (x<x2) {r2.Left=x; r2.Right=x2;}
else {r2.Left=x2; r2.Right=x;}
if (y<y2) {r2.Top=y; r2.Bottom=y2;}
else {r2.Top=y2; r2.Bottom=y;}
f1=true;
Form1->Canvas->DrawFocusRect(r1);
Form1->Canvas->DrawFocusRect(r2);
x1=x2;
y1=y2;
x2=X;
y2=Y;
}
}

здесь
bool f;//true нажата левая кнопка
bool f1;//true если мышка двигается при нажатой левой кнопке
int x,y,x1,y1,x2,y2;
TRect r1,r2
А в обработчике движения мышки проверяете попали или нет в выделенную область ваши объекты. Если попали, то рисуете обрамляющие рамки и запоминаете выделенные объекты.

Отредактировано Valdemar — 21/06/2004, 10:56
iAlexander
  Отправлено: 21.06.2004, 18:46


Дежурный стрелочник

Группа: Участник
Сообщений: 70



ОК, спасибо за наводящую подсказку.
Кому тоже надо делать выделение мышкой на канве — держите готовый проект.

User Attached Image Скачать файл
Rect.zip



Вернуться в Вопросы программирования в C++Builder