C # .NET Compact Framework, проблема с событием mousedown, используя сенсорный экран - PullRequest
0 голосов
/ 02 мая 2019

В настоящее время я занимаюсь разработкой программного обеспечения для интеллектуального устройства с использованием Visual Studio 2008, C #. Устройство имеет сенсорный экран в качестве метода ввода. Я не могу использовать MouseDown событие. Я создал пользовательскую кнопку, унаследованную от System.Windows.Forms.Button класса.

Попытка переопределить OnMouseDown и OnMouseUp события. Но эти события не стреляют. Я искал в интернете и нашел решение с WndProc, но его не удалось использовать с .NET Compact Framework.

Пожалуйста, помогите мне с этим. Спасибо всем. Пример кода очень прост, и вы можете найти его ниже.

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

Edit:

Как я уже упоминал в своем комментарии к @josef ниже, я создал свой собственный элемент управления. Элемент управления представляет собой панель из бутонов. Во-первых, я попытался добавить метку для текста кнопки, на самом деле нет необходимости делать это. Это можно легко сделать с помощью метода переопределения события OnPaint. Этот элемент управления может иметь некоторые ненужные коды, но вы можете оптимизировать его. Если вам это нужно, вы можете найти мое решение ниже:

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

1 Ответ

0 голосов
/ 24 июня 2019

Я использовал для создания приложения Wince (CF 3.5), которое требовало, чтобы приложение захватывало пользовательское событие, такое как событие чтения карты RFID.Идея та же: получить дескриптор элемента управления. Используйте SetWindowLong, чтобы позволить сфокусированному элементу управления получить сообщение с помощью инициируемого события.Просто не забудьте отменить изменение атрибута, которое вы сделали для элемента управления.* Я в основном использовал его в Windows Form, но он должен работать для панели управления.

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) {   }
...