実際に私はパネルに画像を描いています。画像は不規則な形でした。マウスクリックの場合、クリックが画像またはパネルで行われたかどうかにかかわらず、メッセージを表示したいと思います。
質問する
748 次
2 に答える
0
目標を達成するためにRegion クラスとそのIntersect メソッドを使用できますが、おそらくより良い解決策が存在します。ただし、それらを見つけるまでは、パネルに描かれた楕円でマウス ポイントをキャプチャする例に基づいて、次の方法を試してください。
フィールドを宣言します。
private readonly GraphicsPath _graphicsPath;
private readonly Region _region;
private readonly Graphics _panelGraphics;
上記のフィールドを初期化します。
_graphicsPath = new GraphicsPath();
_graphicsPath.AddEllipse(100, 100, 100, 100); // Path that contains simple ellipse. You can add here more shapes and combine them in similar manner as you draw them.
_region = new Region(_graphicsPath); // Create region, that contains Intersect method.
_panelGraphics = panel1.CreateGraphics(); // Graphics for the panel.
パネル ペイント イベント ハンドル:
private void panel_Paint(object sender, PaintEventArgs e)
{
_panelGraphics.FillEllipse(Brushes.Red, 100, 100, 100, 100); // Draw your structure.
}
パネルのマウス ダウン イベント ハンドル:
private void panel_MouseDown(object sender, MouseEventArgs e)
{
var cursorRectangle = new Rectangle(e.Location, new Size(1, 1)); // We need rectangle for Intersect method.
var copyOfRegion = _region.Clone(); // Don't break original region.
copyOfRegion.Intersect(cursorRectangle); // Check whether cursor is in complex shape.
Debug.WriteLine(copyOfRegion.IsEmpty(_panelGraphics) ? "Miss" : "In");
}
于 2013-02-25T07:35:44.857 に答える
0
以下は、パネルに画像だけを描画するシナリオです。
フィールドを宣言します。
private readonly Bitmap _image;
private readonly Graphics _panelGraphics;
フィールドの初期化:
_image = new Bitmap(100, 100); // Image and panel have same size.
var imageGraphics = Graphics.FromImage(_image);
imageGraphics.FillEllipse(Brushes.Red, 10, 10, 50, 50); // Some irregular image.
panel2.Size = new Size(100, 100);
panel2.BackColor = Color.Transparent; // Panel's background color is transparent.
_panelGraphics = panel2.CreateGraphics();
パネル ペイント イベント ハンドル:
private void panel_Paint(object sender, PaintEventArgs e)
{
_panelGraphics.DrawImageUnscaled(_image, 0, 0);
}
パネルのマウス ダウン イベント ハンドル:
private void panel_MouseDown(object sender, MouseEventArgs e)
{
Debug.WriteLine(_image.GetPixel(e.Location.X, e.Location.Y).A != 0 ? "In" : "Miss");
}
于 2013-02-25T08:12:09.447 に答える