☆FormのOnMouseWheelDown(Up)
CAD Viewerを作っていて、FormのOnMouseWheelDown(Up)で問題が発生しました。
CADではコードがややこしいので、下記のような簡単なもので考えてみることにします。
問題点としては、PaintBoxに描画したものをマウスホイールにより拡大縮小する
仕様なのですが、この動作によりListBoxがスクロールしてしまうことです。
問題のあるコード
対策後のコード
MouseWheelDown(Up)をそれぞれ下記のようにしました。
これによりPaintBox1上にマウスがある場合のみPaintBox1にマウスホイールが働きます。 ListBox1をスクロールするには、ListBox1上にマウスを移動させます。
問題のあるコード
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
PaintBox1: TPaintBox;
procedure PaintBox1Paint(Sender: TObject);
procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
procedure FormCreate(Sender: TObject);
private
P: Integer;
procedure DrawData;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
P := 0;
Form1.OnResize := PaintBox1Paint;
for I := 0 to 99 do
ListBox1.Items.Add(IntToStr(I));
end;
procedure TForm1.DrawData;
var
Rect: TRect;
begin
// Clear
Rect.Top := PaintBox1.Top;
Rect.Left := PaintBox1.Left;
Rect.Bottom := PaintBox1.Height;
Rect.Right := PaintBox1.Width;
// Rectangle
PaintBox1.Canvas.FillRect(Rect);
Rect.Top := (PaintBox1.Top + P);
Rect.Left := PaintBox1.Left + P;
Rect.Bottom := PaintBox1.Height - P;
Rect.Right := PaintBox1.Width - P;
PaintBox1.Canvas.Rectangle(Rect);
end;
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Dec(P,5);
DrawData;
end;
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Inc(P,5);
DrawData;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
DrawData;
end;
end.
対策後のコード
MouseWheelDown(Up)をそれぞれ下記のようにしました。
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
var
Pt: TPoint;
begin
GetCursorPos(Pt);
Pt := ScreenToClient(Pt);
if ((Pt.X > 0) and (Pt.X < PaintBox1.Width)) and
((Pt.Y > 0) and (Pt.Y < PaintBox1.Height)) then
begin
Handled := True;
Dec(P,5);
DrawData;
end;
end;
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
var
Pt: TPoint;
begin
GetCursorPos(Pt);
Pt := ScreenToClient(Pt);
if ((Pt.X > 0) and (Pt.X < PaintBox1.Width)) and
((Pt.Y > 0) and (Pt.Y < PaintBox1.Height)) then
begin
Handled := True;
Inc(P,5);
DrawData;
end;
end;
これによりPaintBox1上にマウスがある場合のみPaintBox1にマウスホイールが働きます。 ListBox1をスクロールするには、ListBox1上にマウスを移動させます。
| 固定リンク
