Прокрутка в окне под курсором.
От: Crackjack Россия  
Дата: 05.08.05 07:30
Оценка:
Необходимо прокручивать область находящуюся под курсором. Стоит ловушка WH_MOUSE_LL. Сначала делал вот так:

case WM_MOUSEWHEEL:
{            
MSLLHOOKSTRUCT* mhs = (MSLLHOOKSTRUCT*)lParam;
POINT point;            
if(GetCursorPos(&point))
{ 
HWND hwnd =    WindowFromPoint(point);
if(hwnd)
{
WPARAM wprm = MAKEWPARAM(0, HIWORD(mhs->mouseData));
LPARAM lprm = MAKELPARAM(point.x, point.y);
SendMessage(hwnd, WM_MOUSEWHEEL, wprm, lprm);
}

}
и т.д.

Не устроило, т.к. не всегда почему то работает, то прокручивается, то нет.
Потом поменял SendMessage на PostMessage, эфект тот-же: не всегда работает.
Теперь пробую вот так:

case WM_MOUSEWHEEL:
{
MSLLHOOKSTRUCT* mhs = (MSLLHOOKSTRUCT*)lParam;
POINT point;        
if(GetCursorPos(&point))
{ 
HWND hwnd = WindowFromPoint(point);
if(hwnd)
{
WPARAM wprm = MAKEWPARAM(0, HIWORD(mhs->mouseData));
LPARAM lprm = MAKELPARAM(point.x, point.y);
int distance = HIWORD(wParam);//Что это за параметр? Как его перевести в экранные координаты?
ScrollWindowEx(hwnd, 0, 20, NULL, NULL,NULL, NULL, SW_ERASE);
SendMessage(hwnd, WM_PAINT, 0, 0);
}
}

Не работает как надо вообще. Изображение окна смещается, причём любого!(Даже у которого scrollbar-ов нет), а недействительная область заполняется одним и тем же изображением. Как можно организовать прокрутку самому?
Re: Прокрутка в окне под курсором.
От: rus blood Россия  
Дата: 05.08.05 07:41
Оценка:
Здравствуйте, Crackjack, Вы писали:

C>Необходимо прокручивать область находящуюся под курсором. Стоит ловушка WH_MOUSE_LL.


Посмотрите здесь
Автор: fay
Дата: 03.08.05
Имею скафандр — готов путешествовать!
Re[2]: Прокрутка в окне под курсором.
От: Crackjack Россия  
Дата: 05.08.05 07:55
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Посмотрите здесь
Автор: fay
Дата: 03.08.05


У меня теми же словами в коде выше.
Действительно не работает в MSDN Library(как раз сейчас наблюдаю эту картину), но есть ещё приложения: Builder, в Lingvo не всегда срабатывает. Нет постоянства, всё как то переменчиво. Вот и хочется самому взять всё в свои руки. Постоянный вопрос: В какую сторону копать?
Re: Прокрутка в окне под курсором.
От: ork_a  
Дата: 15.08.05 14:11
Оценка:
Здравствуйте, Crackjack, Вы писали:

C>Необходимо прокручивать область находящуюся под курсором. Стоит ловушка WH_MOUSE_LL. Сначала делал вот так:


C>
C>case WM_MOUSEWHEEL:
C>{            
C>MSLLHOOKSTRUCT* mhs = (MSLLHOOKSTRUCT*)lParam;
C>POINT point;            
C>if(GetCursorPos(&point))
C>{ 
C>HWND hwnd =    WindowFromPoint(point);
C>if(hwnd)
C>{
C>WPARAM wprm = MAKEWPARAM(0, HIWORD(mhs->mouseData));
C>LPARAM lprm = MAKELPARAM(point.x, point.y);
C>SendMessage(hwnd, WM_MOUSEWHEEL, wprm, lprm);
C>}

C>}
C>и т.д.
C>

C>Не устроило, т.к. не всегда почему то работает, то прокручивается, то нет.
C>Потом поменял SendMessage на PostMessage, эфект тот-же: не всегда работает.
C>Теперь пробую вот так:

C>
C>case WM_MOUSEWHEEL:
C>{
C>MSLLHOOKSTRUCT* mhs = (MSLLHOOKSTRUCT*)lParam;
C>POINT point;        
C>if(GetCursorPos(&point))
C>{ 
C>HWND hwnd = WindowFromPoint(point);
C>if(hwnd)
C>{
C>WPARAM wprm = MAKEWPARAM(0, HIWORD(mhs->mouseData));
C>LPARAM lprm = MAKELPARAM(point.x, point.y);
C>int distance = HIWORD(wParam);//Что это за параметр? Как его перевести в экранные координаты?
C>ScrollWindowEx(hwnd, 0, 20, NULL, NULL,NULL, NULL, SW_ERASE);
C>SendMessage(hwnd, WM_PAINT, 0, 0);
C>}
C>}
C>

C>Не работает как надо вообще. Изображение окна смещается, причём любого!(Даже у которого scrollbar-ов нет), а недействительная область заполняется одним и тем же изображением. Как можно организовать прокрутку самому?


zDelta = GET_WHEEL_DELTA_WPARAM(wParam);

The wheel rotation will be a multiple of WHEEL_DELTA, which is set at 120. This is the threshold for action to be taken, and one such action (for example, scrolling one increment) should occur for each delta.

The delta was set to 120 to allow Microsoft or other vendors to build finer-resolution wheels in the future, including perhaps a freely-rotating wheel with no notches. The expectation is that such a device would send more messages per rotation, but with a smaller value in each message. To support this possibility, you should either add the incoming delta values until WHEEL_DELTA is reached (so for a delta-rotation you get the same response), or scroll partial lines in response to the more frequent messages. You could also choose your scroll granularity and accumulate deltas until it is reached.

Я юзаю первый твой вариант, только SendMessage не делаю, а сразу прокручиваю на строку вверх или вниз... работает
Re[2]: Прокрутка в окне под курсором.
От: Crackjack Россия  
Дата: 02.09.05 13:09
Оценка:
Здравствуйте, ork_a, Вы писали:

_>Здравствуйте, Crackjack, Вы писали:


_>Я юзаю первый твой вариант, только SendMessage не делаю, а сразу прокручиваю на строку вверх или вниз... работает


А как ты прокручиваешь? ScrollWindowEx что-то не помогает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.