2013-04-04 4 views
-1

В моем приложении на основе mfc-диалога есть CListCtrl. Мне нужно отключить кнопку, когда пользователь нажимает на пустой элемент в элементе управления списком. Я использовал сообщение NM_CLICK и достиг этого. Но если пользователь вытащит мышь из области управления списком и освободит мышь, это не сработает. Я нашел причину, по которой NM_CLICK будет вызван только при получении сообщения кнопки вверх. Есть ли для этого другое решение.Обнаружение нажмите на пустой элемент в элементе управления списком

ответ

0

Я нашел решение проблемы. Существует сообщение, которое можно обработать, если пользователь перетащит мышь с помощью левой кнопки, а именно 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();

}

Это решает проблему. спасибо всем за поддержку.

0

Есть несколько возможных вариантов. В родительском диалоге функция MouseUp Handler может использовать для этого.

afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 

Используя точку, вы можете проверить, произошло ли выключение мыши CListCtrl. Если это так, вы просто отключите кнопку.

Кроме того, WindowFromPoint может быть другим вариантом.

static CWnd* PASCAL WindowFromPoint(POINT point); 

В таком случае, как OnMouseMove, если вы используете эту функцию, вы можете проверить, что окно указано мышью.

0

Внедрите обработчик LVN_ITEMCHANGED, и в этом обработчике отключите кнопку, как только selected item count будет равен нулю.

1

Но если пользователь вытащил мышь из области управления списком и освободил мышь, это не сработает.

Это полностью дизайн, и вы не должны хотеть эти щелчки «рассчитывать». Это единственный способ, которым пользователь меняет свое мнение посередине щелчка. Вот как это работает:

  • Start щелкнуть на объекте (или пустое пространство) в контрольном списке коробки
  • Передумали
  • Удерживая нажатой кнопку мыши (то есть, перед совершением вашего нажмите), перетащите указатель мыши за пределы управления
  • Think: Whew! Это был близкий звонок!

Вы заметите, что в Windows, действие никогда не происходит, пока кнопка мыши не выпустила (часто называемый «MouseUp»). Если это не было поддержано, пользователю не удастся вырваться раньше, что является важной особенностью любого пользовательского интерфейса.

+0

Я согласен с вами, но мы говорим о программировании, и, конечно, программист не может полностью предсказать ум пользователя. Но нужно решение. – CodeRider

+0

Это стандартная практика проектирования Windows. Вы увидите его по всей операционной системе и другим совместимым программам. Это не требует никакого чтения ума. Попытка взломать эту важную характеристику пользовательского интерфейса просто заставит вас рассердить клиентов и привести к большому недостижимому коду. –