Wm_contextmenu

  • Автор темы Dimmuborgir
  • Дата начала
D

Dimmuborgir

#1
Сколько ни пользовался, никогда не сталкивался с такой проблеммой. В классе, унаследованном от CTreeView добавил обработчик WM_CONTEXTMENU, который по описанию должен вызваться при нажатии правой конпки мыши в области окна. Этого почему то не происходит, странным образом обработчик вызывается только при двойном щелчке ПКМ, с последующим одинарным... К сожалению ни хелп, ни исходники МФЦ не дали мне никакого ответа.. Может быть кто нибудь сталкивался с чем то подобным?
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Собственного обработчика RBTNDOWN нету случайно? Нигде в дереве классов? Тогда можно попробовать спаем потыкать - идет в контрол сообщение, или нет. Может диалог его рубит раньше?
 
D

Dimmuborgir

#3
спасибо за совет. очень удивило что сообщение отсылсается только по двойному нажатию ПКМ. хм... а почему собственно не как во всех окнах, по одинарному клику ПКМ.
 

grigsoft

Well-known member
15.11.2005
735
0
#4
Я не совет давал, а вопрос задал наводящий. Проглатываться сообщение может потому как кто-то его некорректно отработал. Вариантов тут много - включая дополнительное приложение в системе, вешающая хук на правую кнопку для своих целей, типа расширителя меню. На другой машине пробовали?
 
D

Dimmuborgir

#5
да. на другой машине тоже пробовал - точно так же. А совет - воспользоваться спай, сам как то сразу не догадался. Естествоено за обработчиками типа Rbutton я слежу.
 
D

Dimmuborgir

#6
Кажется, разобрался. Сообщение WM_CONTEXTMENU не посылается дереву по одному клику ПКМ... Решение очевидно: обрабатываем TVN_SELCHANGED и затем WM_RBUTTONDOWN:

Код:
void CHeaderView::OnRButtonDown(UINT nFlags, CPoint point) 
{
POINTS pts={point.x,point.y};
SendMessage(WM_LBUTTONDOWN,0,*((LPARAM*)&pts));
OnContextMenu(this,point);	
// CTreeView::OnRButtonDown(nFlags, point);
}