FacePasswordLock.cs 4.8 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Asa.FaceControl
{
    [DefaultProperty("Text")]
    [DefaultEvent("NumberEnter")]
    public partial class FacePasswordLock : ControlBase
    {
        public delegate void NumberEnterHandler(object sender, string text);
        public event NumberEnterHandler NumberEnter;


        private FaceButton[] button;
        private FaceTextBox txtNumber;

        private readonly Dictionary<string, string> buttonKeys;
        private const int SPACE = 6;  //按钮之间的间隔

        public FacePasswordLock()
        {
            InitializeComponent();
            buttonKeys = new()
            {
                { "1", "1" },
                { "2", "2" },
                { "3", "3" },
                { "4", "4" },
                { "5", "5" },
                { "6", "6" },
                { "7", "7" },
                { "8", "8" },
                { "9", "9" },
                { "0", "0" },
                { "←", "{BACKSPACE}" },
                { "Enter", "{ENTER}" }
            };

            button = new FaceButton[12];
            for (int i = 0; i < button.Length; i++)
            {
                button[i] = new() { Text = buttonKeys.ElementAt(i).Key };
                button[i].MouseEnter += FacePasswordLock_MouseEnter;
                button[i].MouseLeave += FacePasswordLock_MouseLeave;
                button[i].Click += NumberButton_Click;
            }
            Controls.AddRange(button);

            txtNumber = new() { Text = "", ShowQuery = false, Location = new Point(BorderWidth + SPACE, BorderWidth + SPACE), Height = 45, ImeMode = ImeMode.Disable, TabIndex = 0 };
            txtNumber.KeyPress += TxtNumber_KeyPress;
            txtNumber.KeyEnterPress += TxtNumber_KeyEnterPress;
            Controls.Add(txtNumber);
            txtNumber.Focus();
        }

        [Browsable(true)]
        public override string Text { get => txtNumber.Text; set => txtNumber.Text = value; }

        public void Clear()
        {
            txtNumber.Text = "";
        }

        private void TxtNumber_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13) return;
            if (e.KeyChar == 8) return;
            if (e.KeyChar >= 48 && e.KeyChar <= 57) return;
            e.Handled = true;
        }

        private void TxtNumber_KeyEnterPress(object sender, EventArgs e)
        {
            NumberEnter?.Invoke(this, txtNumber.Text);
        }

        private void NumberButton_Click(object sender, EventArgs e)
        {
            string key = (sender as FaceButton).Text;
            txtNumber.Focus();
            SendKeys.Send(buttonKeys[key]);
        }

        private void FacePasswordLock_MouseLeave(object sender, EventArgs e)
        {
            borderEnter = false;
            Refresh();
        }

        private void FacePasswordLock_MouseEnter(object sender, EventArgs e)
        {
            borderEnter = true;
            Refresh();
        }

        protected override void CalcSize()
        {
            base.CalcSize();
            if (button == null) return;
            if (txtNumber == null) return;

            txtNumber.Width = Width - (BorderWidth + SPACE) * 2;
            int startPoint = BorderWidth + SPACE;
            int x = startPoint, y = startPoint + txtNumber.Height + SPACE;
            int width = (Width - BorderWidth * 2 - SPACE * 4) / 3;
            int height = (Height - txtNumber.Height - BorderWidth * 2 - SPACE * 6) / 4;



            for (int i = 0; i < button.Length; i++)
            {
                button[i].Left = x;
                button[i].Top = y;
                button[i].Width = width;
                button[i].Height = height;

                x += width + SPACE;
                if ((i + 1) % 3 == 0)
                {
                    x = startPoint;
                    y += height + SPACE;
                }
            }


        }

        protected override void DrawEnabled(Graphics g)
        {
            base.DrawEnabled(g);

            //Pen pen = new(theme.BORDER_LEAVE);
            //SolidBrush brush = new(ForeColor);
            //g.DrawRectangles(pen, buttonRect);
            //for (int i = 0; i < buttonTextRect.Length; i++)
            //    g.DrawString(BUTTON_TEXT[i], Font, brush, buttonTextRect[i]);
        }

        protected override void DrawDisabled(Graphics g)
        {
            base.DrawDisabled(g);
            //Pen pen = new(theme.DISABLED);
            //SolidBrush brush = new(theme.DISABLED);
            //g.DrawRectangles(pen, buttonRect);
            //for (int i = 0; i < buttonTextRect.Length; i++)
            //    g.DrawString(BUTTON_TEXT[i], Font, brush, buttonTextRect[i]);
        }



    }
}