Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WM_SCROLL Синхронная прокрутка окон

602
04 октября 2007 года
KPI Student
265 / / 16.12.2006
Стокнулся с проблемой, как грамотно организовать синхронную прокрутку двух RichEdit-ов?

При перехвате WM_VSCROLL второе (зависимое) окно прокручивается вместе с первым только в том случае, если прокрутка инициирована полосами прокрутки.

Как перехватить прокрутку, если она инициирована нажатием на клавиатуру? Или если прокрутка происходит вследствие выделения текста мышью? Т.е. НЕ нажатием на полосы прокрутки?

 
Код:
HOOKPROC hp= HOOKPROC(scr_hook);        hHook=SetWindowsHookEx(WH_CALLWNDPROC,hp,NULL,GetCurrentThreadId());

LRESULT CALLBACK scr_hook(int nCode,WPARAM wParam,LPARAM lParam)
{
    if (nCode != HC_ACTION) return CallNextHookEx(hHook,nCode,wParam,lParam);
    CWPSTRUCT *m= (CWPSTRUCT *)lParam;
    if (m->message == WM_MOUSEWHEEL || m->message == WM_VSCROLL)
    SendMessage(MDIChild[act_ch]->LinesRE->Handle,                      m->message,m->wParam,m->lParam);
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}


* Примечание: WM_MOUSEWHEEL не помогает.
* Перехват и дублирование нажатых клавишь не гарантирует прокрутки при выделении текста мышью.
602
04 октября 2007 года
KPI Student
265 / / 16.12.2006
И какие сообщения посылаются окну при прокрутке?
31K
11 октября 2007 года
Pr0ger
9 / / 06.10.2007
An application sends the SBM_SETPOS message to a scroll bar control to set the position of the scroll box (thumb) and, if requested, redraw the scroll bar to reflect the new position of the scroll box.

SBM_SETPOS
wParam = (WPARAM) nPos; // new position of scroll box
lParam = (LPARAM) (BOOL) fRedraw; // redraw flag


Parameters

nPos

Specifies the new position of the scroll box. It must be within the scrolling range.

fRedraw

Specifies whether the scroll bar should be redrawn to reflect the new scroll box position. If this parameter is TRUE, the scroll bar is redrawn. If it is FALSE, the scroll bar is not redrawn.



Return Values

If the position of the scroll box changed, the return value is the previous position of the scroll box; otherwise, it is zero.

Remarks

If the scroll bar control is redrawn by a subsequent call to another function, setting the fRedraw parameter to FALSE is useful.
602
12 октября 2007 года
KPI Student
265 / / 16.12.2006
Спасибо, но я спрашивал непосредственно про прокручиваемое окно, не про скролл бар. Хотя ваша информация пригодится:)

Появилась мысль перехватывать сообщение перерисовки, и если позиция скроллбара главного RichEdit изменилась (SBM_GETPOS вроде, щас на мсдн зайду, гляну) -- отсылать SBM_SETPOS подчиненному.
------------ 23:49 ------------
Ура! Скроллбары обоих окон теперь всегда перемещаются синхронно! :)
Только текст окна с номерами строк остается на месте... Экспериментирую дальше.
31K
12 октября 2007 года
Pr0ger
9 / / 06.10.2007
Цитата: KPI Student
Спасибо, но я спрашивал непосредственно про прокручиваемое окно, не про скролл бар.



Это я и имел в виду

602
13 октября 2007 года
KPI Student
265 / / 16.12.2006
Цитата: Pr0ger
An application sends the SBM_SETPOS message to a scroll bar control to set the position of the scroll box (thumb) and, if requested, redraw the scroll bar to reflect the new position of the scroll box.

SBM_SETPOS
wParam = (WPARAM) nPos; // new position of scroll box
lParam = (LPARAM) (BOOL) fRedraw; // redraw flag


fRedraw

Specifies whether the scroll bar should be redrawn to reflect the new scroll box position. If this parameter is TRUE, the scroll bar is redrawn. If it is FALSE, the scroll bar is not redrawn.



То есть речь идет не об окне, с которым скроллбар связан, а непосредственно о скроллбаре, что подтверждено экспериментально :)

Код:
LRESULT CALLBACK scr_hook(int nCode,WPARAM wParam,LPARAM lParam)
{
    int stat=0;
    if (nCode != HC_ACTION)
        return CallNextHookEx(hHook,nCode,wParam,lParam);
    CWPSTRUCT *m= (CWPSTRUCT *)lParam;

  if (m->message == WM_PAINT)
  {
    static int sp;
    int sp_new=GetScrollPos(MDIChild[act_ch]->TextRE->Handle,SB_VERT);
    if (sp != sp_new)
    {
        stat=SetScrollPos(MDIChild[act_ch]->LinesRE->Handle,SB_VERT,sp_new,true);
        sp=sp_new;
    }
  }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}


Скроллбары при этом действителоно синхронно ездят.

На данный момент пытаюсь понять механизм работы сoобщений WM_VSCROLL, и при необходимости (при изменении координат скроллбара) генерировать его програмно. Рабочего кода пока нет.

Вот наработки:
Код:
LRESULT CALLBACK scr_hook(int nCode,WPARAM wParam,LPARAM lParam)
{
    int stat=0;
    if (nCode != HC_ACTION)
        return CallNextHookEx(hHook,nCode,wParam,lParam);
    CWPSTRUCT *m= (CWPSTRUCT *)lParam;

    if (m->message == WM_VSCROLL && m->hwnd==MDIChild[act_ch]->TextRE->Handle)
    {
        int sp_new=GetScrollPos(MDIChild[act_ch]->TextRE->Handle,SB_VERT);
        stat=stat;
        if (m->wParam > 5 && m->wParam != SB_ENDSCROLL)
        {
            //SendMessage(MDIChild[act_ch]->LinesRE->Handle,
                        //WM_VSCROLL,m->wParam,m->lParam);
            SendMessage(MDIChild[act_ch]->LinesRE->Handle,
                        WM_VSCROLL,sp_new*65536,0);
           int i=HIWORD(m->wParam);
           int j=m->wParam / 65536;
           i=i;
        }
        else if (m->wParam == SB_ENDSCROLL && m->hwnd==MDIChild[act_ch]->TextRE->Handle)
        {
            SendMessage(MDIChild[act_ch]->LinesRE->Handle,
                        WM_VSCROLL,SB_ENDSCROLL,0);
        }
    }
  if (m->message == WM_PAINT && m->hwnd==MDIChild[act_ch]->TextRE->Handle)
  {
    static int sp;
    int sp_new=GetScrollPos(MDIChild[act_ch]->TextRE->Handle,SB_VERT);
    if (sp != sp_new)
    {
        stat=SetScrollPos(MDIChild[act_ch]->LinesRE->Handle,SB_VERT,sp_new,true);
        sp=sp_new;
        stat=SendMessage(MDIChild[act_ch]->LinesRE->Handle,WM_VSCROLL,sp*65536,0);
    }
  }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}


Текст остается на месте...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог