Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Различить нажатие двойное нажатие кнопки в MFC


Автор: CityAC 31.12.2006, 01:24
Нужно 1) - на нажатие кнопки мыши сделать один обработчик, 2) - на двойное нажатие той же кнопки - другой.
Прога всегда попадает в обработчик 1). 
Ломал голову -  ни к чему хорошему не пришел.

Автор: CityAC 31.12.2006, 12:49
Или все уже водку пьянствуют или это неразрешимая задача smile 

Автор: KelTron 31.12.2006, 13:06
Придется выбрать что то одно smile 

Автор: _hunter 2.1.2007, 13:23
есть два вариантоа:
самый простой: самостоятоельно реализуем в контроле функциональность двойного клика. недостаток -- время клика может не соответствовать выбранному пользователем.
заморочный:
в обработчике одинарного клика запускаем таймер/поток в котором ждем (например секунду) и попутно проверяем не было ли двойного клика (в соответствующем обработчике ставим соответствующий флаг).
недостаток -- двойной клик может быть выставлен > 1с (маловероятно)

можно еще попробовать узнать у системы время двойного клика (но это лучше в системном программировании спрашивать)

Автор: zkv 2.1.2007, 18:28
Цитата(_hunter @  2.1.2007,  13:23 Найти цитируемый пост)
можно еще попробовать узнать у системы время двойного клика

Цитата(MSDN)

UINT GetDoubleClickTime(VOID);
The return value specifies the current double-click time, in milliseconds.

Автор: qqshonok 3.1.2007, 09:08
А две кнопки и поочерёдно скрывать их?

Автор: CityAC 3.1.2007, 11:56
Цитата(qqshonok @ 3.1.2007,  09:08)
А две кнопки и поочерёдно скрывать их?

Не красиво smile 
И вообще не то что я имел в виду.
Двойное нажатие мыши!

Автор: Earnest 10.1.2007, 20:20
Чтобы приходили сообщения WM_XBUTTONDBLCLK класс окна должен иметь стиль CS_DBLCLKS. И тогда приходят и WM_XBUTTONDOWN, и WM_XBUTTONDBLCLK, причем в случае двойного нажатия придут оба. Если в обработчике WM_XBUTTONDOWN сделать что-то нехорошее (например, фокус переставить, или просто долго сидеть), DBLCLK, конечно, не придет.
Поэтому реакцию нужно продумать так, чтобы она была непротиворечивой. 

Автор: CityAC 11.1.2007, 14:28
Цитата

Чтобы приходили сообщения WM_XBUTTONDBLCLK класс окна должен иметь стиль CS_DBLCLKS

1. Как установить данный стиль, если окно создается статически?
2. А как можно на ЛистБоксе создать обработчик типа  WM_LBUTTONUP?
  К примеру, нужно чтобы при выборе элемента списка он выделялся не при нажатии клавиши мыши, а при отжатии?
  Вообще такое возможно? Среди доступных сообщений для Listbox(a)  я такого не нашел smile 
3. Как снять выделение с элемента в ListBox(e) (так чтобы вообще ни один элемент не был выделен?);


Автор: zkv 11.1.2007, 15:05
1. SetClassLong(hwnd,GCL_STYLE,CS_DBLCLKS|GetClassLong(hwnd,GCL_STYLE));
2. Создать в родителе, и проверять, куда попадает точка в которую кликнули
 
Цитата(CityAC @  11.1.2007,  14:28 Найти цитируемый пост)
К примеру, нужно чтобы при выборе элемента списка он выделялся не при нажатии клавиши мыши, а при отжатии?

WM_LBUTTONUP - как раз сообщение об отжатии

Автор: CityAC 11.1.2007, 15:25
Цитата(CityAC @ 11.1.2007,  14:28)

3. Как снять выделение с элемента в ListBox(e) (так чтобы вообще ни один элемент не был выделен?);

3. ..?

Цитата

2. Создать в родителе, и проверять, куда попадает точка в которую кликнули

Я пробовал, но при щелчке на листбоксе программа не попадает в обработчик родительского WM_LBUTTONUP.
 хотя должен по идее - в стилях листбокса выставлен Notify. Ничего не понимаю, может еще какой нюанс?

Автор: zkv 11.1.2007, 15:32
3. 
Цитата(MSDN)

CListBox::SetCurSel 
Selects a string and scrolls it into view, if necessary.

int SetCurSel(
   int nSelect 
);
Parameters
nSelect 
Specifies the zero-based index of the string to be selected. If nSelect is –1, the list box is set to have no selection. 

Автор: CityAC 11.1.2007, 15:41
Цитата
Цитата

2. Создать в родителе, и проверять, куда попадает точка в которую кликнули


Я пробовал, но при щелчке на листбоксе программа не попадает в обработчик родительского WM_LBUTTONUP.
 хотя должен по идее - в стилях листбокса выставлен Notify. Ничего не понимаю, может еще какой нюанс?

Автор: zkv 12.1.2007, 07:24
Цитата(zkv @  11.1.2007,  15:05 Найти цитируемый пост)
2. Создать в родителе, и проверять, куда попадает точка в которую кликнули

похоже я ошибался, ситуация по-сложнее будет, видимо придется содавать класс-наследник для CListBox, а в нем уже переопределять обработчик WM_LBUTTONUP, но не буду ручаться, что это единственный вариант smile

PS овчинка стоит выделки?

Автор: Earnest 12.1.2007, 17:48
Цитата(zkv @  12.1.2007,  08:24 Найти цитируемый пост)
но не буду ручаться, что это единственный вариант 

Не единственный, можно ловить сообщения в PreTranslateMessage родителя. Но вряд ли это поможет в смысле изменения поведения лист-бокса по выделению элементов. Разве что ловить также WM_LBUTTONDOWN (и проглатывать)? а на WM_LBUTTONUP устанавливать текущий элемент. Но криво как-то.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)