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


Автор: Pale_Master 22.8.2007, 18:34
Код

case WM_LBUTTONDOWN:
    {
        POINT ptCursor = {LOWORD(lParam),HIWORD(lParam)};

        ::ClientToScreen(m_hWindow,&ptCursor);
        ::SendMessage(hAnyFrame,WM_SYSCOMMAND,SC_MOUSEMENU | 0x0003,MAKELPARAM(ptCursor.x,ptCursor.y));
    }
    break;


Меню создается, а потом приходит WM_MENUSELECT с wParam == 0xffff0000 and lParam == 0 и меню закрывается. Вопрос: что сделать, чтобы меню не закрывалось сразу после создания?

Автор: Dogo 25.8.2007, 21:44
Попробуй вместо SendMessage так:
Код

TrackPopupMenu(GetSystemMenu(hAnyFrame, FALSE),
               TPM_RIGHTBUTTON|TPM_LEFTALIGN,
               ptCursor.x,
               ptCursor.y,
               0,
               hAnyFrame,
               NULL);

Автор: Pale_Master 26.8.2007, 14:06
Dogo, да, так конечно же можно сделать, но, возникает 2 проблемы:
1) состояние и количество элементов меню не синхронизируется с состоянием окна;
2) не обрабатываются собственно сами команды от меню;

Автор: NiJazz 28.8.2007, 08:30
Цитата

1) состояние и количество элементов меню не синхронизируется с состоянием окна;

Создавай меню каждый раз при нажатии мыши. Это быстрый процесс.
Цитата

2) не обрабатываются собственно сами команды от меню;

А это уже проблема в другом. smile

Автор: Pale_Master 1.9.2007, 14:12
Разобрался. Спасибо всем, кто пытался помочь. На самом деле существует специальное недокументированное сообщение 0x0313 в lParam которого передаются x & y позиции в которой должно быть отображено меню.

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