Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
3-31671
Krez
2002-09-18 15:08
2002.10.10
Ячейка в DBGrid


1-31699
I/O
2002-09-30 19:17
2002.10.10
Процедуры


1-31706
Begin
2002-10-01 02:11
2002.10.10
К вопросу о динамическом массиве ....


4-32075
ElectHp
2002-08-24 20:47
2002.10.10
Submit


14-31974
AL2002
2002-09-16 11:39
2002.10.10
Есть у кого прога Donation Free? Любая?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский