首页 > 解决方案 > C# .NET Compact Framework,mousedown 事件问题,使用触摸屏

问题描述

我目前正在使用 Visual Studio 2008、C# 为智能设备开发软件。该设备具有触摸屏作为输入法。我不能使用MouseDown事件。我创建了一个自定义按钮,从System.Windows.Forms.Button类继承。

试图覆盖OnMouseDownOnMouseUp事件。但是这些事件没有触发。我在互联网上搜索并找到了一个解决方案,WndProc但它不能与 .NET Compact Framework 一起使用。

请帮帮我。谢谢大家。示例代码非常简单,您可以在下面找到它。

protected override void OnMouseUp(MouseEventArgs e)
{
   Text = "Mouse Up";
   base.OnMouseUp(e);
}

编辑:

正如我在下面对@josef 的评论中提到的,我创建了我的自定义控件。该控件是一个按钮面板。首先,我尝试为按钮文本添加标签,实际上不需要这样做。它可以在 OnPaint 事件的 override 方法中轻松完成。此控件可能有一些不必要的代码,但您可以对其进行优化。如果你需要它,你可以在下面找到我的解决方案:

class ButonatedPanel : Panel
    {
        public int ShadeWidth { get; set; }
        public bool isMouseDown { get; set; }


        protected override void OnMouseDown(MouseEventArgs e)
        {
            Invalidate();
            isMouseDown = true;
            Text = "Mouse Down";
            base.OnMouseDown(e);
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            Invalidate();
            isMouseDown = false;
            Text = "Mouse Up";
            base.OnMouseUp(e);
        }
        public override string Text
        {
            get
            {
                return Lb.Text;
            }
            set
            {
                Lb.Text = value;
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Lb.Size = new Size(Width - ShadeWidth * 2, Height - 2 * ShadeWidth);
            Lb.Location = new Point(ShadeWidth, ShadeWidth);

            SizeF iSizeF = new SizeF(e.Graphics.MeasureString(Text, Lb.Font).Width,
                e.Graphics.MeasureString(Text, Lb.Font).Height);

            e.Graphics.DrawString(Text, Lb.Font, new SolidBrush(Color.FromArgb(0, 0, 0)),
                (Width - 2 * ShadeWidth - iSizeF.Width) / 2, (Height - 2 * ShadeWidth - iSizeF.Height) / 2);
            //gray 128,128,128
            Rectangle Rect1 = new Rectangle(0, 0, ShadeWidth, Height - ShadeWidth);
            Rectangle Rect2 = new Rectangle(0, 0, Width - ShadeWidth, ShadeWidth);
            Rectangle Rect3 = new Rectangle(Width - 2 * ShadeWidth, 0, ShadeWidth, Height - ShadeWidth);
            Rectangle Rect4 = new Rectangle(0, Height - 2 * ShadeWidth, Width - ShadeWidth, ShadeWidth);
            //white 228,228,228
            Rectangle Rect5 = new Rectangle(ShadeWidth, ShadeWidth, ShadeWidth, Height - 4 * ShadeWidth);
            Rectangle Rect6 = new Rectangle(ShadeWidth, ShadeWidth, Width - 4 * ShadeWidth, ShadeWidth);
            //black 0,0,0
            Rectangle Rect7 = new Rectangle(Width - ShadeWidth, 0, ShadeWidth, Height);
            Rectangle Rect8 = new Rectangle(0, Height - ShadeWidth, Width, ShadeWidth);

            if (!isMouseDown)
            {
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect1);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect2);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect1);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect2);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect3);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect4);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect3);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect4);

                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect5);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect6);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect5);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect6);

                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect7);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect8);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect7);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect8);
            }
            else
            {
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect1);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(0, 0, 0)), Rect2);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect1);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0)), Rect2);

                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect3);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228)), Rect4);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect3);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(228, 228, 228)), Rect4);

                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect5);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect6);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect5);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect6);

                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect7);
                e.Graphics.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128)), Rect8);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect7);
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), Rect8);
            }

        }
        Label Lb = new Label();
        public ButonatedPanel()
            : base()
        {
            Invalidate();
            ShadeWidth = 1;
            Lb.Size = new Size(Width - ShadeWidth * 2, Height - 2 * ShadeWidth);
            Lb.Location = new Point(ShadeWidth, ShadeWidth);
            Lb.Visible = false;
            Controls.Add(Lb);
        }

标签: c#.netcompact-frameworkonmousedown.net-cf-3.5

解决方案


我曾经构建 Wince 应用程序 (CF 3.5),它需要应用程序捕获自定义事件,例如 RFID 卡读取事件。概念是一样的,都是获取控件句柄,使用SetWindowLong使焦点控件通过事件触发获取消息。请记住撤消您对控件所做的属性更改。* 我主要在 Windows Form 上使用它,但它应该适用于 Panel 控件。

public delegate void MouseDownEventHandler(object sender, MouseDownEventArgs e);

public class WndProcTest
{
    [DllImport("coredll.dll", SetLastError = true)]
    private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, WndProcDelegate dwNewLong);

    [DllImport("coredll.dll", SetLastError = true)]
    static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowsName);

    private delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    public event MouseDownEventHandler mouseDownTriggered;

    private WndProcDelegate _newproc;
    private int result;
    private IntPtr _oldproc = IntPtr.Zero;
    internal static IntPtr _hwnd = IntPtr.Zero;

    // Mouse down message value
    const int WM_LBUTTONDOWN = 0x0201;

    // Get window/control handle using name
    public WndProcTest(string windowsName)
    {
        _hwnd = FindWindow(null, windowsName);
    }

    // Initialization to allow a control to receive message
    public void InitWndProcModification()
    {
        _newproc = new WndProcDelegate(MyWndProc);
        _oldproc = GetWindowLong(_hwnd, -4);
        result = SetWindowLong(_hwnd, -4, Marshal.GetFunctionPointerForDelegate(_newproc));
    }

    // Intercept the message
    private IntPtr MyWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
    {
        switch (msg)
        {
            case WM_LBUTTONDOWN:
                MouseDownEventArgs mouseDownEventArgs = new FingerPrintSensorEventArgs();
                OnMouseDownTriggered(mouseDownEventArgs);
                break;

            default:
                break;
        }

        return CallWindowProc(_oldproc, hWnd, msg, wParam, lParam);
    }


    public void RemoveWndProcModification(IntPtr currentHandle)
    {
        result = SetWindowLong(currentHandle, -4, _oldproc);
        _newproc = null;
        _oldproc = IntPtr.Zero;
        _hwnd = IntPtr.Zero;
    }

    // Fire the event
    protected virtual void OnMouseDownTriggered(MouseDownEventArgs e)
    {
        if (mouseDownTriggered != null)
        {
            mouseDownTriggered(this, e);
        }
    }
}

// Event arguments, to pass the X & Y location?
public class MouseDownEventArgs : EventArgs
{

}

// To use the class above 
WndProcTest wp = new WndProcTest("Form1"); 
wp.InitWndProcModification(); 
wp.mouseDownTriggered += ReceivedMsg;

public void ReceivedMsg(Object sender, MouseDownEventArgs e) {   }

推荐阅读