如何将事件传递给c#winforms中的另一个控件?

时间:2014-06-08 13:32:14

标签: c# winforms event-handling controls

我想将一个事件(MouseWheel)从一个控件传递到另一个控件。 当第一个控件捕获事件时,它应该在第二个控件上调用此事件的默认处理程序。这是我尝试做的伪代码。

void Control1_MouseWheel(object sender, MouseEventArgs e)
{
   //do something
   Control2_MouseWheel(sender,e);
}

编辑:Control2是一个COM接口,它的处理程序不是我写的。

2 个答案:

答案 0 :(得分:1)

您可以将两个控件设置为具有相同的事件处理程序。 (按设计师或代码)

Control1.MouseWheel += CommonMouseWheelHandler;
Control2.MouseWheel += CommonMouseWheelHandler;


protected void CommonMouseWheelHandler(object sender, MouseEventArgs e)
{
    ... your common code here...
}

答案 1 :(得分:0)

您可以使用方法SendMessageWM_MOUSEWHEEL消息发送到第二个控件:

SendMessage(destWindowHandle, m.Msg, (int)m.WParam, (int)m.LParam);

以下是包含2个列表框的示例,滚动滚动另一个列表框。

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication18
{
   static class Program
   {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new Form1());
      }



   }

   public class MessageFilter : IMessageFilter
   {
      IntPtr sourceWindowHandle;
      IntPtr destWindowHandle;


      [DllImport("user32.dll", CharSet = CharSet.Auto)]
      public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

      public MessageFilter(IntPtr sourceHandle, IntPtr destHandle)
      {
         sourceWindowHandle = sourceHandle;
         destWindowHandle = destHandle;
      }
      public bool PreFilterMessage(ref Message m)
      {
         if (m.HWnd == sourceWindowHandle && m.Msg == 0x020A)// mousewheel
            SendMessage(destWindowHandle, m.Msg, (int)m.WParam, (int)m.LParam);
         return false;
      }
   }



   public class Form1 : Form
   {


      /// <summary>
      /// Required designer variable.
      /// </summary>
      private System.ComponentModel.IContainer components = null;

      /// <summary>
      /// Clean up any resources being used.
      /// </summary>
      /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
      protected override void Dispose(bool disposing)
      {
         if (disposing && (components != null))
         {
            components.Dispose();
         }
         base.Dispose(disposing);
      }

      #region Windows Form Designer generated code

      /// <summary>
      /// Required method for Designer support - do not modify
      /// the contents of this method with the code editor.
      /// </summary>
      private void InitializeComponent()
      {
         this.listBox1 = new System.Windows.Forms.ListBox();
         this.listBox2 = new System.Windows.Forms.ListBox();
         this.SuspendLayout();
         // 
         // listBox1
         // 
         this.listBox1.FormattingEnabled = true;
         this.listBox1.Items.AddRange(new object[] {
            "1",
            "2",
            "3",
            "4",
            "5",
            "6",
            "7",
            "8",
            "9",
            "10"});
         this.listBox1.Location = new System.Drawing.Point(56, 48);
         this.listBox1.Name = "listBox1";
         this.listBox1.Size = new System.Drawing.Size(120, 95);
         this.listBox1.TabIndex = 0;
         // 
         // listBox2
         // 
         this.listBox2.FormattingEnabled = true;
         this.listBox2.Items.AddRange(new object[] {
            "1",
            "2",
            "3",
            "4",
            "5",
            "6",
            "7",
            "8",
            "9",
            "10"});
         this.listBox2.Location = new System.Drawing.Point(280, 48);
         this.listBox2.Name = "listBox2";
         this.listBox2.Size = new System.Drawing.Size(120, 95);
         this.listBox2.TabIndex = 1;
         // 
         // Form1
         // 
         this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
         this.ClientSize = new System.Drawing.Size(501, 361);
         this.Controls.Add(this.listBox2);
         this.Controls.Add(this.listBox1);
         this.Name = "Form1";
         this.Text = "Form1";
         this.ResumeLayout(false);

      }

      #endregion

      private System.Windows.Forms.ListBox listBox1;
      private System.Windows.Forms.ListBox listBox2;
      public Form1()
      {
         InitializeComponent();
         Application.AddMessageFilter(new MessageFilter(listBox1.Handle, listBox2.Handle));

      }


   }
}