人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Delphi6 personal を使用しています。
マウスジェスチャー機能を搭載したい場合、どのように記述すれば良いでしょうか?
もしくはコンポーネントがあるでしょうか?


(http://hp.vector.co.jp/authors/VA024591/archives/components/mousegesture.zip
↑に掲載されているコンポーネントはすでに見ましたので
別に有りましたら宜しくお願いします)

●質問者: tian
●カテゴリ:コンピュータ インターネット
✍キーワード:コンポーネント マウスジェスチャー 記述
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● f_0316
●50ポイント

TTKMouseGestures というコンポーネントがあります。


2 ● aki73ix
●100ポイント ベストアンサー

Delphi6Proで作ってみました

最終的にWMRUを拾ってMZ配列を読んで処理すればよいでしょう

type
 TForm1 = class(TForm)
 Memo1: TMemo;
 procedure FormCreate(Sender: TObject);
 procedure AppMessage(var Msg:TMsg;var Handled:boolean);
 procedure WMRD;
 procedure WMRU;
 procedure WMM;
 end;

var
 Form1: TForm1;
 EX,EY,EZ,LST,MM:Integer; //マウスジェスチャー用変数
 MZ: Array [0..8] of Integer; //ジェスチャー保存用
const
 MARG=8; //マウス感度

implementation

{$R *.dfm}

function wsprintf2(Output:PChar;Format:PChar):Integer;
 cdecl;varargs;external user32 name 'wsprintfA';

//マウス移動
procedure TForm1.WMM;
var
 t1,t2,X,Y:Integer;
 MousePos :TPoint;
 str: string;
begin
//マウスの座標取得
 GetCursorPos(MousePos );
 X:=MousePos.x;
 Y:=MousePos.y;
//マウスの移動絶対値
 t1:=abs(X-EX);
 t2:=abs(Y-EY);
 SetLength(str,1024);
 wsprintf2(PChar(str),'Mouse test %d %d[%d %d]',X,Y,EX,EY);
 Caption:=str;
//マウスの移動量が一定量か確認
 if (EZ>0) and ( (t1>MARG) or (t2>MARG) ) and (abs(t1-t2)>MARG) then
 begin
 if t1>t2 then
 begin
 if (X<EX) and (LST<>1) then
 begin
 LST:=1;
 if MM<8 then
 MZ[MM]:=LST;
 Inc(MM);
 end
 else if (X>EX) and (LST<>2) then
 begin
 LST:=2;
 if MM<8 then
 MZ[MM]:=LST;
 Inc(MM);
 end;
 end
 else
 begin
 if (Y<EY) and (LST<>3) then
 begin
 LST:=3;
 if MM<8 then
 MZ[MM]:=LST;
 Inc(MM);
 end
 else if (Y>EY) and (LST<>4) then
 begin
 LST:=4;
 if MM<8 then
 MZ[MM]:=LST;
 Inc(MM);
 end;
 end;
 EX:=X;
 EY:=Y;
 end;
end;

//右クリック押下
procedure TForm1.WMRD;
var
 MousePos:TPoint;
begin
 GetCursorPos(MousePos);
 EX:=MousePos.x;
 EY:=MousePos.y;
 EZ:=1;
 MM:=0;
 LST:=0;
end;

//右クリック離
procedure TForm1.WMRU;
var
 i: Integer;
begin
 Memo1.Clear();
 if EZ>0 then
 begin
 EZ:=0;
//ジェスチャーの検出
 if MM>0 then
 begin
 Memo1.Lines.Add('マウスジェスチャー検出');
 for i:=0 to MM-1 do
 begin
 if MZ[i]=1 then
 Memo1.Lines.Add('LEFT[←]');
 if MZ[i]=2 then
 Memo1.Lines.Add('RIGHT[→]');
 if MZ[i]=3 then
 Memo1.Lines.Add('UP[↑]');
 if MZ[i]=4 then
 Memo1.Lines.Add('DOWN[↓]');
 end;
 end;
 end;
end;

procedure TForm1.AppMessage(var Msg:TMsg;var Handled:boolean);
begin
//フォームとMemo1上のみ検出
 if (Msg.hwnd=Form1.Handle) or (Msg.hwnd=Memo1.Handle) then
 begin
 if Msg.message=WM_MOUSEMOVE then
 WMM()
 else if Msg.message=WM_RBUTTONUP then
 WMRU()
 else if Msg.message=WM_RBUTTONDOWN then
 WMRD()
 end;
end;


procedure TForm1.FormCreate(Sender: TObject); begin //ハンドラの設定 Application.OnMessage:=AppMessage; end; end.

OnMessageでマウスの移動と右クリックを拾い、

Windowハンドルから、どのコンポーネントからのメッセージか判断した上で、処理することで実現できました

http://nifberry.727.net/test/hatena194.lzh

こちらのソースはホイールによるジェスチャ-にも対応させてみましたので参考にどうぞ

◎質問者からの返答

ありがとうございます!

わざわざ私への回答のためにここまでしていただいたことに、感激しております!

さっそくこれから試してみます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ