Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2011, 16:36   #1
cheldonec
Пользователь
 
Регистрация: 31.03.2008
Сообщений: 10
По умолчанию ScrollBox скроллинг через сообщения

Всем добрый день!!! Вот такой вопрос.
Решил сделать прокрутку в скролбоксе мышой. Колесо вверх,вниз - вертикальная прокрутка, а если с нажатым шифтом - горизонтальная прокрутка. Решил с помощьё мессаджей. Получилось так:
unit MainForm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, ExtDlgs, StdCtrls;

Type

TKeystatus=(up,down);

TForm6 = class(TForm)
MainMenu1: TMainMenu;
MenuFile: TMenuItem;
MFNew: TMenuItem;
MFOpen: TMenuItem;
MFSave: TMenuItem;
Panel1: TPanel;
Panel2: TPanel;
ScrollBox1: TScrollBox;
Image1: TImage;
OpenPictureDialog1: TOpenPictureDialog;
procedure MFOpenClick(Sender: TObject);
procedure OrientationDesign;
procedure FormCreate(Sender: TObject);


private
{ Private declarations }
KeyShiftstatus:TKeystatus;
ImageWidth:integer;
ImageHeight:integer;
ImageRect:TRect;
procedure DrawImageActiveBorder;
procedure WMMOUSEWHEEL(var Msg: TWMMouseWheel); message WM_MOUSEWHEEL;
public
{ Public declarations }
end;
var
Form6: TForm6;

implementation

{$R *.dfm}
procedure TForm6.DrawImageActiveBorder;
var rect:TRect;
begin
image1.Canvas.Brush.Color:=clred;
image1.Canvas.Brush.Style:=bsCross;
image1.Canvas.FrameRect(ImageRect);
end;
procedure TForm6.FormCreate(Sender: TObject);
begin
OrientationDesign;
end;
procedure TForm6.MFOpenClick(Sender: TObject);
begin
if openpicturedialog1.Execute then
begin
image1.Picture.LoadFromFile(openpic turedialog1.FileName);
image1.Width:=image1.Picture.Width;
image1.Height:=image1.Picture.Heigh t;
ImageWidth:=Image1.Width;
ImageHeight:=Image1.Height;
Image1.Width:=Image1.Width+150;
image1.Height:=image1.Height+150;

ImageRect.Left:=0;
ImageRect.Right:=ImageWidth;
ImageRect.Top:=0;
ImageRect.Bottom:=ImageHeight;
end;
end;

procedure TForm6.OrientationDesign;
begin
image1.Left:=scrollbox1.ClientRect. Left;
image1.Top:=scrollbox1.ClientRect.T op;
end;
procedure TForm6.WMMOUSEWHEEL(var Msg: TWMMouseWheel);
var
zDelta: Integer;
begin
inherited;
if (Msg.Keys=0) then
begin
if WindowFromPoint(Mouse.CursorPos) <> scrollbox1.Handle then Exit;
if Msg.WheelDelta < 0 then zDelta := -10 else zDelta := 10;
with scrollbox1 do
begin
if ((VertScrollBar.Position = 0) and
(zDelta > 0)) or ((VertScrollBar.Position = VertScrollBar.Range - ClientHeight) and
(zDelta < 0)) then Exit;
ScrollBy(0, zDelta);
VertScrollBar.Position := VertScrollBar.Position - zDelta;
end;
end else if (Msg.Keys=1) then
begin
if WindowFromPoint(Mouse.CursorPos) <> scrollbox1.Handle then Exit;
if Msg.WheelDelta < 0 then zDelta := -10 else zDelta := 10;
with scrollbox1 do
begin
if ((HorzScrollBar.Position = 0) and
(zDelta > 0)) or ((HorzScrollBar.Position = HorzScrollBar.Range - ClientWidth) and
(zDelta < 0)) then Exit;
ScrollBy(zDelta, 0);
HorzScrollBar.Position := HorzScrollBar.Position - zDelta;

end;
end;
end;

end.

Всё работает отлично, крутится, но если добавляю кнопку на форму, просто без реакций даже, то прокрутка (горизонтальная) в ауте. Обнаружил, что без кнопки в Msg.Keys=1(это shift и есть), а с кнопкой передаётся Msg.Keys=4 (это дефаулт вроде).

Подскажите, где протупил????
cheldonec вне форума Ответить с цитированием
Старый 06.11.2011, 18:48   #2
cheldonec
Пользователь
 
Регистрация: 31.03.2008
Сообщений: 10
По умолчанию

if WindowFromPoint(Mouse.CursorPos) = scrollbox1.Handle then begin
Scrollbox1.SetFocus;

Всё разобрался, надо при наведении мыши фокус поставить....
cheldonec вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка e-mail сообщения с форматированием через SMTP chandrasecar Работа с сетью в Delphi 1 10.09.2014 21:29
Socket не отсылает сообщения через SEND и не принимает vaan.sk C/C++ Сетевое программирование 1 22.06.2011 20:57
Скроллинг ScrollBox. Интересная идея. Vova777 Общие вопросы Delphi 3 31.05.2011 19:16
Отправка сообщения через компонент RzSendMessage artemavd Работа с сетью в Delphi 0 01.04.2010 07:43
Ребята собирают сообщения к статус картинкам в QIP`е. Как оказалось, у народа фантизия хлещет через край Alar Свободное общение 8 02.06.2008 16:43