![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ограничение скроллинга в 32767
Unknown_user © (2011-03-16 13:48:00)Подскажите как обойти ограничение диапазона прокрутки скроллбара в 32767? Привожу описание сообщения скроллера из Messages.pas, видим, что поле Pos типа Smallint.
TWMScroll = packed record
Msg: Cardinal;
ScrollCode: Smallint; { SB_xxxx }
Pos: Smallint;
ScrollBar: HWND;
Result: Longint;
end;
Похоже, тяжелое наследство 16-ти битного прошлого.
Я использую это поле при обработке сообщений
SB_THUMBPOSITION,
SB_THUMBTRACK
и при большом ScrollRange получаю переполнение. Как обойти?
Unknown_user (2011-03-16 14:49:00) [1]Большое спасибо, clickmaker. Сам я что-то не догадался. GetScrollInfo может среди прочих параметров возвращать nTrackPos. Это как раз и есть тот самый TWMScroll.Pos только уже 4-х байтный.
Привожу работающий код, может кому-то пригодится.
function TSomeControlWithScrollBars.GetTrackPos(HorizScroll: Boolean): Integer;
const
cScrolls: array[Boolean] of DWORD =
(SB_VERT, SB_HORZ);
var
ScrInfo: TScrollInfo;
begin
ScrInfo.cbSize := SizeOf(ScrInfo);
ScrInfo.fMask := SIF_TRACKPOS;
GetScrollInfo(Handle, cScrolls[HorizScroll], ScrInfo);
Result := ScrInfo.nTrackPos;
end;
clickmaker (2011-03-16 13:53:00) [2]GetScrollPos() или GetScrollInfo()