Форум: "WinAPI";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
ВнизКлик мышкой Найти похожие ветки
← →
Roxtady (2002-08-22 16:35) [0]Нашел WM_LBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONDBCLK. А вот что то типа WM_LBUTTONCLK (одинарный клик мышью) - не нашел...
← →
Roxtady (2002-08-22 17:47) [1]Как тогда отлавливать одинарные клики мышью ?
← →
Song (2002-08-22 17:49) [2]WM_LBUTTONCLK=WM_LBUTTONDOWN+WM_LBUTTONUP=BM_CLICK (для некоторых контролов)
← →
Игорь Шевченко (2002-08-22 17:49) [3]WM_хBUTTONDOWN, где X это L,R,M в зависимости от кнопки мыши.
Любите книгу - источник знаний
← →
Roxtady (2002-08-23 00:05) [4]Игорь Шевченко, не согласен. BUTTONDOWN наступает, когда вы только НАЖИМАЕТЕ на кнопку мыши (но не отпускаете ее). А заметьте ни один контрол не реагирует ТОЛЬКО на нажатие клавиши без ее отпускания. То есть, если вы нажмете на кнопку левой кнопкой мыши, а потом отведете курсор в другое место и отпустите, то события OnMouseDown не наступит. Хочется реализовать такое же поведение у себя в програме только на WinApi.
Song, WM_LBUTTONCLK=WM_LBUTTONDOWN+WM_LBUTTONUP - это я понимаю. Но как отследить, что сюда нажали кнопкой, а потом ее отпустили ?
← →
Игорь Шевченко (2002-08-23 09:53) [5]Во время обработки WM_хBUTTONDOWN надо установить флажок, что на окне нажата х-тая копка мыши. (Например, csClicked в ControlState у TControl)
При обработке WM_xBUTTONUP проверяете, если флажок установлен, значит, нажатие и отпускание кнопки мыши (которое и считается за click, я не был не совсем прав 22.08.02 17:49) было выполнено на одном и том же окне. После этого, флажок сбрасывается и выполняется процедура Click
RTFS Controls.pas
← →
Roxtady (2002-08-23 12:09) [6]Игорь Шевченко, я тоже так подумал. Только это не совсем так. Ведь в рельности, если нажать на контрол кнопкой мыши, потом отвести курсор в сторону и отпустить кнопку, то состояние csClicked сбрасывается ! (а если реализовывать по вашей схеме, то у кучи контролов может быть состояние csClicked). То есть нужно ставить что-то типа глобального хука на wm_lbuttonup и проверять - если событие произошло над контролом с состоянием csClicked, то нажатие произошло. Если не над ним, то состояние csClicked сбрасывается... Вот это имхо и геморройно.
Хотелось бы попроще...
← →
Игорь Шевченко (2002-08-23 12:54) [7]Вы бы поглядели 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 18:30) [8]Игорь Шевченко, опять видимо вы меня не поняли. Думаю, что релизация события OnClick в TControl.click состоит НЕ только из этих процедур. Самое идеальное - если вы мне предоставите код процедуры (процедур), реализующий Click только с помощью WinApi. Но я ценю ваше время и естественно не настаиваю на этом. Просто хочется отметить, что если OnClick будет обрабатываться ТОЛЬКО по этим процедурам, то получится "неправильный" click.
На самом деле. Подведите курсор к контролу. Зажмите кнопку мыши. Отведите курсор в сторону. Отпустите кнопку мыши. Нажмите кнопку мыши, подведите курсор к контролу. Отпустите кнопку мыши. События Click НЕ ПРОИЗОЙДЕТ.
Если алгоритм click"а описывается только двумя представленными выше процедурами. Проделайте тоже самое. То есть, подведите курсор к контролу. Зажмите кнопку мыши. Отведите курсор в сторону. Отпустите кнопку мыши. Нажмите кнопку мыши, подведите курсор к контролу. Отпустите кнопку мыши. События Click ПРОИЗОЙДЕТ.
Потому как у контрола было свойство csClicked, когда на нем нажали кнопку. А когда кнопку ОТЖИМАЛИ свойство csClicked не снимется, так как отжимали кнопку не над контролом.
Надеюсь объяснил понятно. Если что - спрашивайте.
← →
nikkie (2002-08-23 20:26) [9]>Roxtady
ну конечно не буквально только этими процедурами. надо еще посмотреть как реализованы свойства, которые используются в этих процедурах. а конкретнее - MouseCapture.
необходимое тебе поведение на апи реализуется функцией SetCapture.
← →
Roxtady (2002-08-23 22:46) [10]nikkie, можно поподробнее ? Я не совсем понял каким образом с помощью SetCapture можно реализовать такое поведение при click"е.
P.S. И непонятен опять же вопрос. Почему событие WM_LBUTTONDBCLK есть, а события WM_LBUTTONCLK нету ?
← →
Dm9 (2002-08-25 03:46) [11]>Игорь Шевченко
>Во время обработки WM_хBUTTONDOWN надо установить флажок, что на окне нажата х-тая копка мыши.
Если компонентов много, то надо не флажок, а запоминать окно, на котором произошло опускание клавиши, а при WM_XBUTTONUP проверять, поднята ли она на том же окне.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c