Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отлавливание WM_MOUSEWHEEL 
V
    Опции темы
maq
  Дата 12.3.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет, у меня такой вопрос.

Создал окно производное от CWnd и разместил его в родительском окне CView. Зарегистрировал его: WNDCLASS.lpfnWndProc = ::DefWindowProc.

Я не получаю сообщение WM_MOUSEWHEEL. Просмотрел МСДН, понял что можно через сублассинг. Но конкретного и полного примера не нашел. Кто сможет помочь мне?

Код

bool RGrid::RegisterWindowClass(void)
{
    WNDCLASS wndcls;
    HINSTANCE hInst = AfxGetInstanceHandle();

    if (!(::GetClassInfo(hInst, RGRID_CLASSNAME, &wndcls)))
    {
        wndcls.style            = CS_DBLCLKS;
        wndcls.lpfnWndProc      = /*(WNDPROC)WndProc1;*/ ::DefWindowProc;
        wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;
        wndcls.hInstance        = hInst;
        wndcls.hIcon            = NULL;
        wndcls.hCursor          = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
        wndcls.hbrBackground    = NULL;
        wndcls.lpszMenuName     = NULL;
        wndcls.lpszClassName    = RGRID_CLASSNAME;

        if (!AfxRegisterClass(&wndcls)) 
        {
            AfxThrowResourceException();
            return false;
        }
    }

    return true;
}

PM MAIL   Вверх
v2v
Дата 12.3.2007, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а в чём собственно вопрос? ты хочешь перехватить сообщение WM_MOUSEWHEEL ? или как? 
смотри сюда: 
Код

afx_msg LRESULT OnRegisteredMouseWheel(
   WPARAM wParam,
   LPARAM lParam 
);



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


Эксперт
****


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

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



Цитата(maq @  12.3.2007,  17:39 Найти цитируемый пост)
Зарегистрировал его: WNDCLASS.lpfnWndProc = ::DefWindowProc.

И в каком месте ты собираешься получать сообщения?



--------------------
...
PM   Вверх
papam
Дата 12.3.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 2.2.2006
Где: Украина::Запорожь е

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



Вот как работать с мышью на С:
http://articles.org.ru/cfaq/index.php?qid=...mmostrecent=yes

Это сообщение отредактировал(а) papam - 12.3.2007, 23:05
--------------------
No Fucking Future
PM MAIL ICQ   Вверх
maq
Дата 13.3.2007, 05:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
И в каком месте ты собираешься получать сообщения?


здесь:
Код

LRESULT RGrid::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_MOUSEWHEEL:
        // processing
        break;
    }

    return CWnd::WindowProc(message, wParam, lParam);
}

PM MAIL   Вверх
maq
Дата 13.3.2007, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
Вот как работать с мышью на С:


1. Я  пишу на VS 2005, OS WinXP SP2. В других окнах OnMouseWheel ловится.

2. Написал ф-ю (из МСДН):
Код

LRESULT WINAPI MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
   case WM_MOUSEWHEEL:
      ...
   default:
      return( DefWindowProc( hWnd, uMsg, wParam, lParam ));
}
}

Код

bool RGrid::RegisterWindowClass(void)
{
    WNDCLASS wndcls;
    HINSTANCE hInst = AfxGetInstanceHandle();

    if (!(::GetClassInfo(hInst, RGRID_CLASSNAME, &wndcls)))
    {
        wndcls.style            = CS_DBLCLKS;
        wndcls.lpfnWndProc      = (LRESULT ) MainWndProc; // ошибка здесь
        wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;
        wndcls.hInstance        = hInst;
        wndcls.hIcon            = NULL;
        wndcls.hCursor          = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
        wndcls.hbrBackground    = NULL;
        wndcls.lpszMenuName     = NULL;
        wndcls.lpszClassName    = RGRID_CLASSNAME;

        if (!AfxRegisterClass(&wndcls)) 
        {
            AfxThrowResourceException();
            return false;
        }
    }

    return true;
}

выдает ошибку
error C2440: 'type cast' : cannot convert from 'LRESULT (__stdcall RGrid::* )(HWND,UINT,WPARAM,LPARAM)' to 'LRESULT'
PM MAIL   Вверх
Earnest
Дата 13.3.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Убери преобразование к LRESULT


--------------------
...
PM   Вверх
maq
Дата 13.3.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

bool RGrid::RegisterWindowClass(void)
{
    WNDCLASS wndcls;
    HINSTANCE hInst = AfxGetInstanceHandle();

    if (!(::GetClassInfo(hInst, RGRID_CLASSNAME, &wndcls)))
    {
        wndcls.style            = CS_DBLCLKS;
        wndcls.lpfnWndProc      = MainWndProc;
        wndcls.cbClsExtra       = wndcls.cbWndExtra = 0;
        wndcls.hInstance        = hInst;
        wndcls.hIcon            = NULL;
        wndcls.hCursor          = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
        wndcls.hbrBackground    = NULL;
        wndcls.lpszMenuName     = NULL;
        wndcls.lpszClassName    = RGRID_CLASSNAME;

        if (!AfxRegisterClass(&wndcls)) 
        {
            AfxThrowResourceException();
            return false;
        }
    }

    return true;
}


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


Эксперт
****


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

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



Слушай, а что тема в MFC делает?
Ты MFC-то используешь? Если да, то сабклассить нужно совсем по-другому: ты, скорее всего, вообще в свою MainWndProc не попадаешь.

Добавлено @ 16:56 
Ну точно - производное от CWnd и т.д.
Не надо тебе его сабклассить. Напиши стандартный обработчик WM_MOUSEWHEEL, помести в карту сообщений и радуйся.


--------------------
...
PM   Вверх
maq
Дата 14.3.2007, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Earnest, все это уже делал. Не получилось потому и создал тему.

Код

BOOL RGrid::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
    AfxMessageBox(_T("SS"));

    return CWnd::OnMouseWheel(nFlags, zDelta, pt);
}
LRESULT RGrid::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_MOUSEWHEEL:
        AfxMessageBox(_T("SS"));
        break;
    }

    return CWnd::WindowProc(message, wParam, lParam);
}

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


Эксперт
****


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

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



В принципе все правильно, должно работать. Если, конечно, ты в первом случае добавляешь обработчик в карту сообщений. И у тебя не Win 95\98 или старая NT.
Возможно, сообщение хватает кто-то другой?
Поставь проверку в PreTranslateMessage, скажем, в родительском окне и просдеди, куда оно девается дальше. Возможно, придется ставить проверку и выше - можно начиная с приложения.
Или можешь для начала посмотреть Спаем, приходит ли сообщение и кому.


--------------------
...
PM   Вверх
maq
Дата 15.3.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

BEGIN_MESSAGE_MAP(RGrid, CWnd)
    ON_WM_PAINT()
    ON_WM_DESTROY()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_RBUTTONDOWN()
    ON_WM_RBUTTONUP()
    ON_WM_SIZE()
    ON_WM_HSCROLL()
    ON_WM_VSCROLL()
    ON_WM_MOUSEWHEEL()
    ON_WM_CTLCOLOR()
    ON_WM_SETFOCUS()
END_MESSAGE_MAP()


поставил
Код

BOOL RGrid::PreTranslateMessage(MSG* pMsg)
{
    switch(pMsg->message)
    {
    case WM_MOUSEWHEEL:
        AfxMessageBox(_T("jsdf"));
        break;
    }

    return CWnd::PreTranslateMessage(pMsg);
}


Но родительское окно ловит (Spy показал), а мне нужно именно из дочернего окна! Я разве ошибаюсь, что все дело в 
Код

wndcls.lpfnWndProc      = MainWndProc;

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


Эксперт
****


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

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



Цитата(maq @  15.3.2007,  14:47 Найти цитируемый пост)
Я разве ошибаюсь, что все дело в 

Ошибаешься.

Цитата(maq @  15.3.2007,  14:47 Найти цитируемый пост)
BOOL RGrid::PreTranslateMessage(MSG* pMsg)

Я имела ввиду вовсе не это. 
Спай показывает, что это сообщение приходит в родительское окно? Т.е. во вью?
Отлично. Это значит, что скорее всего твое окно (грид) не в фокусе. Иначе сообщение приходило бы ему. 
Можно либо автоматически ставить фокус на грид, когда мышь над ним пролетает.
Можно просто пересылать (из PreTranslateMessage родительского окна) это сообщение гриду, если, опять же, мышь над ним.
Еще вопрос. Грид занимает у тебя весь вью или только часть? Если весь, то какого лешего ты громоздишь окно на окно? Просто сделай Грид видом да и все.




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


Бывалый
*


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

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



Отлично, теперь получилось! Поставил SetFocus() в OnMouseMove!

Цитата
Грид занимает у тебя весь вью или только часть? Если весь, то какого лешего ты громоздишь окно на окно? Просто сделай Грид видом да и все.


Не могу, т.к. я сейчас разрабатываю свой ActiveX (пока как отдельное окно), а родительское окно - временный контейнер. Поэтому мне надо было минимум (желательно 0) кода писать во временном контейнере!

За помощь спасибо! smile (+)

Добавлено @ 16:23 
Сорри, + не получилось, у меня недостаточно постов!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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