TImageが OnMouseWheelUpや OnMouseWheelDownを受け取るには

解決


MORI  2006-05-13 10:08:52  No: 21521

環境はDelphi 6 Personalです。

オブジェクトインスペクタで、TImageの「イベント」タブには OnMouseWheelUp などはありませんが、どうにか設定することはできませんか?
TImageの上にマウスポインタがある状態でホイールを回したときに、イベントが発生するようにしたいと考えています。


カレーライズ  2006-05-13 10:30:07  No: 21522

うーん。以下の方法でいけるのではないかな

i) WM_MOUSEWHEELをメッセージハンドラで定義

ii)  マウスイベントをフックしてやればいけると思いますよ。
SetWindowsHookEx()というAPIを使えばどうにかなるかと!!
「Delphi  ローカルフック」とかで検索すればいけると思います。


f  2006-05-14 05:42:32  No: 21523

TImageの親ウィンドウである TWinControlのOnMouseWheelUpでは
駄目なんですか?

TImageの上にマウスポインタがあっても、その親のウィンドウの
イベントを利用できると思います。

例えば、TImage が TFormにのっているなら、TForm.OnMouseWheelUp
が利用できます。

TPanelの場合、TWinControlにキャストすれば、実行時にアサインできます。

TWinControl(Panel1).OnMouseWheelUp:= PanelMouseWheelUp;

(注意:TImageはTWinControlではないので、TWinControlでキャストしないでくださいね)


MORI  2006-05-14 06:17:20  No: 21524

レスありがとうございます。

>カレーライズさん
>WM_MOUSEWHEELをメッセージハンドラで定義

この場合、具体的にどうやって実現するんでしょうか?
TImageを継承したものを作る必要がありますか?
また、フォーカスを得られないと、そもそもホイールに反応できないらしいのですが、そうするとTImageがホイールに反応するのは無理でしょうか?

>fさん

TPanelでやってみましたが
[エラー] Unit1.pas(37): 未定義の識別子 : 'OnMouseWheelUp'
となってしまいました。


f  2006-05-14 06:38:32  No: 21525

protectedだっけか。

type
  TWinCtrl = class(TWinControl);

begin
  TWinCtrl(Panel1).OnMouseWheelUp:=hoe;
end;

でできます。
でも駄目かも。駄目です。TPanelのOnMouseWheelUpじゃ
拾えない気がする。

TImageの親がTPanelでも、その親がTFormならTFormで拾える。
そうだった。


それと  2006-05-14 06:50:43  No: 21526

それと TFormでホイールイベントを処理する時は、
ホイールで操作したいコントロールがいっぱいあって
どれを操作するべきか分からない時は、

var
    pt: TPoint;
    c: TControl;
    h: THandle;
    i: integer;
begin
    GetCursorPos(pt);
    pt:=Panel1.ScreenToClient(pt);
    c:=Panel1.ControlAtPos(pt,True,True);
    if Assigned(c) then
    begin
        // c がマウスポインタの直下にあるコントロール
    end;
end;

のようにすれば、なんとかなります。


カレーライズ  2006-05-14 07:12:13  No: 21527

曖昧な解答しましてm(_ _)m
  実際に実装をしていないのでなんともいえませんが、TImageを継承したものでWM_MOUSEWHEELのイベント追加してやればできると思うですが・・・間違えていたらごめんなさい。
  それか  ScrollBoxにTImageを貼り付けて  ScrollBoxを非表示にしておいて  ScrollBoxのマウスホイールイベント拾うとかは・・・少しやりたいことと違うのかな??

  MORIさんはどういったことがやりたいのでしょうかね??


MORI  2006-05-14 09:57:10  No: 21528

>fさん

その方法でホイールでイベントを起こすことができました。
しかし、他にフォーカスを取得できるコントロールが
フォーム上にあるとだめみたいです。

>カレーライズさん
>MORIさんはどういったことがやりたいのでしょうかね??

TImageが表のようにいくつも並んでいて、それぞれの上でマウスホイールを回すと
そのTImageに対応したデータが増減し、その値に合った画像がそのTImageに表示される、というややこしいことをやろうとしています。

でも、よく考えてみれば、TStringGridに文字列の他にビットマップも表示できればそれで解決しそうな気がしてきました。
(もともとTStringGridはホイールに反応してくれますし)


類似  2006-05-14 09:57:49  No: 21529

https://www.petitmonte.com/bbs/answers?question_id=3681


類似  2006-05-14 09:58:28  No: 21530

正確には、類似じゃないorz


お尋ね者  2006-05-14 21:45:54  No: 21531

HELP
開発者ガイド:カスタムコンポーネントの作成
メッセージの処理

でなんともならないからの質問なんですか?


MORI  2006-05-15 09:41:35  No: 21532

>お尋ね者さん

ありがとうございます。参考になります。

TButtonをTSpeedButtonに置き換えることで、フォーカスの問題は解決したため、満足に動くようになりました。


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

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






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