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
|
Событие клик всегда будет происходить перед даблкликом этого избежать нельзя, но можно попробовать с ним бороться, если нет возможности выбрать какое-либо другое событие, то первым что приходит в голову засекать время при клик, ставя какой либо семафор, и если через некоторое время произошел дабл клик, семафор снимать и выполнять действия даблклика, а события клика выполнять через определенный промежуток после того как случиться ивент и при наличии семафора. Будет немного запутанно и минус, конечно, потеря времени ожидания, но с другой стороны оно не так уж и велико.
|
|
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. Так что не с того конца ты взялся решать проблему. Напиши подробней. |
Да, я тоже с этим согласен, тратить столько усилий на решение проблемы, которую можно вообще исключить.
|
|