winform里如何捕捉窗体中所有的mousedown事件呢,包括groupbox里的?

tigerge 2008-12-15 02:51:38
直接在窗体事件中无法捕捉到groupbox中的单击,而groupbox本身没有mousedown事件,即使有也要分别设置,比较累赘.希望能有更好的办法,最好语句简捷一点的.
...全文
672 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuan_zige 2012-07-05
  • 打赏
  • 举报
回复
ICanUseThisID的果然办法好,参考了,谢谢~
ICanUseThisID 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tigerge 的回复:]
我现在发现PANEL里的mousedown也不行,甚至groupbox的MouseCaptureChanged事件也捕捉不到下属TEXTBOX的鼠标事件.还是标题所问,我现在想取得FORM下所有Textbox的MOUSEDOWN事件做同一处理,如果不想一个个设置那么麻烦,有什么好的方法?
[/Quote]

public Form1()
{
InitializeComponent();

BindEventHandler(this);
//...........
}

private void BindEventHandler(Control ctrl)
{
foreach (Control c in ctrl.Controls)
{
if (c is TextBox)
{
c.MouseDown += new MouseEventHandler(textBox_MouseDown);
}
else
{
BindEventHandler(c);
}
}
}

private void textBox_MouseDown(object sender, MouseEventArgs e)
{
(sender as TextBox).Text = DateTime.Now.ToString();
}
ICanUseThisID 2008-12-18
  • 打赏
  • 举报
回复

private void groupBox1_MouseCaptureChanged(object sender, EventArgs e)
{
MessageBox.Show("");//or do something else
}
CruelYoung123 2008-12-18
  • 打赏
  • 举报
回复
简单方法
应该是直接获取windows消息
才能一劳永逸。。。

至于多个
其实你mosedown事件代码只写一个。。。其他的关联这个事件代码也可以。。。
tigerge 2008-12-18
  • 打赏
  • 举报
回复
ICanUseThisID的办法好,解决了
卧_槽 2008-12-17
  • 打赏
  • 举报
回复
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData== Keys.LButton)
{
//add your code
}
return base.ProcessCmdKey(ref msg, keyData);
}
tigerge 2008-12-17
  • 打赏
  • 举报
回复
楼上兄弟的办法比较独特,不过这个这样解决好吗?
zgke 2008-12-17
  • 打赏
  • 举报
回复
加个时间控件
先判断鼠标按哪个键 然后根据鼠标坐标找控件

private void timer1_Tick(object sender, EventArgs e)
{
if (Form1.MouseButtons != MouseButtons.None)
{
int _X = Form1.MousePosition.X-this.Left;
int _Y = Form1.MousePosition.Y- (this.Top + 25);

this.Text = _X.ToString() + " " + _Y.ToString();
Control _SetControl = this.GetChildAtPoint(new Point(_X, _Y));

if (_SetControl != null) this.Text = _SetControl.Name;

}

}
tigerge 2008-12-17
  • 打赏
  • 举报
回复
我现在发现PANEL里的mousedown也不行,甚至groupbox的MouseCaptureChanged事件也捕捉不到下属TEXTBOX的鼠标事件.还是标题所问,我现在想取得FORM下所有Textbox的MOUSEDOWN事件做同一处理,如果不想一个个设置那么麻烦,有什么好的方法?
tigerge 2008-12-17
  • 打赏
  • 举报
回复
jiangfeng0827兄,我一早就试过FORM的,经测form的mousedown事件确实对groupbox内的控件不起作用.
tigerge 2008-12-17
  • 打赏
  • 举报
回复
楼上兄弟的方法不知道为什么我试了没反应,之前我也用过这种方法,不过语句要多一些:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;

if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
if (keyData == (Keys.S | Keys.Control))
{
...........
}
}

return base.ProcessCmdKey(ref msg, keyData);
}

最关键的是我实际上要捕捉的鼠标事件是将任何点到的textbox的值存入剪贴板,也就是类似下面的:
TextBox tb1 = (TextBox)sender;
Clipboard.SetDataObject(textBox1.Text, true);

所以这种没sender的在我这里不适用.如果有其他方法能实现以上需求的也可以.
tigerge 2008-12-16
  • 打赏
  • 举报
回复
...是winform
lc58511750 2008-12-16
  • 打赏
  • 举报
回复
int j = i++; i 哪来的??? @.@找不到
jiangfeng0827 2008-12-16
  • 打赏
  • 举报
回复
private void Form1_Load(object sender, EventArgs e)
{
this.MouseDown += new MouseEventHandler(Form1_MouseDown);
foreach (Control con in this.Controls) {
con.MouseDown += new MouseEventHandler(Form1_MouseDown);
}
//Quote qu = new Quote();
//Quote.NewDataComing += new Quote.newdataComing(Quote_NewDataComing);
//qu.Query(TrCode.Quote.SymbleList, "16h");
}

void Form1_MouseDown(object sender, MouseEventArgs e)
{
int j = i++;
this.Text = "hello" + j.ToString();
}
jiangfeng0827 2008-12-16
  • 打赏
  • 举报
回复
直接用form的mousedown事件就可以了
tigerge 2008-12-16
  • 打赏
  • 举报
回复
可以一试,主要是不知道对子控件里的起不起效,否则用FORM的就有了
fenglm999 2008-12-16
  • 打赏
  • 举报
回复
你把groupbox和你的控件放到panel中,利用panel的mousedown事件看看
heiyelidexingxing 2008-12-15
  • 打赏
  • 举报
回复
那就在body中寫事件吧
heiyelidexingxing 2008-12-15
  • 打赏
  • 举报
回复
up
tigerge 2008-12-15
  • 打赏
  • 举报
回复
up

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧