c# 为自定义控件添加鼠标双击事件
最近在用一个厂家提供的控件(c++写的),这个控件只可以响应鼠标右键事件(厂家提供的接口),但是不能响应鼠标双击事件,现在我想在这个控件上添加双击事件(在c#环境下),我...
最近在用一个厂家提供的控件(c++写的),这个控件只可以响应鼠标右键事件(厂家提供的接口),但是不能响应鼠标双击事件,现在我想在这个控件上添加双击事件(在c#环境下),我该如何扩展这个类?谢谢!
展开
4个回答
展开全部
厂家提供的控件都是封装好的,就算你扩展这个类也只能添加功能,不能直接响应双击事件。
但是你可以拦截这个控件的双击消息。
以下代码可加在控件的父窗口(假设为Form1),并在Form1初始化后安装拦截挂钩。同样的方法也可屏蔽那控件的其它消息,如屏蔽它的右键事件。
private const int GWL_WNDPROC = -4;
private const int WM_LBUTTONDOWN=0x0201;
private const int WM_LBUTTONUP=0x0202;
private const int WM_LBUTTONDBLCLK=0x0203;//双击消息
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, MyWndProc wndProc);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public delegate IntPtr MyWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private IntPtr OldWndProc = IntPtr.Zero;
private MyWndProc Wpr = null;
private IntPtr MyControlWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
switch (msg)
{
case WM_LBUTTONDBLCLK://拦截双击消息
/*在这里,你想干什么就干什么*/
.......................
.......................
return (IntPtr)0;
default:
return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
}
}
//假设那个控件变量名为 _thatControl
private void InitializeThatControl()
{
//初始化的时候安装消息拦截
this.Wpr = new MyWndProc(this.MyControlWndProc);
this.OldWndProc = SetWindowLong(_thatControl.Handle, GWL_WNDPROC, Wpr);
}
public Form1()
{
InitializeComponent();
InitializeThatControl();//加这句,在Form初始化后安装消息拦截
}
但是你可以拦截这个控件的双击消息。
以下代码可加在控件的父窗口(假设为Form1),并在Form1初始化后安装拦截挂钩。同样的方法也可屏蔽那控件的其它消息,如屏蔽它的右键事件。
private const int GWL_WNDPROC = -4;
private const int WM_LBUTTONDOWN=0x0201;
private const int WM_LBUTTONUP=0x0202;
private const int WM_LBUTTONDBLCLK=0x0203;//双击消息
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, MyWndProc wndProc);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
public delegate IntPtr MyWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
private IntPtr OldWndProc = IntPtr.Zero;
private MyWndProc Wpr = null;
private IntPtr MyControlWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
{
switch (msg)
{
case WM_LBUTTONDBLCLK://拦截双击消息
/*在这里,你想干什么就干什么*/
.......................
.......................
return (IntPtr)0;
default:
return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
}
}
//假设那个控件变量名为 _thatControl
private void InitializeThatControl()
{
//初始化的时候安装消息拦截
this.Wpr = new MyWndProc(this.MyControlWndProc);
this.OldWndProc = SetWindowLong(_thatControl.Handle, GWL_WNDPROC, Wpr);
}
public Form1()
{
InitializeComponent();
InitializeThatControl();//加这句,在Form初始化后安装消息拦截
}
展开全部
能看到源码么?
能看到的话继续用c++写
或者添加自定义控件继承这个控件,再重写OnDoubleClick事件
能看到的话继续用c++写
或者添加自定义控件继承这个控件,再重写OnDoubleClick事件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你没有源代码,怎么加?与提供厂家联系吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询