Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Popup Меню


Автор: iglaweb 28.8.2009, 02:00
Создаю следующем образом всплывающее меню в обработчике команд WM_CREATE:

Код

    POINT point;
    hMenu2 = LoadMenu (g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP));
    if (NULL != hMenu2)
    {
        hMenuTrackPopup = GetSubMenu(hMenu2, 0);
    
        ClientToScreen(hWnd, (LPPOINT)&point);
    
        TrackPopupMenu(hMenuTrackPopup, 0, point.x, point.y, 0, hWnd, NULL);
    
        DestroyMenu(hMenu2);
    }


Т.е. меню у меня сразу показывается. А как сделать так, чтобы только при тапе по элементу листбокса появлялось всплывающее меню? Желательно примерчик бы)

Автор: Andrey44 28.8.2009, 06:42
Цитата(MSDN)

The WM_CONTEXTMENU message notifies a window that the user clicked the right mouse button (right-clicked) in the window

Автор: 586 28.8.2009, 06:44
Код
case WM_CONTEXTMENU:
    if(GetDlgCtrlID((HWND)wParam) == IDC_LISTBOX1)
    {
        hMenu2 = LoadMenu (g_hInst, MAKEINTRESOURCE(IDR_MENU_POPUP));
        if (NULL != hMenu2)
        {
            hMenuTrackPopup = GetSubMenu(hMenu2, 0);
            TrackPopupMenu(hMenuTrackPopup, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, hWnd, NULL);
            DestroyMenu(hMenu2);
        }
    }
    break;

Автор: iglaweb 28.8.2009, 10:42
А как сделать, чтобы меню появлялось не внизу формы а прямо под курсором?

Автор: Andrey44 28.8.2009, 14:09
Цитата(iglaweb @  28.8.2009,  10:42 Найти цитируемый пост)
А как сделать, чтобы меню появлялось не внизу формы а прямо под курсором? 

Так и передавай в функцию координаты курсора

Автор: GremlinProg 28.8.2009, 14:14
Цитата(WM_CONTEXTMENU Notification @  MSDN)

lParam
The low-order word specifies the horizontal position of the cursor, in screen coordinates, at the time of the mouse click. 
The high-order word specifies the vertical position of the cursor, in screen coordinates, at the time of the mouse click. 

по идее, и так должно работать, т.е. показываться под курсором,
если четко повторять вызов TrackPopupMenu и обработку сообщения за 586

Автор: iglaweb 28.8.2009, 14:46
Ставил брэйкпоинт в обработчике WM_CONTEXTMENU и  туда вообще не заходит:( Пишу кстати под кпк, может есть какая то особенность?

ListBox создаю так:
Код

g_hwndListboxFriends = CreateWindow(L"LISTBOX",NULL,WS_VISIBLE | WS_CHILD | LBS_DISABLENOSCROLL | LBS_STANDARD | LBS_NOTIFY,0,20,r.right,r.bottom-r.top-22-26-20,hWnd,(HMENU)ID_LISTBOX1,g_hInst,NULL);



Автор: iglaweb 28.8.2009, 15:03
дайте пожалуйста примерчик, как сабклассить ListBox,  smile 

Автор: iglaweb 28.8.2009, 21:37
Переделал под себя один из найденных примеров, но даже в функцию ListBoxProc не заходит при отладке.

Код

//Вначале
WNDPROC OldListBoxProc;
LRESULT CALLBACK ListBoxProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
//В обработчике WM_CREATE

g_hwndListboxFriends = CreateWindow(L"LISTBOX",NULL,WS_VISIBLE | WS_CHILD | LBS_DISABLENOSCROLL | LBS_STANDARD | LBS_NOTIFY,0,20,r.right,r.bottom-r.top-22-26-20,hWnd,(HMENU)ID_LISTBOX_FRIENDS,g_hInst,NULL);
OldListBoxProc = SubclassWindow(g_hwndListboxFriends, ListBoxProc);
SendDlgItemMessage(hWnd,ID_LISTBOX_FRIENDS,LB_ADDSTRING,0,(LPARAM)L"Проба пера");





//Собственна сама функция
LRESULT CALLBACK ListBoxProc(HWND hwnd, UINT Message,
                         WPARAM wParam, LPARAM lParam)
{
    switch (Message)
    {
    case WM_CONTEXTMENU:
        {
            int index = SendMessage(hWnd, LB_ITEMFROMPOINT, 0, lParam);
            POINT point;
            point.x = LOWORD(lParam);
            point.y = HIWORD(lParam);
            ClientToScreen(hwnd, &point);
            int menuid = TrackPopupMenu(g_FriendsPopup, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD, point.x, point.y, 0, hWnd, 0);
            DestroyMenu(g_FriendsPopup);
        }
        break;
        default:
            return CallWindowProc(OldListBoxProc, hwnd, Message, wParam, lParam);
    }    
}



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