не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 05.07.04 18:24
Оценка:
Создаю менюшку
g_hMenu = ::CreatePopupMenu();
MENUINFO mi = {0};
mi.fMask = MIM_STYLE;
mi.dwStyle = MNS_DRAGDROP;
::SetMenuInfo( g_hMenu, &mi );
::AppendMenu( g_hMenu,...
::AppendMenu( g_hMenu,...


потом обработчик в проиемном окне
MESSAGE_HANDLER(WM_MENUDRAG, OnMenuDrag)
...
LRESULT OnMenuDrag(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
o    return MND_CONTINUE;   // breakpoint!!!
}


вызываю менюшку
LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    POINT stPoint;
    ::GetCursorPos( &stPoint );
    ::TrackPopupMenu( g_hMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, stPoint.x, stPoint.y, this->m_hWnd );
    ::SetForegroundWindow( this->m_hWnd );
    SendMessage( WM_NULL,0,0);
    return 0;
}


И НЕТУ НА БРЭЙКПОИНТЕ НИЧЕГО!!! :((
Re: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 06.07.04 04:52
Оценка:
V>И НЕТУ НА БРЭЙКПОИНТЕ НИЧЕГО!!! :((

ну как же так? никто ничего не знает? (три отрицания)
Re: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 06.07.04 11:34
Оценка:
Здравствуйте, vovas, Вы писали:

V>Создаю менюшку

V>
..........
V>


Что возвращает SetMenuInfo ?
Имею скафандр — готов путешествовать!
Re[2]: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 07.07.04 09:30
Оценка:
Здравствуйте, rus blood, Вы писали:


RB>Что возвращает SetMenuInfo ?



возвращает TRUE !!!
Re[3]: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 07.07.04 09:53
Оценка:
Здравствуйте, vovas, Вы писали:

А сообщение WM_MENUGETOBJECT ты обработал?
Имею скафандр — готов путешествовать!
Re[4]: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 07.07.04 09:58
Оценка:
Здравствуйте, rus blood, Вы писали:
RB>А сообщение WM_MENUGETOBJECT ты обработал?

конечно обработал!
только это собщение приходит после
WM_MENUDRAG
сначала драг должно прийти, а потом гэтобджект...
я в WM_MENUGETOBJECT уже и
HRESULT l_hRes = ::DoDragDrop( pDO, pDS, DROPEFFECT_MOVE, &dwEff );

вызвал на всяк пожарный....
Re[5]: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 07.07.04 10:04
Оценка:
Здравствуйте, vovas, Вы писали:

V>Здравствуйте, rus blood, Вы писали:

RB>>А сообщение WM_MENUGETOBJECT ты обработал?

V>только это собщение приходит после

V>WM_MENUDRAG
V>сначала драг должно прийти, а потом гэтобджект...

Извини за тупость...

Должно или реально приходит?
В первом посте ты вроде написал, что WM_MENUDRAG НЕ приходит....
Имею скафандр — готов путешествовать!
Re[6]: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 07.07.04 10:17
Оценка:
Здравствуйте, rus blood, Вы писали:
RB>Должно или реально приходит?
ВООБЩЕ не приходит ничего.
Беру МенюИтемб тащу, а брейкпоинт молчит!!!
(у меня не заработало в рабочем проекте, и я сходу
накалякал просто WTL-проект для теста — и ничего)
Re[3]: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 07.07.04 10:51
Оценка:
Здравствуйте, vovas, Вы писали:

RB>>Что возвращает SetMenuInfo ?


V>возвращает TRUE !!!


Ты уверен???

1. Если взять точно твой код, то возвращается FALSE. Причина — неинициализировано поле cbSize у структуры MENUINFO.

2. У функции TrackPopupMenu после параметров координт точки идет параметр lReserved. Ты случайно параметрами не ошибся? Команды меню вообще в окно приходят?

Сделал пример. Все работает, как надо. WM_MENUDRAG вызывается на ура...
Имею скафандр — готов путешествовать!
Re[4]: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 07.07.04 10:53
Оценка:
Здравствуйте, rus blood, Вы писали:

Код вызова меню...

        HMENU hMenu = LoadMenu(_Module.m_hInst, MAKEINTRESOURCE(IDR_CONTEXTMENU));
        if (hMenu && IsMenu(hMenu))
        {
            HMENU hSubMenu = GetSubMenu(hMenu, 0);
            if (hSubMenu && IsMenu(hSubMenu))
            {
                MENUINFO mi = {0};
                mi.cbSize = sizeof(mi);
                mi.fMask = MIM_STYLE;
                mi.dwStyle = MNS_DRAGDROP;
                SetMenuInfo(hSubMenu, &mi);
        
                POINT stPoint;
                GetCursorPos(&stPoint);
                ::TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, stPoint.x, stPoint.y, 
                    0, this->m_hWnd, NULL);
                SetForegroundWindow(this->m_hWnd);
                SendMessage(WM_NULL, 0, 0);
            }

            DestroyMenu(hMenu);
        }
Имею скафандр — готов путешествовать!
Re[2]: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 07.07.04 11:05
Оценка:
Здравствуйте, rus blood, Вы писали:
...
Огромное спасибо за поддержку!!! Это я туплю!
короче такая фигня
не приходило, но теперь пришло! менюшка лежит в dll-ке и в туда передается
хэндл окна, принимающего от менюшки мессаги. Dll-ка подгружалась статически
через *.Lib, и инициализация ::CoInitialize( NULL ) была в
int main(...). Как только я добавил ее и в
case DLL_PROCESS_ATTACH:
    HRESULT hRes = ::CoInitialize( NULL );
    ATLASSERT( SUCCEEDED( hRes ) );
break;

все заработало! еще раз спасибо!
УВАЖАЕМЫЕ ЛЮДИ, НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ ИНИЦИАЛИЗАЦИЮ!!!
Re[3]: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 07.07.04 11:09
Оценка:
Здравствуйте, vovas, Вы писали:

V>Здравствуйте, rus blood, Вы писали:

V>...
V>все заработало! еще раз спасибо!
V>УВАЖАЕМЫЕ ЛЮДИ, НЕ ЗАБЫВАЙТЕ ДОБАВЛЯТЬ ИНИЦИАЛИЗАЦИЮ!!!

Ты знаешь, специально проверил на своем примере.
WM_MENUDRAG приходит даже если НЕ делать инициализацию COM.
Имею скафандр — готов путешествовать!
Re[4]: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 07.07.04 11:15
Оценка:
Здравствуйте, rus blood, Вы писали:
RB>WM_MENUDRAG приходит даже если НЕ делать инициализацию COM.

!!! я тоже считал, что это WinAPI заморочка, а не COM...
да и считаю, но ФАКТ чёрть подери! вот убираю из DLL
инициализацию — и кладбищенская тишина.....
Re[5]: не вызывается WM_MENUDRAG :(
От: rus blood Россия  
Дата: 07.07.04 11:31
Оценка:
Здравствуйте, vovas, Вы писали:

V>!!! я тоже считал, что это WinAPI заморочка, а не COM...

V>да и считаю, но ФАКТ чёрть подери! вот убираю из DLL
V>инициализацию — и кладбищенская тишина.....

Ну я тоже как бы не с потолка сочиняю, а вот у меня живой пример перед глазами.
Даже специально перед вызовом меню поставил код создания com-объекта, ну и ессно получаю "com is not initialized".
А WM_MENUDRAG тем не менее приходит.

Только у меня нет dll, и все работает в одном приложении.

У тебя однопоточное приложение? Все таки странно, что в DllMain потребовалась инициализация com, по идее это должно было быть в одном потоке с функцией main, где com уже инициализировано...
Имею скафандр — готов путешествовать!
Re[6]: не вызывается WM_MENUDRAG :(
От: vovas Россия  
Дата: 07.07.04 12:01
Оценка:
Здравствуйте, rus blood, Вы писали:
RB>У тебя однопоточное приложение? Все таки странно, что в DllMain потребовалась инициализация com, по идее это должно было быть в одном потоке с функцией main, где com уже инициализировано...

Приложение многопоточное, но библиотечные функции выполняются
в основном потоке программы.
Однако инициализация COM при линковании происходит раньше вызова
этой же инициализации из main()... Ну и соответственно
ATLASSERT(SUCCEEDED(hRes)) в main дает ошибку.

Но какого черта этот COM ваще нужен (в случае библиотеки)?
Для меня тоже загадка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.