Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MFC, как назначить ListBox обработку клика правой кнопки мыши?  (Прочитано 13525 раз)
0 Пользователей и 1 Гость смотрят эту тему.
bebabo
Помогающий

ru
Offline Offline

WWW
« : 25-12-2007 08:20 » 

в свойствах ListBox есть только события для обработки левой кнопки мыши. в "добавить событие" - тоже только для левой. как назначить обработку правой кнопки?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-12-2007 16:41 » 

собственно, не удалось мне обработать двойной клик - никакой - в родительском окне. Просто не прилетает такого сообщения в. Видимо - надо производить дитё от класса и там ловить.

а вот всё остальное :
Цитата: MSDN
The DefWindowProc function passes the WM_SETCURSOR message to a parent window before processing. If the parent window returns TRUE, further processing is halted. Passing the message to a window's parent window gives the parent window control over the cursor's setting in a child window. The DefWindowProc function also uses this message to set the cursor to an arrow if it is not in the client area, or to the registered class cursor if it is in the client area. If the low-order word of the lParam parameter is HTERROR and the high-order word of lParam specifies that one of the mouse buttons is pressed, DefWindowProc calls the MessageBeep function.

и вот это неплохо работает:  добавляем в диалог виртуальную DefWindowProc и пишем там обработку

Код:
LRESULT CMyDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message==WM_SETCURSOR)
{
if(GetDlgItem(IDC_LIST1)->m_hWnd==(HWND)wParam)
{
if(((WORD)lParam)==HTCLIENT)//по клиентской части
{
switch( *(1+(WORD*)&lParam) )
{
case WM_LBUTTONUP:
{
//обрабатываем
//...
return 1;
}
break;

case WM_LBUTTONDOWN:
{
//обрабатываем
//...
return 1;
}
break;

//...

//WM_MOUSEMOVE
//WM_RBUTTONDOWN
//WM_RBUTTONUP
//WM_MBUTTONDOWN
//WM_MBUTTONUP
}
}
}
}

return CDialog::DefWindowProc(message, wParam, lParam);
}

« Последнее редактирование: 26-12-2007 13:57 от Алексей1153++ » Записан

bebabo
Помогающий

ru
Offline Offline

WWW
« Ответ #2 : 26-12-2007 08:55 » 

Алексей1153++, спасибо!
но как-то это странно, что нельзя просто добавить в ListBox подобное событие.
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 26-12-2007 09:27 » 

Блин как всё запущено. Учите матчасть.

bebabo, что значит нельзя "добавить событие"? Где ты хочешь его отлавливать? В самом ListBox? Или в родительском окне?

Если в самом контроле, то тогда тебе нужен класс, который получает это сообщение. Если в родительском окне, то это называется
notification - те сообщение, которое контрол сам отправляет родителю посредством WM_COMMAND. Почему бы не задуматься над префиксом LBN_ ? Это и есть List Box Notification. Что ж теперь разработчикам делать их для АБСОЛЮТНО всех оконных сообщений? Пупок развяжется. Тем более что у тебя есть прекрасная возможность сделать свой класс и в нём отлавливать нужные только тебе сообщения. Затраты: пару кликов плюс две строчки кода. Ещё меньше чем  в Лёшкином примере.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
bebabo
Помогающий

ru
Offline Offline

WWW
« Ответ #4 : 09-01-2008 10:45 » 

Джон, Алексей1153++, большое спасибо! понял! разобрался. работает!
стыдно признаться, но я почему-то решил что LBN_ - это Left Buttom Notification)
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 09-01-2008 12:20 » 

bebabo, Тут всё гораздо проще. На будущее.

Клик мышки - действие совершается над контролом (кнопка, спискок и тд). Нотификация - это крик контрола в ответ на действие, возможный, но необязательный.
Те сначала происходит событие - пользователь кликает мышкой по списку, родитель ессно ничего про это не знает - ведь не по нему кликнули. Чтобы кто-нить другой узнал об этом - ребёнок-контрол кричит родителю - "по мне мышкой кликнули" - те посылает notification.

Отсюда следует, что клик мышки (любое другое действие) надо отлавливать в контроле, родитель же может узнать, что же происходит с его контролом (твой случай) через нотификацию этого контрола. Для этого он должен внести её в свою карту сообщений.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines