Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: subclassing popupmenu  (Прочитано 10550 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
yuli
Гость
« : 19-08-2009 12:28 » 

Здравствуйте,

Помогите пожалуйста с subclassing-ом окна меню frame toolbar menubar итд. от BCGSoft, и всё это находится в OCX-контроле)

Хэндл окна меню есть. Что делать дальше и как?

Мне нужно поймать WM_KEYDOWN для окна активного меню и запретить VK_RIGHT и LEFT соответственно

Заранее спасибо

(Примечание модератора: писать транслитом - это неуважение к собеседникам и понижение шансов на ответ. Не все захотят ломать свои глаза)

« Последнее редактирование: 19-08-2009 12:34 от Вад » Записан
yuli
Гость
« Ответ #1 : 19-08-2009 13:25 » 

извиняюсь за транслит
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 19-08-2009 15:18 » 

какую среду используешь ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 19-08-2009 16:25 » 

например, у меня получилось захучить эти кнопки так


Код:
HHOOK m_hook;
LRESULT CALLBACK myhook(int code, WPARAM wParam, LPARAM lParam)
{
if(wParam==VK_RIGHT || wParam==VK_LEFT)
{
return 1;
}

return 0;
}

BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();

m_hook=::SetWindowsHookEx(WH_KEYBOARD,myhook,::AfxGetInstanceHandle(),0);

return TRUE;
}
Записан

yuli
Гость
« Ответ #4 : 20-08-2009 08:42 » 

visual studio2005
с хуком пробовала когда tooltip-ы делала

дело в том что menu в Activex-control (MDIclient)
и потом другие проблемы возникают с "основным" menu

мне бы за-subclass-ить его и попробовать поимать WM_KEYDOWN
но не знаю где и как?
вот место где я его (menu) получаю:

void CAomAdminMenuBar::OnLButtonDown(UINT nFlags, CPoint point)
{CBCGPToolBar::OnLButtonDown(nFlags, point);

   int nHit = HitTest(point);
   if (nHit != -1)
   {   
               ...
      CBCGPToolbarButton* pButton = GetButton((int)nHit);      
           ...
      CBCGPToolbarMenuButton* pMenuButton =
         DYNAMIC_DOWNCAST (CBCGPToolbarMenuButton, pButton);
      if (pMenuButton != NULL)
      {
         CBCGPPopupMenu* pPopupMenu = pMenuButton->GetPopupMenu();
         if (pPopupMenu != NULL)
         {.. .................
}}}}

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 20-08-2009 09:02 » 

с ActiveX понятия не имею, что да как...

Но можно попробовать в родительском окне элемента переопределить

virtual BOOL PreTranslateMessage(
   MSG* pMsg
);

выцеплять там нужные сообщения с нужными параметрами и с требуемым хендлом элемента и блокировать их дальнейшую обработку (return 1)
Записан

yuli
Гость
« Ответ #6 : 20-08-2009 10:36 » 

да,  в том то и проблема что menu в ActiveX-e
и на GetParent возвращает frame контейнера, а не "свой" (в ActiveX-e)
и соответственно menu получает сообщения напрямую от frame контейнера
(в обход "своего"):

BOOL CBCGPFrameImpl::ProcessKeyboard (int nKey, BOOL* pbProcessAccel)
{
   ...
      CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_KEYDOWN, nKey);
        ...
}
CBCGPPopupMenu его получает и обрабатывает и на етом все.
потому то и хотела попробовать за-subclass-ить его
пожалуйста, если можна пример какой то как subclass-ить popup окно

P.S. с хуком поробовала сейчас
VK_RIGHT и VK_LEFT "захучились" для всего приложения
делаю VERIFY(::UnhookWindowsHookEx(hHook)) в CMyMenuBar::OnKillFocus
выдает AfxAssertFailedLine...думаю связано с ActiveX и BCG-библиотекой которую использую
буду пробовать еще
спасибо

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 20-08-2009 10:48 » 

а с PreTranslateMessage не пробовала ? По идее сюда все сообщения приложения поначалу заходят - фильтруй не хочу Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 20-08-2009 10:55 » 

а попробуй заместить оконную процедуру окна меню
Код:
WNDPROC oldF=0;
LRESULT CALLBACK my_func( HWND hwnd, UINT uMsg, WPARAM wParam,  LPARAM lParam)
{
   return oldF(hwnd,  uMsg, wParam, lParam);
}

oldF=(WNDPROC)::SetWindowLongPtr(h,GWLP_WNDPROC,(LONG)my_func);

//а вернуть функцию так
::SetWindowLongPtr(h,GWLP_WNDPROC,(LONG)oldF);

если сообщения станут заходить в нашу процедуру - тогда дело в шляпе Улыбаюсь
Записан

yuli
Гость
« Ответ #9 : 20-08-2009 12:16 » 

PreTranslateMessage моего ActiveX-controla получает сообщения уже после того как окно меню потому как parentom его считается frame приложения а не frame ActiveX-controla,  я
пробовала менять parenta (при чем только так меняется!)
::SetWindowLong(pPopupMenu->m_hWnd, GWL_HWNDPARENT, (LONG)pFrameWnd->m_hWnd);
но на порядок сообщений ето не влияет

а можна подробнее как ето в my_func реализовать ?
if(wParam==VK_RIGHT || wParam==VK_LEFT)
      {
         return 1;
      }
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 20-08-2009 13:33 » 

как-нибудь так должно выглядеть
Код:
LRESULT CALLBACK my_func( HWND hwnd, UINT uMsg, WPARAM wParam,  LPARAM lParam)
{
   if(hwnd==хендл_окучиваемого_окна)
  {
     if(uMsg==WM_KEYDOWN)
     {
         if(wParam==VK_RIGHT || wParam==VK_LEFT)
        {
             //говорим , что мы обработали сообщение
            return 1;
         }
      }
  }

   //что не отфильтровано - пускаем в старую оконную процедуру
   return oldF(hwnd,  uMsg, wParam, lParam);
}
« Последнее редактирование: 20-08-2009 13:35 от Алексей1153++ » Записан

yuli
Гость
« Ответ #11 : 20-08-2009 14:04 » new

спасибо большое
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines