用户自定义复合控件,内有多个PictureBox子控件,用户在父窗体中点击添加按钮后,向容器Panel内添加该复合控件,请问动态添加的复合控件如何响应MouseDown事件?父窗体中下列代码无效,但将复合控件换成Button确可以,是不是复合控件内要对MouseDown事件进行相应处理?用户点击添加控件的函数
{
自定义复合控件 复合控件1 = new 自定义复合控件();
复合控件1.Name = _item.FrameName;
复合控件1.Size = _item.FrameSize;
复合控件1.Location = _item.FrameLocation;
this.panelList.Controls.Add(复合控件1);
this.panelList.Controls[复合控件1.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
}void FrameList_MouseDown(object sender, MouseEventArgs e)
{
MessageBox.Show("OK");
}
{
自定义复合控件 复合控件1 = new 自定义复合控件();
复合控件1.Name = _item.FrameName;
复合控件1.Size = _item.FrameSize;
复合控件1.Location = _item.FrameLocation;
this.panelList.Controls.Add(复合控件1);
this.panelList.Controls[复合控件1.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
}void FrameList_MouseDown(object sender, MouseEventArgs e)
{
MessageBox.Show("OK");
}
{
public UserControl1()
{
InitializeComponent();
foreach (Control c in this.Controls)
{
c.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
}
} private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
MessageBox.Show("OK");
}
}
这个是增加 userControl的MouseDown事件,样式也就是你设计复合控件的那个背景的。
如果 鼠标点到的是复合控件的 pictureBox 控件,这个 信息只会被对应的 pictureBox捕获。
只有你点的是 复合控件的那个背景时,才会响应。
子控件Panel填充满了复合控件(因为做背景),
只要你把鼠标点击背景事件交给 满了复合控件背景的子控件做事就好了
/// 添加空白帧的回调函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void AddFrame(Object sender, AppendedItemEventArgs e)
{ this._item = (IItemInfo)e._itemInfo;
Frame frame = new Frame(); //Frame为复合控件
frame.Name = _item.FrameName;
frame.Size = _item.FrameSize;
frame.Location = _item.FrameLocation;
this.panelList.Controls.Add(frame);
this.panelList.Controls[frame.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
} void FrameList_MouseDown(object sender, MouseEventArgs e)
{ MouseEventArgs arg = (MouseEventArgs)e;
Frame frame = (Frame)sender;
if (arg.Button == MouseButtons.Right)
frame.BackColor = Color.White;
else
{
frame.BackColor = Color.Blue;
}
}
/// </summary>
/// <param name="sender"> </param>
/// <param name="e"> </param>
public void AddFrame(Object sender, AppendedItemEventArgs e)
{ this._item = (IItemInfo)e._itemInfo;
Frame frame = new Frame(); //Frame为复合控件
frame.Name = _item.FrameName;
frame.Size = _item.FrameSize;
frame.Location = _item.FrameLocation;
this.panelList.Controls.Add(frame);
//this.panelList.Controls[frame.Name].MouseDown += new MouseEventHandler(FrameList_MouseDown);
//frame.MouseDown += new MouseEventHandler(FrameList_MouseDown);//有它的实例了就这样用。
//frame.用个属性公开frame中充满背景的那个控件然后
frame.满背景的那个控件.MouseDown += new MouseEventHandler(FrameList_MouseDown);
}
void FrameList_MouseDown(object sender, MouseEventArgs e)
{
MessageBox.Show("XXX");//应该会执行这句
MouseEventArgs arg = (MouseEventArgs)e;
//来到这里就不对了 应为Frame的背景被之空间遮住了 你改它的背景是看不到的
//而且我上面那样改了就不能用Frame frame = (Frame)sender;这句了
//应该是
满背景的那个控件 frame = (满背景的那个控件)sender;
if (arg.Button == MouseButtons.Right)
frame.BackColor = Color.White;//注意这里是图片框的话 只要有图片背景色就看不到的
else
{
frame.BackColor = Color.Blue;
}
}