Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Клик мышкой [D5]


Roxtady ©   (2002-08-22 16:35:00) 

Нашел WM_LBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONDBCLK. А вот что то типа WM_LBUTTONCLK (одинарный клик мышью) - не нашел...


Dm9   (2002-08-25 03:46:00) [1]

>Игорь Шевченко
>Во время обработки WM_хBUTTONDOWN надо установить флажок, что на окне нажата х-тая копка мыши.

Если компонентов много, то надо не флажок, а запоминать окно, на котором произошло опускание клавиши, а при WM_XBUTTONUP проверять, поднята ли она на том же окне.


Roxtady   (2002-08-23 22:46:00) [2]

nikkie, можно поподробнее ? Я не совсем понял каким образом с помощью SetCapture можно реализовать такое поведение при click"е.

P.S. И непонятен опять же вопрос. Почему событие WM_LBUTTONDBCLK есть, а события WM_LBUTTONCLK нету ?


nikkie   (2002-08-23 20:26:00) [3]

>Roxtady
ну конечно не буквально только этими процедурами. надо еще посмотреть как реализованы свойства, которые используются в этих процедурах. а конкретнее - MouseCapture.

необходимое тебе поведение на апи реализуется функцией SetCapture.


Roxtady   (2002-08-23 18:30:00) [4]

Игорь Шевченко, опять видимо вы меня не поняли. Думаю, что релизация события OnClick в TControl.click состоит НЕ только из этих процедур. Самое идеальное - если вы мне предоставите код процедуры (процедур), реализующий Click только с помощью WinApi. Но я ценю ваше время и естественно не настаиваю на этом. Просто хочется отметить, что если OnClick будет обрабатываться ТОЛЬКО по этим процедурам, то получится "неправильный" click.

На самом деле.Подведите курсор к контролу. Зажмите кнопку мыши. Отведите курсор в сторону. Отпустите кнопку мыши. Нажмите кнопку мыши, подведите курсор к контролу. Отпустите кнопку мыши. События Click НЕ ПРОИЗОЙДЕТ.

Если алгоритм click"а описывается только двумя представленными выше процедурами. Проделайте тоже самое. То есть, подведите курсор к контролу. Зажмите кнопку мыши. Отведите курсор в сторону. Отпустите кнопку мыши. Нажмите кнопку мыши, подведите курсор к контролу. Отпустите кнопку мыши. События Click ПРОИЗОЙДЕТ.
Потому как у контрола было свойство csClicked, когда на нем нажали кнопку. А когда кнопку ОТЖИМАЛИ свойство csClicked не снимется, так как отжимали кнопку не над контролом.

Надеюсь объяснил понятно. Если что - спрашивайте.


Игорь Шевченко   (2002-08-23 12:54:00) [5]

Вы бы поглядели Controls.pas, как реализован метод TControl.Click
и когда он вызывается, прежде чем делать такие заявления.




procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True;
if csClickEvents in ControlStyle then Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []);
end;


procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;


Roxtady   (2002-08-23 12:09:00) [6]

Игорь Шевченко, я тоже так подумал. Только это не совсем так. Ведь в рельности, если нажать на контрол кнопкой мыши, потом отвести курсор в сторону и отпустить кнопку, то состояние csClicked сбрасывается ! (а если реализовывать по вашей схеме, то у кучи контролов может быть состояние csClicked). То есть нужно ставить что-то типа глобального хука на wm_lbuttonup и проверять - если событие произошло над контролом с состоянием csClicked, то нажатие произошло. Если не над ним, то состояние csClicked сбрасывается... Вот это имхо и геморройно.
Хотелось бы попроще...


Игорь Шевченко   (2002-08-23 09:53:00) [7]

Во время обработки WM_хBUTTONDOWN надо установить флажок, что на окне нажата х-тая копка мыши. (Например, csClicked в ControlState у TControl)
При обработке WM_xBUTTONUP проверяете, если флажок установлен, значит, нажатие и отпускание кнопки мыши (которое и считается за click, я не был не совсем прав 22.08.02 17:49) было выполнено на одном и том же окне. После этого, флажок сбрасывается и выполняется процедура Click

RTFS Controls.pas


Roxtady   (2002-08-23 00:05:00) [8]

Игорь Шевченко, не согласен. BUTTONDOWN наступает, когда вы только НАЖИМАЕТЕ на кнопку мыши (но не отпускаете ее). А заметьте ни один контрол не реагирует ТОЛЬКО на нажатие клавиши без ее отпускания. То есть, если вы нажмете на кнопку левой кнопкой мыши, а потом отведете курсор в другое место и отпустите, то события OnMouseDown не наступит. Хочется реализовать такое же поведение у себя в програме только на WinApi.

Song, WM_LBUTTONCLK=WM_LBUTTONDOWN+WM_LBUTTONUP - это я понимаю. Но как отследить, что сюда нажали кнопкой, а потом ее отпустили ?


Song   (2002-08-22 17:49:00) [9]

WM_LBUTTONCLK=WM_LBUTTONDOWN+WM_LBUTTONUP=BM_CLICK (для некоторых контролов)


Игорь Шевченко   (2002-08-22 17:49:00) [10]

WM_хBUTTONDOWN, где X это L,R,M в зависимости от кнопки мыши.

Любите книгу - источник знаний


Roxtady   (2002-08-22 17:47:00) [11]

Как тогда отлавливать одинарные клики мышью ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо