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

 
Мышь, Обработка нажатия кнопок мыши
Georg
Отправлено: 12.11.2003, 17:55


Не зарегистрирован







Мне нужно обрабатывать нажатие кнопок мыши. Для простоты рассмотрения, будем при нажатии кнопки мыши менять курсор на крестообразный, а при отпускании возрашать форму курсора, заданную по умолчании. На первый взгляд все просто:

//Кнопка нажата
void __fastcall TViewForm1::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
//Какая кнопка нажата?
if(Button==mbRight)
{
Cursor = crCross;
}
}

//Кнопка отпушена
void __fastcall TViewForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
//Какая кнопка нажата?
if(Button==mbRight)
{
Cursor = crDefault ;
}
}

И на самом деле этот фрагмент кода работает, но мне надо обрабатывать нажатие левой кнопки мыши, и когда я вместо mbRight пишу mbLeft, все перестает работать. Может ктонибудь сталкивался с проблемой и знает, как заставить работать левую клавишу мыш
Gedeon
Отправлено: 12.11.2003, 18:25


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Georg @ 12/11/2003, 18:57)
Для простоты рассмотрения, будем при нажатии кнопки мыши менять курсор на крестообразный, а при отпускании возрашать форму курсора, заданную по умолчании.

Все тут нормально отрабатывает, просто неудачный выбор для простоты. Попробуй так:
CODE

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(Button==mbLeft)
       Beep(1000,100);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
   if(Button==mbLeft)
    Beep(1000,1000);
}
//---------------------------------------------------------------------------

И ты все услышишь, по каким причинам в момент OnMouseDown курсор не меняется с mbLeft сказать не могу.

Отредактировано Gedeon — 12/11/2003, 19:29
Georg
Отправлено: 13.11.2003, 17:44


Не зарегистрирован







Попробывал не гудит ((::. ohmy.gif
Gedeon
Отправлено: 13.11.2003, 18:30


Ветеран

Группа: Модератор
Сообщений: 1742



Тяни проект, попробуй, у меня все как надо:




User Attached Image Скачать файл
lmbupdown.rar


Samual
Отправлено: 13.11.2003, 22:09


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

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



Да-а-а-а! Мистика! Я сам ох...!
Но выход я тебе нашел:
Повесь комп. ApplicationEvents. У него есть событие OnMessage.
И тут пиши:
CODE

void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
     bool &Handled)
{
   if (Msg.message == WM_LBUTTONDOWN)
   {
       Cursor = crCross;
   }
   if (Msg.message == WM_LBUTTONUP)
   {
       Cursor = crDefault;
   }



У меня работает. Good luck.
Georg
Отправлено: 14.11.2003, 11:16


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

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



Большое всем спасибо за помощь. Скачав пример от Gedeon, неудалось скомпелировать, ладно по совету Samualе удалось пробится с помощью ApplicationEvents. Далее стал разбираться, со скаченым примером, напрямую не компилируется, почему не понятно. Перетаскиваю, по частям в другой проект, компиляция проходит, запускаю РАБОТАЕТ!!!. Дале опять создаю собственый проект, опять все работает. Возращаюсь к старой проге, откуда все началось, собираю заново, опять работает. мистика ohmy.gif
Gedeon
Отправлено: 14.11.2003, 11:29


Ветеран

Группа: Модератор
Сообщений: 1742



Я тут дома подумал: может не гудеть т.к. у тебя похоже стоит Win98 или WinMe или даже Win95 а там:
CODE

Remarks

Windows 95:

The Beep function ignores the dwFreq and dwDuration parameters. On computers with a sound card, the function plays the default sound event. On computers without a sound card, the function plays the standard system beep.

В NTях в отличии от тех ОС параметры передаваемые функции не игнорируются и пиликает именно спикер, а не звуковуха если она есть.
Т. е. тут неудачный пример выбрал я. Помести на форму Edit1 и попробуй так:
CODE

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
     TShiftState Shift, int X, int Y)
{
   if(Button==mbLeft){
       Edit1->Text = "MouseDown";
   }

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
     TShiftState Shift, int X, int Y)
{
   if(Button==mbLeft){
       Edit1->Text = "MouseUp";
   }

}
//---------------------------------------------------------------------------

Но вообще как бы не поняно зачем так извращаться для простого теста, для этого есть BreakPointы, которые ставь и смотри, что происходит, а что нет.
Samual
Отправлено: 14.11.2003, 18:34


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

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



Gedeon, я это же пробовал у себя на 2000ном и у соседа на XP — не работает...
Gedeon
Отправлено: 14.11.2003, 18:47


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Samual @ 14/11/2003, 19:36)
Gedeon, я это же пробовал у себя на 2000ном и у соседа на XP — не работает...

Ну тогда это действительно мистика какая-то, а BreakPointы ставил, как с ними, останавливается или нет?

Отредактировано Gedeon — 14/11/2003, 19:53
knatz
Отправлено: 15.11.2003, 23:51


Не зарегистрирован







У меня не Миллениуме с 6-м Билдером все работает, за исключением изменения курсора. Вот пример:

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
//Какая кнопка нажата?
if(Button==mbLeft)
{

// Cursor = crCross;
Form1->Show();
MessageBox (0,"Кнопка нажата",0,MB_ICONWARNING);

}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
//Какая кнопка нажата?
if(Button==mbLeft)
{
// Cursor = crDefault ;
MessageBox (0,"Кнопка отпущена",0,MB_ICONWARNING);
}
}
P.S. Загадочный эффект однако...
Waters
Отправлено: 16.11.2003, 09:20


Ученик-кочегар

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



QUOTE
...все работает, за исключением изменения курсора.


Попробуйте
CODE

Screen->Cursor=crCross;


wbr
Samual
Отправлено: 16.11.2003, 12:02


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

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



QUOTE

Ну тогда это действительно мистика какая-то, а BreakPointы ставил, как с ними, останавливается или нет?

Ставил. Нихрена. Он при нажатии не риагирует, а при отпускании прыгает на нажатие. Такого я еще не видел!
Samual
Отправлено: 21.11.2003, 21:35


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

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



Товарищи!!! Вот вам!!!
CODE

OnMouseDown...
...
MouseCapture = false; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

if (Button == mbLeft)
{
...
}


Спасибо за помощь Шевякову В. М.

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