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

 
Событие DblClick
Oper01
Отправлено: 21.02.2004, 19:16


Станционный диспетчер

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



Подскажите пожалуйста, вот такая проблема. Событию DblClick предшествует событие одиночный Click. Можно ли сделать так, чтобы при DblClick не вызывался одинарный Click ? Как то его перехватить и не обрабатывать, а передавать управление событию двойного щелчка.
Pirs
Отправлено: 23.02.2004, 00:21


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

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



Если одиночный Click не нужен, тогда зачем его определять?
Oper01
Отправлено: 23.02.2004, 23:13


Станционный диспетчер

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



В событии одиночного щелчка тоже есть код, который нужен именно при одиночном щелчке.
Gedeon
Отправлено: 24.02.2004, 09:46


Ветеран

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



Событие клик всегда будет происходить перед даблкликом этого избежать нельзя, но можно попробовать с ним бороться, если нет возможности выбрать какое-либо другое событие, то первым что приходит в голову засекать время при клик, ставя какой либо семафор, и если через некоторое время произошел дабл клик, семафор снимать и выполнять действия даблклика, а события клика выполнять через определенный промежуток после того как случиться ивент и при наличии семафора. Будет немного запутанно и минус, конечно, потеря времени ожидания, но с другой стороны оно не так уж и велико. ohmy.gif
Doga
Отправлено: 24.02.2004, 15:39


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

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



Я делал так:

//Переменные, флаги
unsigned long FirstClickTimeOnTabControl;
unsigned long SecondClickTimeOnTabControl;
bool FirstClickOnTabControl;
bool SecondClickOnTabControl;
int FirstClickXPosOnTabControl;
int FirstClickYPosOnTabControl;


//---------------------------------------------------------------------------
void __fastcall TXForm::TabControl1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int ButtonSwapResult = GetSystemMetrics(SM_SWAPBUTTON);

RETRY:
if (FirstClickOnTabControl == false)
{
if (ButtonSwapResult == 0)
{
//Buttons not swapped
if (Shift.Contains(ssLeft))
{
FirstClickTimeOnTabControl = GetTickCount();
FirstClickXPosOnTabControl = X;
FirstClickYPosOnTabControl = Y;
FirstClickOnTabControl = true;

//далее если обработать событие OnMouseUp с учётом
//флагов можно сэмулировать OnClick, но токо для мышки
}
}
else
{
//Buttons swapped
if (Shift.Contains(ssRight))
{
FirstClickTimeOnTabControl = GetTickCount();
FirstClickXPosOnTabControl = X;
FirstClickYPosOnTabControl = Y;
FirstClickOnTabControl = true;
}
}
}
else //if (FirstClickOnTabControl == true)
{
if (ButtonSwapResult == 0)
{
//Buttons not swapped
if (Shift.Contains(ssLeft))
{
SecondClickTimeOnTabControl = GetTickCount();
SecondClickOnTabControl = true;
}
else
{
SecondClickOnTabControl = false;
}
}
else
{
//Buttons swapped
if (Shift.Contains(ssRight))
{
SecondClickTimeOnTabControl = GetTickCount();
SecondClickOnTabControl = true;
}
else
{
SecondClickOnTabControl = false;
}
}

if (SecondClickOnTabControl == true)
{
int DoubleClickTime = GetDoubleClickTime();
int CXDblClk = GetSystemMetrics(SM_CXDOUBLECLK);
int CYDblClk = GetSystemMetrics(SM_CYDOUBLECLK);

FirstClickOnTabControl = false;
SecondClickOnTabControl = false;

if (int(SecondClickTimeOnTabControl — FirstClickTimeOnTabControl) <= DoubleClickTime)
{
if (((FirstClickXPosOnTabControl + CXDblClk/2)> X) && ((FirstClickXPosOnTabControl — CXDblClk/2) < X))
{
if (((FirstClickYPosOnTabControl + CYDblClk/2)> Y) && ((FirstClickYPosOnTabControl — CYDblClk/2) < Y))
{
//Так вот же он, Двойной Щёлк!!!
MessageBox("DBLClick — OK!", "Двойной Щёлк",MB_OK+MB_ICONWARNING+MB_APPLMODAL);

// Здесь должен быть собственно код события OnDblClick ...

}
else
{
goto RETRY;
}
}
else
{
goto RETRY;
}
}
else
{
goto RETRY;
}
}
}
}
Oper01
Отправлено: 25.02.2004, 02:26


Станционный диспетчер

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



Как всё не просто... Спасибо за помощь!
Pirs
Отправлено: 25.02.2004, 22:35


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

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



Мое личное мнение такое — у тебя нерациональный алгоритм. Событие OnClick не должно конфликтовать с DblClick. Так что не с того конца ты взялся решать проблему. Напиши подробней.
Gedeon
Отправлено: 26.02.2004, 09:47


Ветеран

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



QUOTE (Pirs @ 25/02/2004, 23:37)
Мое личное мнение такое — у тебя нерациональный алгоритм. Событие OnClick не должно конфликтовать с DblClick. Так что не с того конца ты взялся решать проблему. Напиши подробней.

Да, я тоже с этим согласен, тратить столько усилий на решение проблемы, которую можно вообще исключить.

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