Открытие меню правой кнопокй мыши
От: Аноним  
Дата: 08.12.04 08:54
Оценка:
Подскажите что неверно

Есть в диалоговом окне CListBox

Для данного контрла пишу код открытие меню правой кнопкой мыши:

void CMy_Link_Page::OnRclick()
{
UINT nFlags;
CPoint pt;
CMenu MyMenu;
HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
MyMenu.Attach( hmnu );
GetCursorPos(&pt);
hmnu=MyMenu.Detach();
MyMenu.CreatePopupMenu();
m_list.ScreenToClient(&pt);
MyMenu.AppendMenu(MF_STRING,0,"test1");
MyMenu.AppendMenu(MF_STRING,0,"test2");
::GetCursorPos(&pt);
int Cmd=MyMenu.TrackPopupMenu(TPM_LEFTALIGN ,pt.x,pt.y,this,0);
}

в карте сообщений пишу:
ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclick)

Если контрол наследован от CListCtrl и создается через Create() все нормально, а с CListBox не работает

Помогите пожалуйста!!!
Re: Открытие меню правой кнопокй мыши
От: nii_im_b Мухосранск  
Дата: 08.12.04 09:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите что неверно


А>Есть в диалоговом окне CListBox


А>Для данного контрла пишу код открытие меню правой кнопкой мыши:


А>void CMy_Link_Page::OnRclick()

А>{
А> UINT nFlags;
А> CPoint pt;
А> CMenu MyMenu;
А> HMENU hmnu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
А> MyMenu.Attach( hmnu );
А> GetCursorPos(&pt);
А> hmnu=MyMenu.Detach();
А> MyMenu.CreatePopupMenu();
А> m_list.ScreenToClient(&pt);
А> MyMenu.AppendMenu(MF_STRING,0,"test1");
А> MyMenu.AppendMenu(MF_STRING,0,"test2");
А> ::GetCursorPos(&pt);
А> int Cmd=MyMenu.TrackPopupMenu(TPM_LEFTALIGN ,pt.x,pt.y,this,0);
А>}

А>в карте сообщений пишу:

А>ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclick)

А>Если контрол наследован от CListCtrl и создается через Create() все нормально, а с CListBox не работает


А>Помогите пожалуйста!!!


а по моему (не буду утверждать) у CListBox из событий мыши только даблклик... рекомендую посмотреть LBN_messages
Re[2]: Открытие меню правой кнопокй мыши
От: Игорь Вартанов Ниоткуда  
Дата: 09.12.04 15:23
Оценка:
Здравствуйте, nii_im_b, Вы писали:

__>рекомендую посмотреть LBN_messages


Рекомендую не смотреть. Правого клика там нету.

Нужно юзать тривиальный ON_WN_RBUTTONUP
#define _AFXDLL
#include <afxwin.h>

class CMyLB : public CListBox
{
    DECLARE_MESSAGE_MAP()

    void OnRButtonUp( UINT /**/, CPoint pt )
    {
        BOOL outside = TRUE;
        UINT item = ItemFromPoint( pt, outside );
        CString s;
        if( outside )
            s = "None";
        else
            GetText( item, s );
        CMenu m;
        m.CreatePopupMenu();
        m.AppendMenu( MF_STRING, 0, s );
        m.AppendMenu( MF_SEPARATOR, 0, (LPCTSTR)NULL );
        m.AppendMenu( MF_STRING, ID_APP_EXIT, _T("Exit") );
        POINT p;
        GetCursorPos(&p);
        m.TrackPopupMenu( 0, p.x, p.y, AfxGetMainWnd() );
    }
};
BEGIN_MESSAGE_MAP(CMyLB, CListBox)
    ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

class CMainFrame: public CFrameWnd
{
    CMyLB* m_plb;
    BOOL OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pcx )
    {
        m_plb = new CMyLB();
        m_plb->CreateEx( WS_EX_CLIENTEDGE, _T("LISTBOX"), NULL,
                         WS_VISIBLE | WS_BORDER | WS_CHILD | LBS_STANDARD, 
                         CRect(10, 10, 110, 110), this, -1, NULL );

        m_plb->AddString(_T("Zero"));
        m_plb->AddString(_T("First"));
        m_plb->AddString(_T("Second"));
        return TRUE;
    }    
};

class CMyApp: public CWinApp
{
    BOOL InitInstance()
    {
        CMainFrame* pFrame = new CMainFrame();
        m_pMainWnd = pFrame;
        pFrame->Create(NULL, "List Menu");
        pFrame->ShowWindow(SW_SHOW);
        pFrame->UpdateWindow();
        return TRUE;
    }    
};

CMyApp theApp;
---
С уважением,
Игорь
Re[3]: Открытие меню правой кнопокй мыши
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 09.12.04 15:28
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>Нужно юзать тривиальный ON_WN_RBUTTONUP


А не WM_CONTEXTMENU ?
[ posted via RSDN@Home 1.1.4 beta 3 r241 ]
- Искренне ваш, Поросенок Пафнутий
Re[4]: Открытие меню правой кнопокй мыши
От: Игорь Вартанов Ниоткуда  
Дата: 09.12.04 15:40
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

ИВ>>Нужно юзать тривиальный ON_WN_RBUTTONUP


SDB>А не WM_CONTEXTMENU ?


А есть принципиальная разница?

Попробовал, работает и так, и эдак. Разница в том только, какие координаты пригоняются.
на WM_RBUTTON приходят клиентские, на WM_CONTEXTMENU — экранные...
---
С уважением,
Игорь
Re[5]: Открытие меню правой кнопокй мыши
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 09.12.04 17:09
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

SDB>>А не WM_CONTEXTMENU ?


ИВ>А есть принципиальная разница?


Кнопка App на современных клавиатурах.
[ posted via RSDN@Home 1.1.4 beta 3 r241, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re[6]: Открытие меню правой кнопокй мыши
От: Игорь Вартанов Ниоткуда  
Дата: 09.12.04 17:25
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>>>А не WM_CONTEXTMENU ?


ИВ>>А есть принципиальная разница?


SDB>Кнопка App на современных клавиатурах.


И много в ней пользы? При ее нажатии меню активируется, но координаты приходят совершенно левые (-1, -1). Так что, очень сильно зависит от задачи.
---
С уважением,
Игорь
Re[7]: Открытие меню правой кнопокй мыши
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 09.12.04 17:35
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:

ИВ>И много в ней пользы? При ее нажатии меню активируется, но координаты приходят совершенно левые (-1, -1).


Для меня, я ей пользуюсь почти постоянно. Что касается координат — об этом в MSDN так и написано, вместо "левых" можно подставить, например, координаты левого верхнего угла активного окна, координаты выделенного элемента списка, координаты каретки в редакторе, etc.

ИВ>Так что, очень сильно зависит от задачи.


Ну, мэй би... не будем флеймить. Хотя формально — вся функциональсть приложения должна быть доступна как от мышки, так и от клавиатуры (AFAIK при невыполнении этого требования не удастся получить нашлепку "designed for Microsoft Windows").
[ posted via RSDN@Home 1.1.4 beta 3 r241, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re[8]: Открытие меню правой кнопокй мыши
От: Игорь Вартанов Ниоткуда  
Дата: 11.12.04 09:15
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Ну, мэй би... не будем флеймить. Хотя формально — вся функциональсть приложения должна быть доступна как от мышки, так и от клавиатуры (AFAIK при невыполнении этого требования не удастся получить нашлепку "designed for Microsoft Windows").



Тогда Microsoft сама у себя бы не получила заветную нашлепку, т.к. листбокс не предоставляет желанной возможности разделять highlighted и selected элементы клавиатурными манипуляциями (а мышью — сколько угодно). Это реализовано только в listview.

Я ведь не зря привел пример с получением мышью произвольного айтема из листбокса в контекстное меню. Если пользоваться клавиатурой и WM_CONTEXTMENU, из состояния листбокса можно извлечь информацию максимум для выделенного элемента, но никак не для произвольного.
---
С уважением,
Игорь
Re[3]: Открытие меню правой кнопокй мыши
От: se-ga Украина  
Дата: 24.06.05 20:47
Оценка:
...

ИВ> UINT item = ItemFromPoint( pt, outside );

...

пробовал использовать эту функцию, конечно мне не повезло... оказалось — The CListBox member function ItemFromPoint() is not implemented in Win32s or Windows NT, but the documentation for the member function does not state this fact ( это на http://www.kbalertz.com/kb_Q148498.aspx )

там же предлагают альтернативу

int LBItemFromPt( HWND hLB,
POINT pt,
BOOL bAutoScroll
);


знал бы раньше, никогда б XP не поставил
по настоящему начинаешь ценить basic только изучая с++ (международная мудрость)
Re[4]: Открытие меню правой кнопокй мыши
От: Игорь Вартанов Ниоткуда  
Дата: 27.06.05 07:11
Оценка:
Здравствуйте, se-ga, Вы писали:

SG>...


ИВ>> UINT item = ItemFromPoint( pt, outside );

SG>...

SG>пробовал использовать эту функцию, конечно мне не повезло... оказалось — The CListBox member function ItemFromPoint() is not implemented in Win32s or Windows NT, but the documentation for the member function does not state this fact ( это на http://www.kbalertz.com/kb_Q148498.aspx )


NT бывают разные, например 3.51 (никогда в глаза не видел, и боюсь, что уже не увижу никогда, ибо я и четверку уже забывать начал).

MSDN:

LB_ITEMFROMPOINT Message

Message Information

Header Declared in Winuser.h, include Windows.h
Minimum operating systems Windows 95, Windows NT 4.0

Т.е. ты (со слов какого-то там kbalertz.com) хочешь сказать, что в четверке этот месседж не обрабатывается?

SG>там же предлагают альтернативу


SG>int LBItemFromPt( HWND hLB,

SG> POINT pt,
SG> BOOL bAutoScroll
SG>);

А это хде???
---
С уважением,
Игорь
Re[5]: Открытие меню правой кнопокй мыши
От: se-ga Украина  
Дата: 27.06.05 11:26
Оценка:
Здравствуйте, Игорь Вартанов, Вы писали:


ИВ>NT бывают разные, например 3.51 (никогда в глаза не видел, и боюсь, что уже не увижу никогда, ибо я и четверку уже забывать начал).

ИВ>Т.е. ты (со слов какого-то там kbalertz.com) хочешь сказать, что в четверке этот месседж не обрабатывается?

Я думаю что на сегодня более распространён XP, чем NT. Поэтому ориентироваться надо на XP.


SG>>там же предлагают альтернативу


SG>>int LBItemFromPt( HWND hLB,

SG>> POINT pt,
SG>> BOOL bAutoScroll
SG>>);

ИВ>А это хде???


на http://www.kbalertz.com/kb_Q148498.aspx , а с "порамитрами" из msdn.
по настоящему начинаешь ценить basic только изучая с++ (международная мудрость)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.