Содержание материала

Пример:

Code:

type

{$IFDEF WIN32}

WParameter = LongInt;

{$ELSE}

WParameter = Word;

{$ENDIF}

LParameter = LongInt;

 

{Объявляем переменную для хранения подменённой оконной процедуры}

var

OldWindowProc : Pointer;

 

function NewWindowProc(WindowHandle : hWnd;

                      TheMessage   : WParameter;

                      ParamW       : WParameter;

                      ParamL       : LParameter) : LongInt

{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}

var

TheRangeMin : integer;

TheRangeMax : integer;

TheRange : integer;

begin

 

if TheMessage = WM_VSCROLL then begin

{Получаем минимальное и максимальное значения scroll box}

   GetScrollRange(WindowHandle,

                  SB_HORZ,

                  TheRangeMin,

                  TheRangeMax);

{Получаем вертикальную позицию scroll box}

   TheRange := GetScrollPos(WindowHandle,

                            SB_VERT);

{Проверим, чтобы не выйти за диапазон}

   if TheRange < TheRangeMin then

     TheRange := TheRangeMin else

   if TheRange > TheRangeMax then

     TheRange := TheRangeMax;

{Устанавливаем горизонтальный scroll bar}

   SetScrollPos(WindowHandle,

                SB_HORZ,

                TheRange,

                true);

end;

 

if TheMessage = WM_HSCROLL then begin

{Получаем мин. и макс. диапазон горизонтального scroll box}

   GetScrollRange(WindowHandle,

                  SB_VERT,

                  TheRangeMin,

                  TheRangeMax);

{Получаем позицию горизонтального scroll box}

   TheRange := GetScrollPos(WindowHandle,

                            SB_HORZ);

{Проверим, чтобы не выйти за диапазон}

   if TheRange < TheRangeMin then

     TheRange := TheRangeMin else

   if TheRange > TheRangeMax then

     TheRange := TheRangeMax;

{Устанавливаем вертикальный scroll bar}

   SetScrollPos(WindowHandle,

                SB_VERT,

                TheRange,

                true);

end;

 

{ Вызываем старую оконную процедуру }

{ чтобы обработались сообщения. }

NewWindowProc := CallWindowProc(OldWindowProc,

                                 WindowHandle,

                                 TheMessage,

                                 ParamW,

                                 ParamL);

end;

 

 

procedure TForm1.FormCreate(Sender: TObject);

begin

{ Устанавливаем новую оконную процедуру для контрола }

{ и запоминаем старую оконную процедуру.    }

OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle,

                                        GWL_WNDPROC,

                                        LongInt(@NewWindowProc)));

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

{ Возвращаем обратно старую оконную процедуру.  }

SetWindowLong(ScrollBox1.Handle,

               GWL_WNDPROC,

               LongInt(OldWindowProc));

 

end;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить