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


Автор: Iwoyd 3.2.2009, 11:05
Сразу прошу меня извинить, если подобные вопросы возникали уже на форуме. Но я просто не знаю, как корректно описать данный вопрос.
Задача: по щелчку мыши в диалоговом окне создавать точку на экране и отображать ее номер. Пока в голове возникло только такое решение: при каждом щелчке создавать TLabel. Как это сделать? 
Если есть решение проще, подскажите пожалуйста, мои решения могут быть глупыми.
Заранее спасибо)
p.s. Хотелось бы, конечно, разъяснения по этому вопросу в C++ Builder с TLabel. Но можно и в MS Visual C++ со StaticText.

Автор: Zorak 3.2.2009, 11:18
отхвачивай WM_LBOTTONDOWN и прикаждом щелчке миши делай щотчик на 1 больше...и етот щотчик (тоесть номер)  виводи в диалог функцией TextOut чуть више координат щелчка миши.... например на 5 пикселов....
З,Ы. Если не понятно виразился, спрашивай.. - обясню =)
(с) я говорил про Visual C++ 6.0 ..

Автор: Static 3.2.2009, 11:19
1. Для Билдера есть спец. раздел ;)

2. Не думаю, что TLabel - хорошая идея.

имхо, лучше на Canvas формы рисовать точки. А рядом через TextRect писать номер.
Билдер давно не видел, могу местами ошибаться - не помню, передаются ли в методе OnClick координаты щелчка. Если нет - их можно запоминать в OnMouseMove, например, там точно есть. Таким образом:
- получаем OnClick
- достаем запомненные накануне координаты мыши
- делаем что-то типа Form1->Canvas->не_помню_название_метода smile ставим точку. Хелп у Билдера подробный - можно легко найти.
- делаем небольшое изменение координат
- в новых координатах делаем Canvas->TextRect(rect, IntToStr(i)) - где i номер точки, rect - прямоугольник TRect созданный с учетом измененных координат
- i++ smile
как-то так

Автор: 586 3.2.2009, 19:49
Код
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    static int i = 0;
    //Canvas->TextOutA(X, Y, IntToStr(i++));

    TLabel *l = new TLabel(Owner);
    l->Left = X;
    l->Top = Y;
    l->Caption = IntToStr(i++);
    l->Parent = this;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClick(TObject *Sender)
{
    /*static int i = 0;
    TPoint pt = this->ScreenToClient(Mouse->CursorPos);

    TLabel *l = new TLabel(Owner);
    l->Left = pt.x;
    l->Top = pt.y;
    l->Caption = IntToStr(i++);
    l->Parent = this;               */
}

Автор: Dmi3ev 3.2.2009, 21:49
вот так можно делать:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int mx, my;//координаты мыши
int i=1;//счетчик точек
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClick(TObject *Sender)
{
Form1->Canvas->Pixels[mx][my]=clRed;//красим пиксель
Form1->Canvas->TextOutA(mx+3, my+3, IntToStr(i++));//подписываем точку
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
mx=X;//запоминаем х
my=Y;//запоминаем у
}
//---------------------------------------------------------------------------

Автор: taiven 3.2.2009, 22:03
ну тогда уж так:
Код

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    static int i = 0;
    Canvas->Pixels[X][Y] = clRed;
    Canvas->TextOutA(X+3, Y+3, AnsiString(i++));
}

Автор: Dmi3ev 3.2.2009, 22:32
Цитата

ну тогда уж так:

тогда уж вот так)))
Код

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    static int i = 1;
    Canvas->Pixels[X][Y] = clRed;
    Canvas->TextOutA(X+3, Y+3, AnsiString(i++));
}

Автор: taiven 3.2.2009, 23:09
Цитата(Dmi3ev @  3.2.2009,  21:32 Найти цитируемый пост)
тогда уж вот так)))

настоящие программисты начинают отсчёт с нуля smile  smile 

Автор: Dmi3ev 4.2.2009, 00:00
 smile
Цитата

настоящие программисты начинают отсчёт с нуля
 
скромно...  smile

Автор: Iwoyd 11.2.2009, 09:56
Огромное всем спасибо.
Разобралась)
Еще вопросик:
Как по-вашему проще сделать проверку, попал ли пользователь щелчком мыши в определенную область (окрестность какой-л точки)?
У меня голове возникает решение только с помощью циклов. Но я слишком плохо знаю возможности языка. 

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