Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnContextMenu на контроле 
:(
    Опции темы
tonchitos
Дата 30.6.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



Вот у мя к примеру есть мейнфрейм, в нем есть панель аутлука и дерево на этой панели

    CBCGPOutlookBar        m_wndBarOutlook;
    CTreeCtrl m_OutlTreeCtrl;


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

как мне сделать чтоб у панели было контекстное меню?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 1.7.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Пиши обработчик WM_CONTEXTMENU у панели, а еще лучше - у дерева (если это имеется в виду).


--------------------
...
PM   Вверх
tonchitos
Дата 1.7.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



но в таком случае клас панели надо переопределять, верно ж?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 1.7.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



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


Код

class myProjectExplorer: public  CTreeCtrl
{
public:
    myProjectExplorer();
    virtual ~myProjectExplorer();
    CImageList    m_image ; 
public:
    CMenu m_PopupMenu;
    DECLARE_MESSAGE_MAP()

    virtual void OnContextMenu(CWnd *pWnd, CPoint pos);
protected:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

};



Код


BEGIN_MESSAGE_MAP(myProjectExplorer, CTreeCtrl)
    ON_WM_CONTEXTMENU()
    ON_WM_CREATE()
END_MESSAGE_MAP()

myProjectExplorer::myProjectExplorer()
{
}

myProjectExplorer::~myProjectExplorer()
{
}

void myProjectExplorer::OnContextMenu(CWnd *pWnd, CPoint pos)
{
    UINT uFlags;
    CPoint point(pos);
    ScreenToClient(&point);
    HTREEITEM hItem = HitTest(point, &uFlags);

    if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
    {
        Select(hItem, TVGN_CARET);
    }

        m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, pos.x, pos.y, GetParentFrame());
    CTreeCtrl::OnContextMenu(pWnd,pos);
}

int myProjectExplorer::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
       return -1;
    m_PopupMenu.LoadMenu(IDR_CONTEXT_EXPLORER);
        ASSERT(m_PopupMenu!=NULL);
    return 0;
}



и ф чем прикол?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 1.7.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



плюс я в свое переопределенное дерево добавила обработчики нажатия пунктов меню...а они все равно серенькие...((


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 3.7.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



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


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 4.7.2008, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(tonchitos @  1.7.2008,  18:19 Найти цитируемый пост)
вот что за бред, переопределила контрол, а контекстное меню вызываетя почему-то двойным щелчком 

Если имеешь в виду двойной щелчок правой клавишей, то это, скорее всего, из-за лишнего кода в OnContextMenu. Оставь там только TrackPopupMenu и вместо GetParentFrame() поставь this.
А выделение элемента перенеси в обработчик OnRButtonDown, только в конце его не забудь вызвать Default, а то меню вызываться не будет.

Цитата(tonchitos @  1.7.2008,  19:03 Найти цитируемый пост)
плюс я в свое переопределенное дерево добавила обработчики нажатия пунктов меню...а они все равно серенькие...(( 

Разумеется, их никто не вызывает - ты же парентом поставила главное окно, а в нем нужных обработчиков нет. 
Там оболочка трудится: где нет обработчик, засеривает. 
А по Windows перед выпадением меню посылается сообщение WM_INITPOPUPMENU, вот в нем и можно все обработать. 
Это если нужно иногда что-то дизэблить или текст менять или еще что, причем скопом, через вызов EnableMenuItem для всех нужных пунктов. А если не нужно - то вобще этот обработчик можно не делать.
И естественно, все обработчики нужно в дерево.


--------------------
...
PM   Вверх
tonchitos
Дата 4.7.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ну насчет двойного щелчка...он же даж в ф-ию не заходит (((



--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 4.7.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Странно... вешала я на деревья контектсное меню, всегда нормально было...


--------------------
...
PM   Вверх
tonchitos
Дата 7.7.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



я щас тогда побольше кода выложу, может это ситуацию прояснит...


Код

class myProjectExplorer: public  CTreeCtrl
{
public:
    myProjectExplorer();
    virtual ~myProjectExplorer();
    CImageList    m_image ;    
    cListFileName *m_listFileName;

public:
    CMenu m_PopupMenu;
    DECLARE_MESSAGE_MAP()

    virtual void OnContextMenu(CWnd *pWnd, CPoint pos);
protected:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

};


BEGIN_MESSAGE_MAP(myProjectExplorer, CTreeCtrl)
    ON_WM_CONTEXTMENU()
    ON_WM_CREATE()
    //
    //

END_MESSAGE_MAP()

myProjectExplorer::myProjectExplorer()
{
    m_listFileName = 0;
}

myProjectExplorer::~myProjectExplorer()
{
}

void myProjectExplorer::OnContextMenu(CWnd *pWnd, CPoint pos)
{
    UINT uFlags;
    CPoint point(pos);
    ScreenToClient(&point);
    HTREEITEM hItem = HitTest(point, &uFlags);

    if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
    {
        Select(hItem, TVGN_CARET);
    }

        m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, pos.x, pos.y, this);
}

int myProjectExplorer::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
       return -1;
    ModifyStyle(LVS_TYPEMASK,TVS_LINESATROOT | TVS_HASLINES |
                        TVS_HASBUTTONS | TVS_EDITLABELS );

    m_image.Create(16, 16, ILC_MASK, 0, 32);

    for (UINT nID = IDB_PROJECT_1; nID <= IDB_PROJECT_2; nID++)
    {
        CBitmap bitmap;
        bitmap.LoadBitmap(nID);
        m_image.Add(&bitmap, RGB(255,255,255));
        bitmap.DeleteObject();
    } 
    SetImageList(&(m_image), TVSIL_NORMAL );

    m_PopupMenu.LoadMenu(IDR_CONTEXT_EXPLORER);
        ASSERT(m_PopupMenu!=NULL);
    return 0;
}



в классе фрейма
Код


public:
    CBCGPOutlookBar        m_wndBarOutlook;
    myProjectExplorer         m_OutlTreeCtrl;
    CMenu                           m_PopupMenu;



Код


BOOL CMainFrame::CreateOutlookBar ()
{
    if (!m_wndBarOutlook.Create (_T("Shortcuts"), this, CRect (0, 0, 200, 100), 
        1, WS_CHILD | WS_VISIBLE | CBRS_LEFT))
    {
        return FALSE;        // fail to create
    }

    CBCGPOutlookWnd* pOutlookBar = (CBCGPOutlookWnd*) m_wndBarOutlook.GetUnderlinedWindow ();

    if (pOutlookBar == NULL)
    {
        ASSERT (FALSE);
        return FALSE;
    }

    pOutlookBar->EnableInPlaceEdit (TRUE);

    DWORD dwPaneStyle = dwDefaultToolbarStyle | CBRS_FLOAT_MULTI;

    m_PopupMenu.LoadMenu(IDR_CONTEXT_EXPLORER);
        ASSERT(m_PopupMenu!=NULL);
    DWORD dwBCGStyle = CBRS_BCGP_FLOAT | CBRS_BCGP_AUTOHIDE | CBRS_BCGP_RESIZE;
    m_OutlTreeCtrl.Create(WS_VISIBLE| WS_CHILD,CRect(0,0,100,100), pOutlookBar,1);
    pOutlookBar->AddControl(&m_OutlTreeCtrl,_T("Project Explorer"));

    m_wndBarOutlook.SetBarStyle(m_wndBarOutlook.GetBarStyle() |
        CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

    return TRUE;
}



все вроде как надо


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 7.7.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



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


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.