В моем приложении на основе mfc-диалога есть CListCtrl. Мне нужно отключить кнопку, когда пользователь нажимает на пустой элемент в элементе управления списком. Я использовал сообщение NM_CLICK и достиг этого. Но если пользователь вытащит мышь из области управления списком и освободит мышь, это не сработает. Я нашел причину, по которой NM_CLICK будет вызван только при получении сообщения кнопки вверх. Есть ли для этого другое решение.Обнаружение нажмите на пустой элемент в элементе управления списком
ответ
Я нашел решение проблемы. Существует сообщение, которое можно обработать, если пользователь перетащит мышь с помощью левой кнопки, а именно LVN_BEGINDRAG. При обработке этого сообщения в функции OnBeginDrag я обновляю статус кнопки. Таким образом, кнопка обновляется, как только пользователь пытается перетащить мышь. код, как показано ниже: В заголовке добавить
afx_msg void OnBeginDrag(NMHDR* pNMHDR, LRESULT *pResult);
В реализации добавить карту сообщений и соответствующую функцию:
BEGIN_MESSAGE_MAP (..)
ON_NOTIFY (LVN_BEGINDRAG, IDC_LIST1, OnBeginDrag)
END_MESSAGE_MAP
OnBeginDrag (....)
{
Updatebutton();
}
Это решает проблему. спасибо всем за поддержку.
Есть несколько возможных вариантов. В родительском диалоге функция MouseUp Handler может использовать для этого.
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
Используя точку, вы можете проверить, произошло ли выключение мыши CListCtrl. Если это так, вы просто отключите кнопку.
Кроме того, WindowFromPoint может быть другим вариантом.
static CWnd* PASCAL WindowFromPoint(POINT point);
В таком случае, как OnMouseMove, если вы используете эту функцию, вы можете проверить, что окно указано мышью.
Внедрите обработчик LVN_ITEMCHANGED, и в этом обработчике отключите кнопку, как только selected item count будет равен нулю.
Но если пользователь вытащил мышь из области управления списком и освободил мышь, это не сработает.
Это полностью дизайн, и вы не должны хотеть эти щелчки «рассчитывать». Это единственный способ, которым пользователь меняет свое мнение посередине щелчка. Вот как это работает:
- Start щелкнуть на объекте (или пустое пространство) в контрольном списке коробки
- Передумали
- Удерживая нажатой кнопку мыши (то есть, перед совершением вашего нажмите), перетащите указатель мыши за пределы управления
- Think: Whew! Это был близкий звонок!
Вы заметите, что в Windows, действие никогда не происходит, пока кнопка мыши не выпустила (часто называемый «MouseUp»). Если это не было поддержано, пользователю не удастся вырваться раньше, что является важной особенностью любого пользовательского интерфейса.
Я согласен с вами, но мы говорим о программировании, и, конечно, программист не может полностью предсказать ум пользователя. Но нужно решение. – CodeRider
Это стандартная практика проектирования Windows. Вы увидите его по всей операционной системе и другим совместимым программам. Это не требует никакого чтения ума. Попытка взломать эту важную характеристику пользовательского интерфейса просто заставит вас рассердить клиентов и привести к большому недостижимому коду. –