フォームのMouseMoveのイベントハンドラを作成しました ですが、フォームにパネルを追加すると、パネル上にマウスが移動してもこのハンドラは実行されません。 イベントハンドラをパネルに追加しましたが、これは動作しますが、フォーム上にいくつかのパネルがありました。 は簡単なソリューションですか?コントロールはC#Windowsプログラムでフォームのイベントを非表示にします
答えて
という名前であなたのしようとしているメッセージのプリプロセスを行いIMessageFilterをを実装することができコントロール。
http://blogs.msdn.com/csharpfaq/archive/2004/10/20/245412.aspx
はしかし、私は、これは設計の観点から物事を行うには非常にきれいな方法だとは思わない。
私はその記事を読んでいるだけかもしれませんが、それは解決策です。 –
これはとても便利な記事でしたが、もっと簡単な方法を探していました;) –
ありがとうOG。あなたのアプローチを実装しました。 –
いいえ簡単な方法はなく、MouseMoveイベントを受け取る必要がある各コントロールにイベントハンドラを割り当てる必要があります。
ハンドラを「伝播」できる必要があると思いますので、それぞれのコードを書き直す必要はありません。 MouseMoveイベントにはのコントロール相対座標があるので、パネルからフォームにイベントを渡す場合は、イベントのX & Y値をフォーム座標に変換する必要があります(パネルを減算するようなものイベントXからの位置Xなど)。
残念ながら、WinFormsはイベントのバブリングをサポートしていません。しかし、イベントを取り込む作業を簡単にするためのコードを書くことができます。
public void AssignMouseMoveEvent(Form form)
{
foreach(Control control in form.Controls)
{
if(! (control is Panel))
continue;
control.MouseMove += PanelMouseMove;
}
}
あなたはそれをあなたの現在のフォームを渡す上記のコードを呼び出す必要があり、それがすべてのパネルのMouseMoveイベントのイベントハンドラとしてPanelMouseMoveを割り当てます。
PanelMouseMoveイベントハンドラのe.Locationは、MouseMoveイベントを発生させるコントロールを基準にしていることに注意してください。 –
私はそれが著者が必要とするものだと思いますか? – SolutionYogi
著者はフォームにすべてのマウス入力を受けたいと考えているので、マウスが動くようなコントロールではなく、フォームに相対的な座標であれば好ましいと思います。 ClientToScreenとScreenToClientの2回の呼び出しで簡単に修正できます。著者にこのことを知らせたいだけでした。 –
マウスがパネル上ではなくフォーム上を移動し始めると仮定すると、これは大きな前提ですが、サブコントロールに入るとMouseLeaveイベントが発生します。フォームの境界内にある場合は、カーソルの位置を確認してマウス移動コードを呼び出すことができます。
マウスの移動イベントがコントロールで開始された場合、これは機能しません。
このコードは(私のために働いたあなたはパネルとラベルを持つフォームを前提としています。ラベルは、「MouseCoords」
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ShowCoords(int x, int y)
{
this.MouseCoords.Text = string.Format("({0}, {1})", x, y);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
this.ShowCoords(e.X, e.Y);
}
protected override void OnControlAdded(ControlEventArgs e)
{
// hook the mouse move of any control that is added to the form
base.OnControlAdded(e);
e.Control.MouseMove += new MouseEventHandler(Control_MouseMove);
}
private void Control_MouseMove(object sender, MouseEventArgs e)
{
// convert the mouse coords from control codes to screen coords
// and then to form coords
System.Windows.Forms.Control ctrl = (System.Windows.Forms.Control)sender;
Point pt = this.PointToClient(ctrl.PointToScreen(e.Location));
this.ShowCoords(pt.X, pt.Y);
}
private void Form1_Load(object sender, EventArgs e)
{
this.MouseMove += this.Form1_MouseMove;
}
}
}
私はこの技術に精通しています。しかし、多くのコントロールに同じハンドラを割り当てるときのパフォーマンスへの影響はどれですか? –
テストをテストしますが、パフォーマンスの影響は最小限に抑える必要があります。一度に1つのコントロールだけがイベントハンドラを呼び出すことになります。これは、コントロールごとにデリゲートをインスタンス化していることを意味します。デリゲートは、ファンクションへのポインタ型の安全なポインタです(関数の「コードセグメント」は一度しか存在しません。参照を作成しています)。それでも、たくさんのコントロールがある場合、メモリの影響があります。テストするのは非常に簡単で、OnControlAddedメソッドをコメントアウトしてメモリ使用量を比較するだけです。 – JMarsch
(oh、1 quid-pro-quo):mousemove自体の内部に何か(anythign)を実行した場合の影響は、パフォーマンスが低下する可能性があります。マウスの移動は非常に頻繁に起こります。私の以前のコメントでより正確にするために、同じハンドラを参照する複数のコントロールのコストは低くすべきだと思いますが、マウスの移動ハンドラで多くの作業を行うことで全体のパフォーマンスが影響を受ける可能性があります。 – JMarsch
私は別の解決策を見つけました:) "イベントを隠すコントロール内のイベントを発生させる" onMouseMoveを呼び出すことによって、パネルのイベントをキャッチしてフォームのマウス移動イベントを発生させます
- 1. C#でフォームのすべての非表示コントロールを表示するには?
- 2. WindowsフォームC#プログラム:ボタンの状態を確認する方法(有効/無効または表示/非表示)?
- 3. Windowsフォームでコントロールが表示されないC#
- 4. Windowsフォーム:起動時に、ロードしますがフォームを非表示にします
- 5. Control.Invalidateは、非表示または非表示のコントロールのpaintイベントをトリガーしません。
- 6. C#、フォームを非表示にして別のフォームを表示する方法
- 7. Windowsのシステムトレイで自分のプログラムを非表示にする
- 8. MS Accessフォームのコントロールをイベントとともに一覧表示します。
- 9. C#フォーム2を非表示にして再オープンします
- 10. Windowsフォームのトップバーを完全に非表示にできないC#
- 11. C#Windowsフォームでボタンの関連カテゴリを表示するには?
- 12. タスクマネージャから非表示のWindowsフォーム用のProcessExit/Stopイベントを受信
- 13. 条件付きで表示/非表示Windowsフォーム要素
- 14. 複数のPDFファイルをWebBrowserコントロール(Windowsフォーム)に表示
- 15. Delphiのコンポーネントは、ランタイム中にコントロールを表示/非表示にします
- 16. Java - Android - IDを使用してプログラムでコントロールを非表示または表示する方法
- 17. 複数のフォームを非表示にして、イベントをクリックしてフォームを表示する方法jquery
- 18. 親のonclickイベントで非表示divを表示/非表示
- 19. プログラムでMPMoviePlayerControllerのコントロールを表示する
- 20. イベントをPowerBuilderの非表示のコントロールに投稿/トリガーする方法は?
- 21. Windowsフォーム間の表示と非表示に切り替えるには?
- 22. LostFocusのコントロールを非表示にする
- 23. c#windowsフォーム出力コードをWindowsに表示する
- 24. C#でプロセスを非表示/非表示にする方法は?
- 25. アンドロイドで目覚ましアイコンをプログラムで表示/非表示
- 26. C#フォームのラベルを非表示にします。繰り返しのために
- 27. 別のWinFormsコントロールを表示したり非表示にするWinFormsコントロールはありますか?
- 28. リピータのJavascript非表示コントロール
- 29. C#windowsフォームの参照コントロール - NullReferenceException
- 30. Windowsフォームでコンポーネントを検索するC#(コントロールではない)
何をしようとしていますか? –
私は2つのパネルを持つフォームを持っています。 –