▼ Mr.XRAYさん
> というわけで(どういわけだ!?),こんな感じでしょうか.
ListviewだとRtIntRectが使えないので、下記のようにしました。ちょっと
泥臭いコードですが、これですっきり解決です。
procedure TForm2.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
APos : TPoint;
CPos : TPoint;
RectMemo1 : TRect;
RectMemo2 : TRect;
begin
GetCursorPos(APos);
GetWindowRect(Memo1.Handle, RectMemo1);
GetWindowRect(Listview1.Handle, RectMemo2);
if PtInRect(RectMemo1, APos) then begin
if WheelDelta > 0 then begin
Memo1.Perform(EM_SCROLL,SB_LINEUP,0);
end else begin
Memo1.Perform(EM_SCROLL,SB_LINEDOWN,0);
end;
//元のスクロールメッセージは処理しない
Handled := true;
end;
Cpos.x := Listview1.Left;
Cpos.Y := Listview1.Top;
Cpos := ClientToScreen(Cpos);
if (Apos.X >= Cpos.x) and (Apos.X <= Cpos.x + Listview1.Width)
and (Apos.Y >= Cpos.y) and (Apos.Y <= Cpos.y + Listview1.Height)
then begin
//Listviewでは元のメッセージを生かす
Handled := false;
end
else Handled := true;
//Listview上でなくてもスクロールしてしまうから。
end;
これはいろいろ応用できそうですね。ありがとうございました。
※困った時には「神様・仏様、その前にMr.XRAY様」です。
|