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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контекстное меню, WinAPI 
V
    Опции темы
Qwe2
Дата 11.4.2012, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Создаю диалоговое окно, делаю его невидимым и отображаю контекстное меню. Мне нужно возвращать номер пункта меню или ноль, если пользователь щелкнул мимо (и закрывать невидимое диалоговое окно). Но у меня получается, что EndDialog всегда возвращает 0...

Код

static BOOL CALLBACK ShowContextMenuDlgProc(HWND, UINT, WPARAM, LPARAM);
static BOOL ShowContextMenuDlgOnIntit(HWND, HWND, LPARAM);
static void ShowContextMenuDlgOnCommand(HWND, int, HWND, UINT);
static int iIDCMenuItem;

//
int ShowContextMenuMy(HWND hWnd)
{
    iIDCMenuItem = 0;
    return DialogBox(hInstance, "EMPTY", hWnd, ShowContextMenuDlgProc);
}

//
BOOL CALLBACK ShowContextMenuDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, ShowContextMenuDlgOnIntit);
        HANDLE_MSG(hWnd, WM_COMMAND, ShowContextMenuDlgOnCommand);
        default:
            return FALSE;
    }
}

// OnInit
BOOL ShowContextMenuDlgOnIntit(HWND hWnd, HWND, LPARAM)
{
    ShowWindow(hWnd, 0);
    SendMessage(hWnd, WM_COMMAND, 500, 0);

    return TRUE;
}

// OnCommand
void ShowContextMenuDlgOnCommand(HWND hWnd, int id, HWND, UINT)
{
    switch(id)
    {
    case 500:
        HMENU hMenu;
        POINT pt;
        
        GetCursorPos(&pt);
        hMenu = CreatePopupMenu();
        AppendMenu(hMenu, MF_BYCOMMAND | MF_ENABLED, 501, "Пунтк 1");
        AppendMenu(hMenu, MF_BYCOMMAND | MF_ENABLED, 502, "Пункт 2");
        AppendMenu(hMenu, MF_BYCOMMAND | MF_ENABLED, 503, "Пункт 3");
        TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, NULL, hWnd, NULL);
        DestroyMenu(hMenu);

        EndDialog(hWnd, iIDCMenuItem);
        break;

    case 501:
        iIDCMenuItem = 1;
        break;

    case 502:
        iIDCMenuItem = 2;
        break;

    case 503:
        iIDCMenuItem = 3;
        break;

    case IDCANCEL:
        EndDialog(hWnd, 0);
        break;
    }
}

PM MAIL   Вверх
Earnest
Дата 11.4.2012, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это потому, что ты диалог закрываешь до того, как меню сработает. Оно вовсе не синхронно работает. Либо добавь флаг синхронной обработки (TPM_RETURNCMD, при этом нужно получить результат и сразу его вернуть и не нужны никакие другие кэйсы). Либо перенеси EndDialog в кейсы получения команд меню. 


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


Новичок



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

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



Спасибо, сделал с TPM_RETURNCMD и без кейсов в OnInitDlg...
PM MAIL   Вверх
GremlinProg
Дата 12.4.2012, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Earnest @  11.4.2012,  18:08 Найти цитируемый пост)
Это потому, что ты диалог закрываешь до того, как меню сработает. Оно вовсе не синхронно работает.

TrackPopupMenu не вернется, пока меню не закроется, даже без TPM_RETURNCMD,
ошибка была в чем-то другом

Добавлено через 3 минуты и 53 секунды
скорее всего, WM_COMMAND из меню посылается post'ом, поэтому при вызове EndDialog, iIDCMenuItem еще не установлен


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


Эксперт
****


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

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



Цитата(GremlinProg @  12.4.2012,  07:17 Найти цитируемый пост)
скорее всего, WM_COMMAND из меню посылается post'ом, поэтому при вызове EndDialog, iIDCMenuItem еще не установлен


Цитата(Earnest @  11.4.2012,  17:08 Найти цитируемый пост)
Это потому, что ты диалог закрываешь до того, как меню сработает.

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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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