Вывод меню с правым кликом мышки по CListBox'у.
От: DeDMakar  
Дата: 19.10.08 12:18
Оценка:
Поправлено форматирование текста. — SchweinDeBurg

У меня есть ЛистБох. На нем еще не выделенный Итем. С помощью правого клика мышки должно совершаться: 1)выделение Итема 2)вывод меню.
Я отлавливаю сообщение ON_MESSAGE(WM_CONTEXTMENU,OnPOPUPMenu) и сама функция:

LRESULT CWinDlg::OnPOPUPMenu(WPARAM wParam,LPARAM lParam)
{
    if(GetDlgItem(IDC_LIST4)->m_hWnd==(HWND)wParam){

                ////1 способ нажатия левой кнопки мышки
        INPUT aInput;
        aInput.type = INPUT_MOUSE;
        aInput.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &aInput,sizeof(aInput) );
        INPUT bInput;
        bInput.type = INPUT_MOUSE;
        bInput.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &bInput,sizeof(bInput) );

        CPoint pt;
        GetCursorPos(&pt);
                ////2 способ нажатия левой кнопки мышки
        mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 0); //Click Down
        mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 0); //Click Up 
                ////3 способ нажатия левой кнопки мышки
        PostMessage(WM_LBUTTONDOWN,MK_LBUTTON,lParam);
        PostMessage(WM_LBUTTONUP,MK_LBUTTON,lParam);

        if (m_ListMultibox.GetCurSel()==LB_ERR )    // если в списке ничего не выбрано
        {
            AfxMessageBox("Select Item List Box");    // сообщить о ошибке
        }
        else    // иначе, то есть что-то выбрано
        {
            m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON 
                ,(short)LOWORD(lParam),(short)HIWORD(lParam),this,0); //вывод меню
        }
    }
     return TRUE;
}

Ошибка в том, что происходит толька левый клик. А меню не успевает раскрываться. Как сделать по другому выделение Итема?


19.10.08 18:02: Перенесено из 'Декларативное программирование'
Re: Вывод меню с правым кликом мышки по CListBox'у.
От: Hawk Россия  
Дата: 20.10.08 09:42
Оценка:
Здравствуйте, DeDMakar, Вы писали:

DDM> Как сделать по другому выделение Итема?


Например, через CListCtrl::SetItem():
...
CListCtrl myListCtrl;
...
int nItem = 5;
myListCtrl.SetItem(nItem, 0, LVIF_STATE, NULL, 0, LVIS_SELECTED, 
    LVIS_SELECTED, 0);
Re: Вывод меню с правым кликом мышки по CListBox'у.
От: Аноним  
Дата: 21.10.08 10:39
Оценка:
Удалено избыточное цитирование. Исправлено форматирование текста. — SchweinDeBurg

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

DDM>Ошибка в том, что происходит толька левый клик. А меню не успевает раскрываться. Как сделать по другому выделение Итема?


Делай через PreTranslateMessage(MSG* pMsg)

!! Определить что это именно твой контрол!
if(pMsg->message == WM_RBUTTONDOWN)
{
/// Все что угодно
}
Re[2]: Вывод меню с правым кликом мышки по CListBox'у.
От: Pavel Dvorkin Россия  
Дата: 21.10.08 10:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делай через PreTranslateMessage(MSG* pMsg)

А>!! Определить что это именно твой контрол!
А>if(pMsg->message == WM_RBUTTONDOWN)
А>{
А>/// Все что угодно
А>}

Или сделай наследника от CListBox и в нем лови то же самое.
With best regards
Pavel Dvorkin
Re: Вывод меню с правым кликом мышки по CListBox'у.
От: DeDMakar  
Дата: 21.10.08 20:37
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

О, спасибо. Я унаследовал MyListBox у CListBox и прописал событие OnRButtonUp.
Все работает, но я не могу загрузить ресурс Меню IDR_MENU2. Как првельно сделать?

void MyListBox::OnRButtonUp(UINT nFlags, CPoint point)
{
    BOOL outside = TRUE;
    UINT item = CListBox::ItemFromPoint( point, outside );
    CString s;
    if( outside ){
       s = "None";
    }else{
       CListBox::SetCurSel(item);
    }
    m_PopupMenu.LoadMenu(IDR_MENU2);
    m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this,0);
}
Re[2]: Вывод меню с правым кликом мышки по CListBox'у.
От: Pavel Dvorkin Россия  
Дата: 22.10.08 03:41
Оценка:
Здравствуйте, DeDMakar, Вы писали:

DDM> m_PopupMenu.LoadMenu(IDR_MENU2);

DDM> m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this,0);

Да вроде все правильно. Проверь наличие IDR_MENU2. Если не поможет — протрассируй вызов LoadMenu, скорее всего станет ясно.

P.S. IDR_MENU2 здесь же, в EXE ? Не в DLL ?
With best regards
Pavel Dvorkin
Re[2]: Вывод меню с правым кликом мышки по CListBox'у.
От: DeDMakar  
Дата: 22.10.08 19:48
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Подключаем в свой .cpp файл:

#include "resource.h" // Идентификаторы ресурсов

И в функции изменяем данные, типо такого:

void MyListBox::OnRButtonUp(UINT nFlags, CPoint point)
{
    BOOL outside = TRUE;
    UINT item = CListBox::ItemFromPoint( point, outside );
    CString s;
    if( outside ){
       s = "None";
    }else{
       CListBox::SetCurSel(item);
    }

    CPoint pt;
    GetCursorPos(&pt);
    if(m_PopupMenu.m_hMenu == NULL)
    {
         m_PopupMenu.LoadMenu(IDR_MENU2); 
    }
    m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd());
    ASSERT(m_PopupMenu);
}

Всем спасибо. P.S. Макаров Анатолий
onrbuttonup cmenu меню
[от модератора]
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 23.10.08 06:24
Оценка:
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.