マウスカーソルの形状をキーのUP,Downで変えたい


situmonnsya  2006-04-27 10:06:31  No: 21221

procedure TForm1.FormKeyDown(Sender〜〜〜);
Cursor:=crCross ;

procedure TForm1.FormKeyUp(Sender:〜〜〜〜);
Cursor:=crDefault;

上記でマウスボタンを押してる状態でキーが押されたらカーソル形状を変えたいのですが・・・

マウス左ボタンが押されてる時にキーボードを押しても(FormKeyDown)変化しません。
でも右ボタンが押されている時、左右どちらも押されてない時は変わります。
なにか、対処方法ありませんか?

APIのSetCursor(hcur)を使うと左ボタンが押されている時も変化しますが、「hcur;/* カーソルのハンドル*/」が理解できません。
実動ではカーソル形状は自作で
Screen.Cursors[1] := LoadCursorFromFile('C:\TEST.cur');のように読込んでいます。


メルル  2006-04-29 20:40:08  No: 21222

API あまりさわりたくないので、詳しくないですが、
ひょっとしてヒントになるかも・・なページです。

http://www.agtech.co.jp/html/v8sdkmanuals/prog_tut/Btriface4.html

  { Private 宣言 }
    ArrowCursor,
    WaitCursor    : HCursor;
/////////
WaitCursor     :=  LoadCursor(0, IDC_WAIT);

・・・WaitCursor。 型から見るに、恐らく、hcur のことだと思います。
疑問の一つはこれで解消できればいいですが、前述したように、
詳しくないのではずしてるかも知れません。

これで動けばしめたものですが、OSがカーソルを強制的に替えてしまう
可能性もあり、その場合は、さらにメッセージをフックして、違う値をセット後、
メーッセージ・ループに乗せる処理が必要かも知れません。

「D&Dでフォーカス・ゲットは?」の質問でも、そこのところは面倒そうなので、
自分は、そんなことまでしてられん・・とあきらめましたが・・。

直接の解答でなく、はずしてたら申し訳ないです。書かないよりまし
程度の情報ですみません。


ママん  2006-05-01 11:54:52  No: 21223

グローバルフックでキーボードをとらえれば楽ちんです。
そのものずばりじゃないですが
x-rayさんとこのサンプルリンクさせときます
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/KindOfHook.htm

あと、キーの数が少なくて良いならHotkeyを使うと超楽ちんです。
http://forum.nifty.com/fdelphi/samples/00356.html


解決した?  2006-05-07 07:52:51  No: 21224

カーソルいじったことは、あまりないんですが。
interface
  private
    { Private 宣言 }
    Cursor1: hCursor;
    Cursor2: hCursor;
    MouseShift: TShiftState;
    
implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
    Cursor1:= LoadCursor( 0,IDC_ARROW);
    Cursor2:= LoadCursor( 0,IDC_CROSS);
    //Cursor:=LoadCursorFromFile();
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if ssLeft in MouseShift then
        SetCursor( Cursor2)
    else
        SetCursor( Cursor1);

    Caption:=( Char(Key));
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    MouseShift:=Shift;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    MouseShift:=Shift;

end;

もし、フォームに TEdit や TMemoが乗ってる場合は、キーイベントはそっちに
行ってしまうようなので
・FormのKeyPreviewをTrueにするか
・キーイベントやマウスイベントも同様のハンドラにアサインする(結びつける)か
・同じように別に書くか
のいずれかをしないと駄目です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加