这是我的控件的上下文:
/*
Form
StatusStrip
ToolStripStatusLabel
TableLayoutPanel
MyGenioView
*/
因此,MyGenioView正在拦截MouseMove事件处理程序。已经存在的代码用于一个橡皮筋矩形。所以我有:
public void MyMouseMove(Object sender, MouseEventArgs e)
{
Point ptCurrent = new Point(e.X, e.Y);
// If we "have the mouse", then we draw our lines.
if (m_bHaveMouse)
{
// If we have drawn previously, draw again in
// that spot to remove the lines.
if (m_ptLast.X != -1)
{
MyDrawReversibleRectangle(m_ptOriginal, m_ptLast);
}
// Update last point.
m_ptLast = ptCurrent;
// Draw new lines.
MyDrawReversibleRectangle(m_ptOriginal, ptCurrent);
}
// New code here
}
我无法理解的是,我想从MyGenioView MouseMove
处理程序设置statusStrip1.statusLabel
的值。我不知道怎么做。
我想使用的代码是:
OdGePoint3d pt = GetWorldCoordinates(ptCurrent);
String strCoordinate = String.Format("{0},{1}", ptCurrent.X, ptCurrent.Y);
但是,将其馈送到主窗体statusStrip
对象的正确方法是什么?
谢谢你的帮助。
更新:
我知道如何设置statusStrip标签对象的文本。这不是我的问题。我的问题与我的鼠标处理程序事件的上下文及其与表单的关系有关。请参阅问题开头描述的控件的上下文。迄今为止的评论没有考虑到这一点。
这是表单中我创建MyGenioView
对象(接收鼠标处理程序)的当前位置:
private void viewToolStripMenuItem_Click(object sender, EventArgs e)
{
OdDbDatabase TDDatabase = m_oGenioView.GetDatabase();
if (m_oGenioViewCtrl != null)
m_oGenioViewCtrl.DeleteContext();
tableLayoutPanel.RowCount = 1;
tableLayoutPanel.ColumnCount = 1;
m_oGenioViewCtrl = new MyGenioView();
m_oGenioViewCtrl.TDDatabase = TDDatabase;
m_oGenioViewCtrl.ResetDevice(true);
m_oGenioViewCtrl.Dock = DockStyle.Fill;
m_oGenioViewCtrl.Margin = new Padding(1);
tableLayoutPanel.Controls.Add(m_oGenioViewCtrl);
}
您有多个选项来更新状态:
- 在用户控件中注入
Action<Point>
- 在用户控件中创建
StatusUpdate
事件 - 您也可以使用控件层次结构访问控件,例如,在用户控件中,
this.ParentForm
是您的父窗体,您可以使用Controls
集合或通过在窗体中公开它来查找目标控件
前两个选项要好得多,因为将控件与表单解耦,用户控件可以通过这种方式用于许多表单和其他容器。提供更新状态的方法取决于容器。
最好的选择是创建和使用事件。
1-在用户控件中注入Action<Point>
在用户控件中注入一个Action<Point>
,并在MouseMove
中使用它。要做到这一点,请将其放入用户控制:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Action<Point> StatusUpdate{ get; set; }
//Don't forget to assign the method to MouseMove event in your user control
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
if (StatusUpdate!= null)
StatusUpdate(e.Location);
}
把这个代码放在表单上:
private void Form1_Load(object sender, EventArgs e)
{
this.userControl11.StatusUpdate= p => this.toolStripStatusLabel1.Text=p.ToString();
}
2-在用户控件中创建StatusUpdate
事件
在用户控件中创建一个StatusUpdate
事件,并在MouseMove
中引发它,并在表单中使用该事件。此外,您还可以使用MouseMove
事件本身。
要做到这一点,请将此代码放入用户控制中:
public event EventHandler<MouseEventArgs> StatusUpdate;
public void OnStatusUpdate(MouseEventArgs e)
{
var handler = StatusUpdate;
if (handler != null)
handler(this, e);
}
//Don't forget to assign the method to MouseMove event in your user control
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
OnStatusUpdate(e);
}
然后在表格中,输入以下代码:
//Don't forget to assign the method to StatusUpdate event in form
void userControl11_StatusUpdate(object sender, MouseEventArgs e)
{
this.toolStripStatusLabel1.Text = e.Location.ToString();
}