Mohamad Shawkey
Mohamad Shawkey

Reputation: 135

How to pass an event to another control in c# winforms?

I want to pass an event (MouseWheel) from one control to another. When the first control captures the event it should call the default handler of this event on the second control. This is a pseudo code of what I try to do.

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

Edit: Control2 is a COM interface and its handler is not written be me.

Upvotes: 0

Views: 2560

Answers (2)

user3722451
user3722451

Reputation: 1

You can use method SendMessage to send WM_MOUSEWHEEL message to the second control:

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

Here is sample with 2 listboxes, scrolling one scrolls another.

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));

      }


   }
}

Upvotes: 0

Steve
Steve

Reputation: 216353

You could set both controls to have the same event handler. (By Designer or in code)

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


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

Upvotes: 1

Related Questions