我已經爲我的窗體 編寫了MouseMove的事件處理程序,但是當我添加一個窗體以形成窗體時,此處理程序不會在面板上移動時運行。 我添加事件處理程序面板和這個工程,但我有幾個面板的形式, 有沒有更容易的解決方案?控件在C#窗口程序中隱藏窗體的事件
回答
你可以實現IMessageFilter預先過程,要的消息你對照。
http://blogs.msdn.com/csharpfaq/archive/2004/10/20/245412.aspx
不過,我不認爲這是一個非常乾淨的方式,從設計的角度做的事情。
不,沒有簡單的方法,您應該爲每個需要接收MouseMove事件的控件分配事件處理程序。
我認爲你應該能夠「傳播」處理程序,所以你不必重寫每一個代碼。請記住,MouseMove事件有控制相對座標,所以如果您將事件從面板傳遞到表單,則必須將事件中的Y值轉換爲表單座標(類似於減法面板event.X中的.location.X等)。
不幸的是,WinForms不支持事件冒泡。但是你可以編寫一些代碼來緩解連接事件的任務。
public void AssignMouseMoveEvent(Form form)
{
foreach(Control control in form.Controls)
{
if(! (control is Panel))
continue;
control.MouseMove += PanelMouseMove;
}
}
你應該叫上面的代碼通過它您目前的形式,它會分配PanelMouseMove爲所有的面板MouseMove事件的事件處理程序。
請注意,PanelMouseMove事件處理程序中的e.Location將與引發MouseMove事件的控件相關。 – 2009-07-02 15:41:47
我認爲這是作者需要的,不是嗎? – SolutionYogi 2009-07-02 15:44:42
假設鼠標開始在表單上而不是在面板上移動 - 這是一個很大的假設 - 當它進入子控件時,您將得到一個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;
}
}
}
我發現了另一個解決方案:)「在隱藏事件的控件中引發事件」 我在面板中捕獲事件並通過調用onMouseMove來增加窗體的鼠標移動事件
- 1. 隱藏Windows窗體應用程序中的控制檯窗口
- 2. 在c#窗口應用程序中隱藏用戶窗體
- 3. 在C中隱藏窗體#
- 4. 隱藏Electron.io程序窗口
- 5. 如何在C#中顯示窗體的所有隱藏控件?
- 6. 隱藏C程序的控制檯窗口
- 7. 隱藏cmd窗口窗體應用程序
- 8. 隱藏控制檯窗口
- 9. 隱藏控制檯窗口
- 10. 從Process.Start隱藏控制檯窗口C#
- 11. 發送鼠標事件爲不活動和隱藏的窗口/ WPF窗體
- 12. C#窗體控件
- 13. C#顯示隱藏窗口
- 14. 誰在Windows窗體程序中調用窗體加載事件?
- 15. 在C#控制檯中隱藏控制檯窗口應用程序
- 16. 從父窗體在C中爲子窗體中的控件添加事件處理程序#
- 17. 從父窗口隱藏一個子窗口隱藏所有的應用程序
- 18. 在C中隱藏窗體滾動條#
- 19. C#窗體中的自定義控件Windows窗體鼠標事件問題
- 20. 在visual C++窗體窗體應用程序中瀏覽文件
- 21. 隱藏/顯示程序窗口
- 22. 如何在同一窗口中顯示窗體輸出並隱藏窗體
- 23. WordPress:以編程方式隱藏帖子窗口中的窗口小部件
- 24. 通過事件C#窗口應用程序在MDI窗體和SDI窗體之間進行通信
- 25. 窗體關閉事件在多個窗口窗體應用程序使用可視c#
- 26. 如何在javascript中關閉\隱藏彈出窗體窗口?
- 27. 在Web窗體類中控制訪問事件處理程序
- 28. fsStayOnTop窗體隱藏的模態窗體
- 29. 隱藏批窗口?
- 30. NSIS隱藏窗口?
你想做什麼? – 2009-07-02 16:06:19
我有兩個面板的表單。我想在它們之間移動一些用戶控件(無需拖動!) – 2009-07-03 03:36:41