Wm_contextmenu

Тема в разделе "MS Visual C++", создана пользователем Dimmuborgir, 31 янв 2008.

  1. Dimmuborgir

    Dimmuborgir Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Собственного обработчика RBTNDOWN нету случайно? Нигде в дереве классов? Тогда можно попробовать спаем потыкать - идет в контрол сообщение, или нет. Может диалог его рубит раньше?
     
  3. Dimmuborgir

    Dimmuborgir Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Я не совет давал, а вопрос задал наводящий. Проглатываться сообщение может потому как кто-то его некорректно отработал. Вариантов тут много - включая дополнительное приложение в системе, вешающая хук на правую кнопку для своих целей, типа расширителя меню. На другой машине пробовали?
     
  5. Dimmuborgir

    Dimmuborgir Гость

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

    Dimmuborgir Гость

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

    Код (Text):
    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);
    }
     

Поделиться этой страницей