"Правый" клик на сплиттере
От:
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: "Правый" клик на сплиттере
Я думаю у тебя этот метод никогда не вызывается, так как 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 и проверка их на вхождение в прямоугольник сплиттера не работает
Re: "Правый" клик на сплиттере
Здравствуйте, newb, Вы писали:
Тебе нужно ловить WM_CONTEXTMENU на окнах-view, а не на сплиттере.
Имею скафандр — готов путешествовать!
Re[2]: "Правый" клик на сплиттере
Если он хочет отловить WM_CONTEXTMENU на сплиттер баре, то ему нужно ловить именно в сплиттере
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, newb, Вы писали:
RB>Тебе нужно ловить WM_CONTEXTMENU на окнах-view, а не на сплиттере.
Re[3]: "Правый" клик на сплиттере
Здравствуйте, 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]: "Правый" клик на сплиттере
попробуй функцию 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>Я думаю, намерения автора видны как на ладоне.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить