Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Popup Меню 
V
    Опции темы
iglaweb
Дата 28.8.2009, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Создаю следующем образом всплывающее меню в обработчике команд 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);
    }


Т.е. меню у меня сразу показывается. А как сделать так, чтобы только при тапе по элементу листбокса появлялось всплывающее меню? Желательно примерчик бы)
PM MAIL ICQ   Вверх
Andrey44
Дата 28.8.2009, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(MSDN)

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



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
586
Дата 28.8.2009, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Код
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;

PM   Вверх
iglaweb
Дата 28.8.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как сделать, чтобы меню появлялось не внизу формы а прямо под курсором?
PM MAIL ICQ   Вверх
Andrey44
Дата 28.8.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



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

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


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 28.8.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
iglaweb
Дата 28.8.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ставил брэйкпоинт в обработчике 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);



PM MAIL ICQ   Вверх
iglaweb
Дата 28.8.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



дайте пожалуйста примерчик, как сабклассить ListBox,  smile 
PM MAIL ICQ   Вверх
iglaweb
Дата 28.8.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Переделал под себя один из найденных примеров, но даже в функцию 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);
    }    
}



PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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