Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > незаконно выделяет айтем


Автор: tonchitos 12.5.2008, 16:26
в общем дело так...есть у меня дерево CTreeCtrl на виде, наследованном от сформвью...

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


обработчик нажатия на пункт меню - пустой совсем...стала отлаживать...портится внутри где-то мфсшного кода...из моего обработчика все нормально выходит...


BEGIN_MESSAGE_MAP(CreadMDLView, CFormView)
    ON_NOTIFY(TVN_BEGINLABELEDIT,    IDC_TREE1, &CreadMDLView::OnTvnBeginlabeleditTree1)
    ON_NOTIFY(TVN_ENDLABELEDIT,    IDC_TREE1, &CreadMDLView::OnTvnEndlabeleditTree1)
    ON_NOTIFY(NM_RCLICK,        IDC_TREE1, &CreadMDLView::OnNMRclickTree1) // появление меню при нажатии...
    ON_COMMAND(ID_BACK,        &CreadMDLView::OnBackClick)
    ON_COMMAND(ID_NEXT,        &CreadMDLView::OnNextClick)
    ON_COMMAND(ID_PROPERTIES,    &CreadMDLView::viewProperties) // обработка выбора пункта меню..
    //
    ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CreadMDLView::OnTvnSelchangedTree1)
    ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CreadMDLView::OnNMDblclkTree1)
    //
    ON_WM_SIZE()
    ON_WM_MOVING()
END_MESSAGE_MAP()


Код


void CreadMDLView::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
    CPoint point;
        GetCursorPos(&point);
        m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, AfxGetMainWnd());
    // TODO: Add your control notification handler code here
    *pResult = 0;
}


Код

void CreadMDLView::viewProperties()
{
}


Вот фигли при выходе из viewProperties() и путешествия по коду мфс портится выделенный айтем...в смысле другой выделяецо...

Автор: Earnest 12.5.2008, 16:34
Во-первых, вывод контекстного меню повесь на WM_CONTEXTMENU
А во-вторых, уточни: если ты закомментируешь вторую красную строчку (c voewProperties) , то все нормально работает?

Автор: tonchitos 12.5.2008, 16:41
ну если нет обработчика, то соответственно нажатия не присходит, то соответственно все нормально

Автор: Earnest 12.5.2008, 16:45
Какого нажатия? Где там у тебя нажатие? Имеещь в виду, что пункт меню задизэбден и нажать нельзя?
Ну так поставь временно UPDATE с Enable (true) - нужно проверить... И еще... этот пункт, который выделяется, визуально совпадает со строкой меню?

Добавлено через 1 минуту и 55 секунд
И вызов меню все-таки перевесь...

Автор: tonchitos 12.5.2008, 17:02
если так

 m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, this);
то и без обработчика доступно и все равно выделяет какой то айтем левый...

Добавлено через 14 минут и 17 секунд
в  общем так.. сделала с вмконтекстменю...

тот обработчик убрала и обработку правого клика тоже...

теперь так...до клика на пункт меню портится выделение...

Автор: tonchitos 12.5.2008, 17:24
при входе в
void CreadMDLView::OnContextMenu(CWnd *pWnd, CPoint pos)

все нормально


а вот после этой строчки...все плехо

        m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, AfxGetMainWnd());

Автор: Earnest 13.5.2008, 11:12
Странно все как-то... какая-то грязь...
Попробуй поймать это изменение: сделай обработчик LVN_ITEMCHANGED (или CHANGING), поставь точку прерывания на условие изменения состояния и попробуй посмотреть по стеку, откуда ноги растут:
Код

void CMyWnd::OnItemChanging (NMHDR* pNMHDR, LRESULT*)
{
    NMLISTVIEW* pnmlv = (NMLISTVIEW*)pNMHDR;
    if (pnmlv->uChanged & LVIF_STATE)
    {
        UINT change = pnmlv->uOldState ^ pnmlv->uNewState;
        if (change & LVIS_SELECTED)
                                {
                                   int rrr = 5;   // вот сюда точу прервания
                                }
                 }
}


Автор: tonchitos 13.5.2008, 14:31
фууух, е мое...на самом деле после того как перевесила на ON_WM_CONTEXTMENU()  все работать адеквтно стало...это просо я невнимательная... короче момент такой...если выделить левой кнопкой мыши айтем, и нажать на правую появится меню и все ок...

а если выделить правой кнопкой айтем дерева,то меню то вызывается, но выделение остается на старом пункте.. вот такая новая проблемка...

Автор: Earnest 14.5.2008, 20:01
А правая кнопка выделение по-умолчанию не меняет. Хочешь менять - обрабатывай сама.

Автор: tonchitos 15.5.2008, 15:43
да..так и сделала...хит тестом... в мсдне пример приведе даже для такого случая...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)