"Правый" клик на сплиттере
От: newb  
Дата: 14.03.05 07:02
Оценка:
В моем view есть tree и list контролы, разделенный сплиттером:
m_ctrlVSplitter.Create(m_hWnd, rcDefault, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
m_ctrlVSplitter.SetSplitterExtendedStyle(0);

// создание ListView
m_lv.Create(m_ctrlVSplitter, rcDefault, 0, WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, IDC_LST);
m_tv.Create(m_ctrlVSplitter, rcDefault, 0, TVS_SHOWSELALWAYS | TVS_HASBUTTONS | TVS_LINESATROOT 
                                                       | TVS_HASLINES | TVS_EDITLABELS|TVS_SHOWSELALWAYS 
                                                       | TVS_DISABLEDRAGDROP | WS_CHILD | WS_VISIBLE, 0, IDC_TREE);
m_ctrlVSplitter.SetSplitterPanes(m_lv, m_tv);


И обработчик WM_CONTEXTMENU:
LRESULT OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    int b = m_ctrlVSplitter.GetActivePane();
    if (b)
    { ::MessageBox(0, _T("OnContextMenu::Tree"), _T(""), 0);
    }
    else
    { ::MessageBox(0, _T("OnContextMenu::List"), _T(""), 0);
    }
    return 0;
}

Хотелось бы отследить "правый" клик на самом сплиттере (когда курсор меняется на "стрелочки") и ничего не делать в этом случае.
Извлечь координаты из lParam и проверка их на вхождение в прямоугольник сплиттера не работает
Re: "Правый" клик на сплиттере
От: SaloS http://salos.narod.ru/
Дата: 14.03.05 11:18
Оценка:
Я думаю у тебя этот метод никогда не вызывается, так как WM_CONTEXTMENU ловит в твоем случае сплиттер и собствеено никак его не обрабатывает. тебе нужно либо наследовать окно от сплиттера и там обрабатывать WM_CONTEXTMENU либо смотреть в PreTranslateMessage

Здравствуйте, newb, Вы писали:

N>В моем view есть tree и list контролы, разделенный сплиттером:

N>
N>m_ctrlVSplitter.Create(m_hWnd, rcDefault, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
N>m_ctrlVSplitter.SetSplitterExtendedStyle(0);

N>// создание ListView
N>m_lv.Create(m_ctrlVSplitter, rcDefault, 0, WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, IDC_LST);
N>m_tv.Create(m_ctrlVSplitter, rcDefault, 0, TVS_SHOWSELALWAYS | TVS_HASBUTTONS | TVS_LINESATROOT 
N>                                                       | TVS_HASLINES | TVS_EDITLABELS|TVS_SHOWSELALWAYS 
N>                                                       | TVS_DISABLEDRAGDROP | WS_CHILD | WS_VISIBLE, 0, IDC_TREE);
N>m_ctrlVSplitter.SetSplitterPanes(m_lv, m_tv);
N>


N>И обработчик WM_CONTEXTMENU:

N>
N>LRESULT OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
N>{
N>    int b = m_ctrlVSplitter.GetActivePane();
N>    if (b)
N>    { ::MessageBox(0, _T("OnContextMenu::Tree"), _T(""), 0);
N>    }
N>    else
N>    { ::MessageBox(0, _T("OnContextMenu::List"), _T(""), 0);
N>    }
N>    return 0;
N>}
N>

N>Хотелось бы отследить "правый" клик на самом сплиттере (когда курсор меняется на "стрелочки") и ничего не делать в этом случае.
N>Извлечь координаты из lParam и проверка их на вхождение в прямоугольник сплиттера не работает
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
Re: "Правый" клик на сплиттере
От: rus blood Россия  
Дата: 14.03.05 11:48
Оценка:
Здравствуйте, newb, Вы писали:

Тебе нужно ловить WM_CONTEXTMENU на окнах-view, а не на сплиттере.
Имею скафандр — готов путешествовать!
Re[2]: "Правый" клик на сплиттере
От: SaloS http://salos.narod.ru/
Дата: 14.03.05 14:33
Оценка:
Если он хочет отловить WM_CONTEXTMENU на сплиттер баре, то ему нужно ловить именно в сплиттере

Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, newb, Вы писали:


RB>Тебе нужно ловить WM_CONTEXTMENU на окнах-view, а не на сплиттере.
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
Re[3]: "Правый" клик на сплиттере
От: rus blood Россия  
Дата: 14.03.05 15:01
Оценка:
Здравствуйте, SaloS, Вы писали:

SS>Если он хочет отловить WM_CONTEXTMENU на сплиттер баре, то ему нужно ловить именно в сплиттере


Хотелось бы отследить "правый" клик на самом сплиттере (когда курсор меняется на "стрелочки") и ничего не делать в этом случае.


Товарищ повесил context menu на сплиттер, и теперь не знает, как от него избавится.

Смотрите его же код обработчика.

    int b = m_ctrlVSplitter.GetActivePane();
    if (b)
    { ::MessageBox(0, _T("OnContextMenu::Tree"), _T(""), 0);
    }
    else
    { ::MessageBox(0, _T("OnContextMenu::List"), _T(""), 0);
    }
    return 0;

Я думаю, намерения автора видны как на ладоне.
Имею скафандр — готов путешествовать!
Re: "Правый" клик на сплиттере
От: newb  
Дата: 15.03.05 03:08
Оценка:
Приведу более полный код:
class CMyView : public CWindowImpl<CMyView>
{
public:
  DECLARE_WND_CLASS(NULL)

  BEGIN_MSG_MAP(CMyView)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_SIZE, OnSize)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
    NOTIFY_HANDLER(IDC_LST, NM_DBLCLK, OnListDblClick)
  END_MSG_MAP()

  LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled);
  LRESULT OnDestroy(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled);
  LRESULT OnListDblClick(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

  bool FillTree(CTreeViewCtrl &tree);


  LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  {
    m_ctrlVSplitter.Create(m_hWnd, rcDefault, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
    m_ctrlVSplitter.SetSplitterExtendedStyle(0);

    // создание ListView
    m_lvNotes.Create(m_ctrlVSplitter, rcDefault, 0, WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_CLIPSIBLINGS|WS_CLIPCHILDREN, 0, IDC_LST);
    // создание TreeView
    m_tv.Create(m_ctrlVSplitter, rcDefault, 0, TVS_SHOWSELALWAYS | TVS_HASBUTTONS | TVS_LINESATROOT 
                                                     | TVS_HASLINES | TVS_EDITLABELS|TVS_SHOWSELALWAYS 
                                                     | TVS_DISABLEDRAGDROP | WS_CHILD | WS_VISIBLE, 0, IDC_TREE);

    m_ctrlVSplitter.SetSplitterPanes(m_lv, m_tv);

    FillTree(m_tv);
    return 0;
  }


  LRESULT CNotesView::OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  {
    int b = m_ctrlVSplitter.GetActivePane();
    if (b)
    { ::MessageBox(0, _T("OnContextMenu::Tree"), _T(""), 0);
    }
    else
    { ::MessageBox(0, _T("OnContextMenu::List"), _T(""), 0);
    }
    return 0;
  }

protected:
  CSplitterWindow m_ctrlVSplitter;     // Splitter control
  CListViewCtrl m_lv;
  CTreeViewCtrl m_tv;

};


Обработчик OnContextMenu вызывается (MessageBox`ы выскакивают по ContextMenu на клаве, Shift+F10, "правый" клик), причем wParam == m_ctrlVSplitter.m_hWnd всегда, не важно на list или tree был клик.

Ну и проблема:
Хотелось бы отследить "правый" клик на самом сплиттере (когда курсор меняется на "стрелочки") и ничего не делать в этом случае.
Re[4]: "Правый" клик на сплиттере
От: SaloS http://salos.narod.ru/
Дата: 15.03.05 06:17
Оценка:
попробуй функцию GetSplitterBarRect у сплиттера

RB>Товарищ повесил context menu на сплиттер, и теперь не знает, как от него избавится.


RB>Смотрите его же код обработчика.

RB>

RB>

RB>    int b = m_ctrlVSplitter.GetActivePane();
RB>    if (b)
RB>    { ::MessageBox(0, _T("OnContextMenu::Tree"), _T(""), 0);
RB>    }
RB>    else
RB>    { ::MessageBox(0, _T("OnContextMenu::List"), _T(""), 0);
RB>    }
RB>    return 0;
RB>

RB>Я думаю, намерения автора видны как на ладоне.
WTL Helper и WTL Wizards помощники для WTL, скачать отсюда http://salos.narod.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.