读书人

C#根据鼠标位置获取控件名称,该怎么处

发布时间: 2012-03-11 18:15:38 作者: rapoo

C#根据鼠标位置获取控件名称
开发环境:C# 2008 WinFrom
在一个窗体上放置了若干个Panel控件,每个Panel控件中又放置axShockwaveFlash控件(播放flash的控件)
需要实现的目标:
用户从IE或其他浏览器里面拖动flash到axShockwaveFlash控件上,则这个axShockwaveFlash播放拖过来的flash。
问题:
因为axShockwaveFlash是没有DragDrop事件和DragEnter事件的,因此我需要判断拖过来后鼠标松开是当前鼠标所在控件的名称,即根据当前point获取控件的名称,请问我该如何做?谢谢!

[解决办法]
沙,不太懂,忙下。高手解答。。
[解决办法]
试着提出一种比较笨的方法。
使用Form来捕捉鼠标事件,可以获得鼠标在Form上的具体坐标,然后遍历所有axShockwaveFlash控件获取矩形轮廓,判断鼠标坐标是否落在矩形中。
[解决办法]

C# code
        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平分了窗体。
[解决办法]
探讨
谢谢3000sunqin,但我还是想根据point的位置获取控件名称。

[解决办法]
学到不少,没白逛
[解决办法]
每天回帖即可获得10分可用分
[解决办法]
鼠标移动的事件属于某个控件, 你写的代码也跟那个控件有关
如果鼠标移出那个控件怎么办, 需要 grab 住鼠标, 使得鼠标移动到外面, 控件仍旧能接收到鼠标消息

随后你就跟踪鼠标移动事件,
在移动中:

// 得到窗口句柄
POINT windowPoint = POINT.FromPoint(this.PointToScreen(new Point(e.X, e.Y)));
IntPtr hwnd = NativeUtils.WindowFromPoint(windowPoint);

if (hwnd != IntPtr.Zero) {
// 如果是托管的, 就能得到对应的 control 类对象
// 不是所有 hwnd 都是托管的哦
Control c = Control.FromHandle(hwnd);
}

[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(POINT Point);

[解决办法]
鼠标移动的事件属于某个控件, 你写的代码也跟那个控件有关
如果鼠标移出那个控件怎么办, 需要 grab 住鼠标, 使得鼠标移动到外面, 控件仍旧能接收到鼠标消息

随后你就跟踪鼠标移动事件,
在移动中:

// 得到窗口句柄
POINT windowPoint = POINT.FromPoint(this.PointToScreen(new Point(e.X, e.Y)));
IntPtr hwnd = NativeUtils.WindowFromPoint(windowPoint);

if (hwnd != IntPtr.Zero) {
// 如果是托管的, 就能得到对应的 control 类对象
// 不是所有 hwnd 都是托管的哦
Control c = Control.FromHandle(hwnd);
}

[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(POINT Point);

[解决办法]
给你一个完整的示例:
/**********************
* 课题:将窗体中鼠标所在控件名显示在窗体标题上
* 作者:ZAXX
* QQ : 94027486
* 本课题可简单扩展:获取屏幕上鼠标所在位置的窗口句柄与类名
**********************/


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,进行你要处理的事件
}
}
}

读书人网 >C#

热点推荐