![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Клик мышкой [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]Как тогда отлавливать одинарные клики мышью ?