16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:インテリマウスに対応する"
この発言は #00214 折井 哲 さんのインテリマウスに対応する に対するコメントです
#214のコードではWin95&NT3.51でしか動きませんでした。MES11にて
SatobeさんからNT4対策等をご指導頂きましたのでこちらにまとめて
完全版を掲載します。
●#214の間違い
・TMsg.lParam
マウスポインターの位置
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
・TMsg.Result
スクロールした行数。
・MSDNに入ってなくても以下のURLで英文資料とCのヘッダを入手可能。
<http://www.microsoft.com/japan/hardware/DevSite/IntMouse/>
●NT4の場合の違い
・TMsg.Msg
WM_MOUSEWHEEL = $020A という定数
・TMsg.wParam
fwKeys = LOWORD(wParam);
zDelta = (short)HIWORD(wParam);
fwKeys は SHIFT/CTRL/LBUTTON/MBUTTON/RBUTTON のステータス
てな訳で#214のWndProc関数を以下のようにして下さい。
----------------------------------------------------------------
procedure TForm1.WndProc(var Msg: TMessage);
type
TWordRec = packed record
Low, High: Smallint;
end;
const
WM_MOUSEWHEEL = $020A;
var
IntelliParam: Integer;
begin
if (Msg.Msg= MSWHEEL_ROLLMSG)or
(Msg.Msg= WM_MOUSEWHEEL) then
begin
Msg.Result:= 0;
if Msg.Msg = WM_MOUSEWHEEL
then IntelliParam := TWordRec(Msg.wParam).High
else IntelliParam := TWordRec(Msg.wParam).Low;
with StringGrid1 do
begin
if IntelliParam= 120 then
begin
if TopRow> 4 then
begin
TopRow:= TopRow-4;
Msg.Result:= -4;
end else
begin
Msg.Result:= 1- TopRow;
TopRow:= 1;
end;
end else
if IntelliParam= -120 then
begin
if TopRow< RowCount-4 then
begin
TopRow:= TopRow+4;
Msg.Result:= 4;
end else
begin
Msg.Result:= RowCount- TopRow- 1;
TopRow:= RowCount-1;
end;
end;
end;
end else
inherited WndProc(Msg);
end;
----------------------------------------------------------------
折井 哲
VZX00324
Original document by 折井 哲 氏 ID:(VZX00324)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|