调用子窗体事件以替换或避免mdi父窗体事件

本文关键字:事件 窗体 mdi 替换 调用 | 更新日期: 2023-09-27 18:26:37

mdimain_MdiChildActivate中,为所有子窗体定义应用程序逻辑与CCD_ 2 mouseDoubleClick事件相关。它适用于所有包含子窗体的网格,但在某些情况下,网格mouseDoubleClick是为子窗体内部定义的。因此,该事件被触发两次,一次来自MdiParent,另一次用于内部。是否有任何方法可以使MdiParent父控件事件不会为该mouseDoubleClick事例激发,从而在不更改MDI窗体中的代码的情况下比较/验证子窗体的ifexist事例。

示例:

private void MDIMain_MdiChildActivate(object sender, EventArgs e)
{
    // code should not work
}      
private void MainGridControl_MouseDoubleClick(object sender, MouseEventArgs e)
{
  ///  Child Form : code should work
}

调用子窗体事件以替换或避免mdi父窗体事件

此方法检测在MdiChildActivate被激发之前发送到MainGridControlWM_NCHITTEST消息。这只能检测您的鼠标是否在MainGridControl上使用(单击、双击),但我认为它适合您的情况。

public class Form1 : Form {
   public Form1(){
      InitializeComponent();
      Load += (s,e) => {
         gridProc.AssignHandle(MainGridControl.Handle);
      };
   }
   MainGridProc gridProc = new MainGridProc();
   private void MDIMain_MdiChildActivate(object sender, EventArgs e)
   {
       if(gridProc.HitTestOn) { gridProc.HitTestOn = false; return; }
       //code is still run if HitTestOn = false
       //.......
   }   
   public class MainGridProc : NativeWindow {
      protected override void WndProc(ref Message m){
         if(m.Msg == 0x84)//WM_NCHITTEST
         {
            HitTestOn = true;
         }
         base.WndProc(ref m);
      }
      public bool HitTestOn {get;set;}
   }
}