Главная » Delphi » Прокрутка в компоненте ScrollBox

0

Для отслеживания поворота колесика проще всего перехватить сообщение wm mousewheel в оконной процедуре всего приложения (свойство onMessage объекта Application)— в конкретную форму оно может и не поступить. У этого сообщения параметр wParam несет сразу тройную нагрузку: в знаке старшего слова указывается направление прокрутки (вниз — минус, вверх — плюс), в самом значении этого слова — количество условных "тиков", на которое колесико прокрутили, а в младшем слове — состояние одновременно нажатых клавиш-модификаторов. Нас интересует только знак и клавиши, с "тиками" нам разбираться незачем.

Создадим новый проект ScrollDrop (папка Glaval3\l) с красивой иконкой (pciii.ico), на форму поставим компонент ScrollBox и растянем его на всю форму, оставив внизу небольшое пустое пространство. В это пространство поместим компонент Label, немного левее центра — в него мы будем выводить подпись. У компонента ScroiiBoxl свойство AutoScroll должно быть равно True, a AutoSize— False. В левый верхний угол ScroiiBoxl поставим компонент image, у которого AutoSize, наоборот, должно быть установлено в True.

Добавим в секцию private процедуру перехвата сообщений:

private

prooedure WndProc(var Msg: TMsg; var Handled:boolean);

и напишем следующий обработчик события oncreate формы:

prooedure TForml.FormCreate(Sender: TObject); begin

if paramcountoO then {если есть параметр загрузки} try

Imagel.Picture.LoadFromFile(paramstr(1)); {пробуем загрузить картинку/ Forml,Labell.Caption:=paramstr(1); except

Imagel.Picture.LoadFromFile(‘pole.jpg’); (не получается – по умолчанию/ Forml.Labell.Caption:=’pole.jpg1; end else begin

Imagel.Picture.LoadFromFile(‘pole.jpg’); {загружаем по умолчанию) Forml.Label1.Caption:=’pole.jpg'; end;

Application.OnMessage:=WndProc; /пере:-:вдг оконной процедур} DragAcceptFiles(Forml.Handle,True); {сообщаем, что готовы к приему файлов) end;

Здесь мы сразу предусмотрели вот что: если вы запускаете программу из командной строки с параметром в виде имени файла с картинкой, то она загрузится в image 1, в противном случае (или если параметр — не картинка) загрузится картинка по умолчанию poIe.jpg, которую я расположил в папке с проектом. Картинку по умолчанию я специально выбрал достаточно большой (фотография в стиле "родные просторы" 1136×852), чтобы при загрузке появились обе линейки прокрутки в компоненте ScroilBoxi. В компоненте Label 1 будет отображаться имя файла с картинкой (рис. 13.1). Добавим, что запуск программы с параметром в Windows осуществляется не только при ручном запуске из командной строки, но и при "бросании" файла с картинкой на файл программы в Проводнике — т. е. мы сразу осуществили режим Drag&Drop для не запущенной программы. Но это бы не сработало, если бы мы не уведомили Windows, что готовы к такому повороту событий. Это делается вызовом функции DragAcceptFiles в последней строке процедуры. В предложение uses еледует добавить два модуля: Shell Api и JPEG.

Рис. 13.1. Окно примера ScrollDrop с загруженной по умолчанию картинкой

Осталось оформить собственно процедуру WndProc. Она будет выглядеть твк:

procedure TForml.WndProc(var Msg: TMsg; var Handled:boolean); begin

if Msg.message=WM_MOUSEWHEEL than begin

if (Msg.wParam and MK_CONTROL) = 0 then begin

if Msg.wParam>0 then {крути аяиэ1 ScrollBoxl.VertScrollBar.Position:=

ScrollBoxl.VertScrollBar.Position+8 else {крутим вверх} ScrollBoxl.VertScrollBar.Positions

ScrollBoxl.VertScrollBar.Position-8;

end

else {нажата Ctrl I begin

if Msg.wParam>0 then {крутим вправо} ScrollBoxl.HorzScrollBar.Position:»

ScrollBoxl.HorzScrollBar.Position+8 else {крупы: влево) ScrollBoxl.HorzScrollQar.Position:=

ScrollBoxl.Hor zSc rollBar.Pos ition-8;

end; end; end;

To есть при просто прокрутке колесика у нас будет изображение передвигаться в вертикальном направлении, а при прокрутке с нажатой клавишей <Ctrl> — в горизонтальном.

Полный Drag&Drop

Отлично, но как бы еще принять файл, "брошенный" на уже открытую программу? Надо сказать, что в Delphi этот режим не реализован вообще никак— тот механизм, что имеется, обеспечивает довольно удобный обмен через перетаскивание объектов между компонентами одной формы, но мне лично такое еще не понадобилось ни разу. Разумеется, это совершенно не лишняя функциональность, но перетаскивание извне куда интереснее. Для того чтобы осуществить прием "брошенного" файла, нам придется создать еще один перехватчик сообщения, на этот раз wm dropfiles. Его можно перехватить в той же процедуре WndProc, но удобнее соорудить отдельный специализированный перехватчик (для формы, а не для приложения целиком). Добавим в ту же секцию private следующую строку:

procedure DropPicture(var Message: TWMDROPFILES); message WM_DROPFILES;

В секцию var нужно добавить переменную buffer : array[0. .255] of char, а сама процедура будет выглядеть так:

procedure TFonr.l.DropPicture (var Message: TWMDROPFILES); begin {прием файлов, брошенных на формуJ DragQueryFile(Message.Drop,0,@buffer,sizeof(buffer)); try

Imagel.Picture.LoadFromFile(buffer); (пробуем загрузить! Forml.Label1.Caption:=buffer; except end; end;

Здесь процедура DragQueryFile возвращает нам в переменной buffer строку с именем файла. Если файл — картинка, он загрузится в imagel, а его имя в

Label 1.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

  • Комментарии