環境はDelphi 6 Personalです。
オブジェクトインスペクタで、TImageの「イベント」タブには OnMouseWheelUp などはありませんが、どうにか設定することはできませんか?
TImageの上にマウスポインタがある状態でホイールを回したときに、イベントが発生するようにしたいと考えています。
うーん。以下の方法でいけるのではないかな
i) WM_MOUSEWHEELをメッセージハンドラで定義
ii) マウスイベントをフックしてやればいけると思いますよ。
SetWindowsHookEx()というAPIを使えばどうにかなるかと!!
「Delphi ローカルフック」とかで検索すればいけると思います。
TImageの親ウィンドウである TWinControlのOnMouseWheelUpでは
駄目なんですか?
TImageの上にマウスポインタがあっても、その親のウィンドウの
イベントを利用できると思います。
例えば、TImage が TFormにのっているなら、TForm.OnMouseWheelUp
が利用できます。
TPanelの場合、TWinControlにキャストすれば、実行時にアサインできます。
TWinControl(Panel1).OnMouseWheelUp:= PanelMouseWheelUp;
(注意:TImageはTWinControlではないので、TWinControlでキャストしないでくださいね)
レスありがとうございます。
>カレーライズさん
>WM_MOUSEWHEELをメッセージハンドラで定義
この場合、具体的にどうやって実現するんでしょうか?
TImageを継承したものを作る必要がありますか?
また、フォーカスを得られないと、そもそもホイールに反応できないらしいのですが、そうするとTImageがホイールに反応するのは無理でしょうか?
>fさん
TPanelでやってみましたが
[エラー] Unit1.pas(37): 未定義の識別子 : 'OnMouseWheelUp'
となってしまいました。
protectedだっけか。
type
TWinCtrl = class(TWinControl);
begin
TWinCtrl(Panel1).OnMouseWheelUp:=hoe;
end;
でできます。
でも駄目かも。駄目です。TPanelのOnMouseWheelUpじゃ
拾えない気がする。
TImageの親がTPanelでも、その親がTFormならTFormで拾える。
そうだった。
それと 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;
のようにすれば、なんとかなります。
曖昧な解答しましてm(_ _)m
実際に実装をしていないのでなんともいえませんが、TImageを継承したものでWM_MOUSEWHEELのイベント追加してやればできると思うですが・・・間違えていたらごめんなさい。
それか ScrollBoxにTImageを貼り付けて ScrollBoxを非表示にしておいて ScrollBoxのマウスホイールイベント拾うとかは・・・少しやりたいことと違うのかな??
MORIさんはどういったことがやりたいのでしょうかね??
>fさん
その方法でホイールでイベントを起こすことができました。
しかし、他にフォーカスを取得できるコントロールが
フォーム上にあるとだめみたいです。
>カレーライズさん
>MORIさんはどういったことがやりたいのでしょうかね??
TImageが表のようにいくつも並んでいて、それぞれの上でマウスホイールを回すと
そのTImageに対応したデータが増減し、その値に合った画像がそのTImageに表示される、というややこしいことをやろうとしています。
でも、よく考えてみれば、TStringGridに文字列の他にビットマップも表示できればそれで解決しそうな気がしてきました。
(もともとTStringGridはホイールに反応してくれますし)
https://www.petitmonte.com/bbs/answers?question_id=3681
正確には、類似じゃないorz
HELP
開発者ガイド:カスタムコンポーネントの作成
メッセージの処理
でなんともならないからの質問なんですか?
>お尋ね者さん
ありがとうございます。参考になります。
TButtonをTSpeedButtonに置き換えることで、フォーカスの問題は解決したため、満足に動くようになりました。
ツイート | ![]() |