C#根据鼠标位置获取控件名称
开发环境:C# 2008 WinFrom
在一个窗体上放置了若干个Panel控件,每个Panel控件中又放置axShockwaveFlash控件(播放flash的控件)
需要实现的目标:
用户从IE或其他浏览器里面拖动flash到axShockwaveFlash控件上,则这个axShockwaveFlash播放拖过来的flash。
问题:
因为axShockwaveFlash是没有DragDrop事件和DragEnter事件的,因此我需要判断拖过来后鼠标松开是当前鼠标所在控件的名称,即根据当前point获取控件的名称,请问我该如何做?谢谢!
[解决办法]
沙發,不太懂,幫忙頂下。高手解答。。
[解决办法]
试着提出一种比较笨的方法。
使用Form来捕捉鼠标事件,可以获得鼠标在Form上的具体坐标,然后遍历所有axShockwaveFlash控件获取矩形轮廓,判断鼠标坐标是否落在矩形中。
[解决办法]
private void frmACTest_Load(object sender, EventArgs e) { this.capture = true;//使用窗口捕捉鼠标移动时间 } private void frmACTest_MouseMove(object sender, MouseEventArgs e) { Point point = this.PointToScreen(new Point(e.X,e.Y)); Rectangle rc = this.button1.RectangleToScreen(this.button1.ClientRectangle); if (rc.Contains(point)) MessageBox.Show("button1 被经过了"); }
[解决办法]
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
this.textBox1.Text = e.X.ToString() + ":" + e.Y.ToString();
}
private void panel4_MouseEnter(object sender, EventArgs e)
{
this.Capture = true;
Panel p = sender as Panel;
this.textBox1.Text = this.textBox1.Text + ":" + p.Name;
}
private void Form1_MouseLeave(object sender, EventArgs e)
{
this.Capture = false;
}
我测试下,没有问题。我用4个panel平分了窗体。
[解决办法]
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Zaxx
{
public partial class MouseOnControl: Form
{
[DllImport("User32.dll")]
private static extern IntPtr WindowFromPoint(Point p);
Timer timer;
public MouseOnControl()
{
InitializeComponent();
timer = new Timer();
timer.Interval = 200;
timer.Enabled = true;
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
Point p = Cursor.Position;
IntPtr h = WindowFromPoint(p);
foreach (Control con in this.Controls)
if (con.Handle == h)
this.Text = con.Name;
}
}
}
你自己向MouseOnControl窗体里添加几个控件,运行就可以看到结果了。而你若只想判断是否在你那个axShockwaveFlash控件上,就只用一个if语句,而不用foreach循环就足够了。
[解决办法]
帮你顶了·····
[解决办法]
给你的思想吧,通过托管函数来实现
private void Panel_MouseClick(object sender, EventArgs e)
{
Panel pa;
if (sender is Panel )//使用托管来实现双击
{
Pic= (Panel)sender;
//你需要做的事情
if(e.x>=1&&e.x<=3&&e.y>=1&&e.y&&3)
{
//当前为panel1,进行你要处理的事件
}
}
}