Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Пара вопросов по компоненту TImage


Автор: Нитонисе 5.11.2010, 18:01
1. Если активировать на TImage всплывающую подсказку и на событии перемещения мыши попросить выводить во всплывающую подсказку координаты мыши, то получается не очень красивая картинка. Сразу как только мышь попадает на TImage - подсказка всплывает. А вот потом ведет себя неадекватно. Как сделать, чтобы по мере перемещения мыши за курсором постоянно ползла и всплывающая подсказка с текущими координатами?

2. Нужно реализовать слоистость рисунка. То есть имеется некий сложный рисунок и хочу по клику мыши обводить некую область рисунка в кружок с центром в месте клика. Затем хочу кликнуть в другом месте рисунка, при этом первый кружок должен стереться и нарисовать в новом месте, где я только что кликнул. Как стирать первый кружок, не повредив основную картинку?

Автор: 586 6.11.2010, 02:40
Цитата(Нитонисе @  5.11.2010,  18:01 Найти цитируемый пост)
1. Если активировать на TImage всплывающую подсказку и на событии перемещения мыши попросить выводить во всплывающую подсказку координаты мыши, то получается не очень красивая картинка. Сразу как только мышь попадает на TImage - подсказка всплывает. А вот потом ведет себя неадекватно. Как сделать, чтобы по мере перемещения мыши за курсором постоянно ползла и всплывающая подсказка с текущими координатами?

Можно всплывающую подсказку заменить компонентом TLabel, и при перемещении мыши перемещать этот TLabel, меняя в нём текст.

Цитата(Нитонисе @  5.11.2010,  18:01 Найти цитируемый пост)
2. Нужно реализовать слоистость рисунка. То есть имеется некий сложный рисунок и хочу по клику мыши обводить некую область рисунка в кружок с центром в месте клика. Затем хочу кликнуть в другом месте рисунка, при этом первый кружок должен стереться и нарисовать в новом месте, где я только что кликнул. Как стирать первый кружок, не повредив основную картинку?

Можно этот кружок нарисовать в отдельном TImage, установить у него свойство Transparent, и переместить в нужную область над Image1.

Автор: Нитонисе 6.11.2010, 09:52
Цитата(586 @  6.11.2010,  02:40 Найти цитируемый пост)
Можно всплывающую подсказку заменить компонентом TLabel, и при перемещении мыши перемещать этот TLabel, меняя в нём текст.

Спасибо, опробую.

Цитата(586 @  6.11.2010,  02:40 Найти цитируемый пост)
Можно этот кружок нарисовать в отдельном TImage, установить у него свойство Transparent, и переместить в нужную область над Image1

Переместить каким образом? Есть Image1 - там сложный рисунок. Кликаю где-то мышкой,в Image2 рисую кружок... а дальше что?

Автор: 586 6.11.2010, 11:16
Цитата(Нитонисе @  6.11.2010,  09:52 Найти цитируемый пост)
Переместить каким образом? Есть Image1 - там сложный рисунок. Кликаю где-то мышкой,в Image2 рисую кружок... а дальше что? 

Кружок можно нарисовать заранее в Image2.
Код
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    TPoint pt = this->ScreenToClient(Image1->ClientToScreen(TPoint(X, Y)));
    Image2->Left = pt.x - Image2->Width / 2;
    Image2->Top = pt.y - Image2->Height / 2;
    Image2->Visible = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    TPoint pt = Image1->ScreenToClient(Image2->ClientToScreen(TPoint(X, Y)));
    Image1MouseDown(Image1, Button, Shift, pt.x, pt.y);
}

Автор: Нитонисе 6.11.2010, 11:35
Цитата(586 @  6.11.2010,  11:16 Найти цитируемый пост)
Кружок можно нарисовать заранее в Image2.

Нарисовал его так
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Image2->Canvas->Ellipse(10,10,30,30);
}

Добавил ваши обработчики событий. Установил Image2->Transparent в true. При клике на Image1 появляется Image2 с кружочком, только почему-то прозрачная область у него только внутри, а снаружи белый фон.

Добавлено через 9 минут и 3 секунды
С Label получилось почти как надо, только при перемещении мыши по самой метке она не перемещается, а надо чтобы показывала текущие координаты на Image1.

Автор: 586 6.11.2010, 12:28
Цитата(Нитонисе @  6.11.2010,  11:35 Найти цитируемый пост)
появляется Image2 с кружочком, только почему-то прозрачная область у него только внутри, а снаружи белый фон.

Предварительно нужно закрасить фон:
Код
Image2->Canvas->Pen->Color = clWhite;
Image2->Canvas->Rectangle(0, 0, Image2->Width, Image2->Height);
Image2->Canvas->Pen->Color = clBlack;
Image2->Canvas->Ellipse(0, 0, Image2->Width, Image2->Height);


Цитата(Нитонисе @  6.11.2010,  11:35 Найти цитируемый пост)
С Label получилось почти как надо, только при перемещении мыши по самой метке она не перемещается, а надо чтобы показывала текущие координаты на Image1.

Перенаправляй событие в Image:
Код
void __fastcall TForm1::Label1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    TPoint pt = Image1->ScreenToClient(Label1->ClientToScreen(TPoint(X, Y)));
    Image1MouseMove(Image1, Shift, pt.x, pt.y);
}

Автор: Нитонисе 6.11.2010, 12:36
586, спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)