You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

343 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Keyboard;
using POSV.MessageEvent;
namespace POSV
{
public partial class SimpleKeyboard : BusinessForm
{
private readonly int defaultWidth;
private readonly int diffWidth;
private readonly bool allowShowSearchBox;
private readonly Action<string> action;
private SimpleKeyboard(Point location ,Size size,bool showSearchBox = false, Action<string> action = null)
{
InitializeComponent();
this.Name = "SimpleKeyboard";
this.allowShowSearchBox = showSearchBox;
this.action = action;
this.txtSearch.Multiline = false;
this.topPanel.Visible = this.allowShowSearchBox;
this.WindowState = FormWindowState.Normal;
this.StartPosition = FormStartPosition.Manual;
if (location != null && !location.IsEmpty)
{
this.Location = new Point(location.X,location.Y);
}
if (size != null && !size.IsEmpty)
{
this.Size = new Size(size.Width,size.Height);
}
this.defaultWidth = this.Width / 10;
this.diffWidth = (this.Width - this.defaultWidth * 10);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.keyboardControl.Renderer = new SearchRenderer();
this.keyboardControl.Keyboard = CreateDefaultKeyboard();
}
public static void ShowKeyboard(IWin32Window owner , Point location , Size size , bool showSearchBox = false, Action<string> action = null)
{
var form = Application.OpenForms["SimpleKeyboard"];
if(form == null)
{
form = new SimpleKeyboard(location , size , showSearchBox , action);
form.Show(owner);
}
}
public static bool Showing()
{
var form = Application.OpenForms["SimpleKeyboard"];
return form != null;
}
public static void CloseKeyboard()
{
var form = Application.OpenForms["SimpleKeyboard"];
if (form != null)
{
form.Close();
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
e.Cancel = false;
}
#region Window activation handling
private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATE = 0x0003;
private const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams
{
get
{
if (this.allowShowSearchBox)
{
return base.CreateParams;
}
else
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle = createParams.ExStyle & WS_EX_NOACTIVATE;
return createParams;
}
}
}
protected override void WndProc(ref Message m)
{
// This prevents the window from being activated with the mouse,
// but allows the window to be resized (with the mouse).
if (m.Msg == WM_MOUSEACTIVATE)
{
m.Result = (IntPtr)MA_NOACTIVATE;
}
else
{
base.WndProc(ref m);
}
}
protected override void OnActivated(EventArgs e)
{
if (!this.allowShowSearchBox)
{
Owner.Activate();
}
else
{
this.Activate();
}
}
#endregion
private Keyboard CreateDefaultKeyboard()
{
Keyboard keyboard = new Keyboard();
LinearKeyboardLayout layout = new LinearKeyboardLayout();
layout.AddKey("1" , width: defaultWidth);
layout.AddKey("2" , width: defaultWidth);
layout.AddKey("3" , width: defaultWidth);
layout.AddKey("4" , width: defaultWidth);
layout.AddKey("5" , width: defaultWidth);
layout.AddKey("6" , width: defaultWidth);
layout.AddKey("7" , width: defaultWidth);
layout.AddKey("8" , width: defaultWidth);
layout.AddKey("9" , width: defaultWidth);
layout.AddKey("0" , width: defaultWidth + diffWidth);
layout.AddLine();
layout.AddKey("Q" , width: defaultWidth);
layout.AddKey("W" , width: defaultWidth);
layout.AddKey("E" , width: defaultWidth);
layout.AddKey("R" , width: defaultWidth);
layout.AddKey("T" , width: defaultWidth);
layout.AddKey("Y" , width: defaultWidth);
layout.AddKey("U" , width: defaultWidth);
layout.AddKey("I" , width: defaultWidth);
layout.AddKey("O" , width: defaultWidth);
layout.AddKey("P" , width: defaultWidth + diffWidth);
layout.AddLine();
layout.AddKey("A" , width: defaultWidth);
layout.AddKey("S" , width: defaultWidth);
layout.AddKey("D" , width: defaultWidth);
layout.AddKey("F" , width: defaultWidth);
layout.AddKey("G" , width: defaultWidth);
layout.AddKey("H" , width: defaultWidth);
layout.AddKey("J" , width: defaultWidth);
layout.AddKey("K" , width: defaultWidth);
layout.AddKey("L" , width: defaultWidth);
layout.AddKey("回车" , info: "{ENTER}" , width: defaultWidth + diffWidth , height: 21);
layout.AddLine();
layout.AddKey("Z" , width: defaultWidth);
layout.AddKey("X" , width: defaultWidth);
layout.AddKey("C" , width: defaultWidth);
layout.AddKey("V" , width: defaultWidth);
layout.AddKey("B" , width: defaultWidth);
layout.AddKey("N" , width: defaultWidth);
layout.AddKey("M" , width: defaultWidth);
layout.AddKey("退格" , info: "{BACKSPACE}" , width: defaultWidth * 2);
keyboard.Layouts.Add(layout);
return keyboard;
}
private void OnSearchTextChanged(object sender , EventArgs e)
{
if(this.allowShowSearchBox && this.action != null)
{
this.action(this.txtSearch.Text.Trim());
}
}
protected override bool ProcessCmdKey(ref Message msg , Keys keyData)
{
switch (keyData)
{
case Keys.Escape:
{
this.Close();
}
break;
case Keys.Right:
{
MsgEvent.Send(Constant.PRODUCT_KEYBOARD_NOTIFY , KeyboardAction.Right);
}
break;
case Keys.Left:
{
MsgEvent.Send(Constant.PRODUCT_KEYBOARD_NOTIFY , KeyboardAction.Left);
}
break;
case Keys.Up:
{
MsgEvent.Send(Constant.PRODUCT_KEYBOARD_NOTIFY , KeyboardAction.Up);
}
break;
case Keys.Down:
{
MsgEvent.Send(Constant.PRODUCT_KEYBOARD_NOTIFY , KeyboardAction.Down);
}
break;
case Keys.Enter:
{
}
break;
}
return base.ProcessCmdKey(ref msg , keyData);
}
private void OnSendingKey(object sender, KeyboardKeyCancelEventArgs e)
{
this.txtSearch.Focus();
}
private void OnSearchEnterClick(object sender , Component.EnterEventArg e)
{
this.action("Enter");
this.txtSearch.Text = string.Empty;
this.txtSearch.Focus();
}
}
public class SearchRenderer : Renderer
{
private Font _font = new Font("宋体" , 15 , FontStyle.Bold);
private StringFormat _format;
public SearchRenderer()
{
_format = (StringFormat)StringFormat.GenericDefault.Clone();
_format.LineAlignment = StringAlignment.Center;
_format.Alignment = StringAlignment.Center;
}
public override void DrawBackground(BackgroundRendererEventArgs args)
{
using (var brush = new SolidBrush(Color.White))
{
args.Graphics.FillRectangle(brush , args.Bounds);
}
}
public override void DrawCloseButton(CloseButtonRendererEventArgs args)
{
}
public override void DrawKey(KeyRendererEventArgs args)
{
Rectangle keyBounds = args.Bounds;
if (args.IsDown || args.Key.Style == KeyStyle.Pressed)
{
using (var brush = new SolidBrush(Color.Moccasin))
{
args.Graphics.FillRectangle(brush , keyBounds);
}
using (var brush = new SolidBrush(Color.Black))
{
args.Graphics.DrawString(args.Key.Caption , _font , brush , keyBounds , _format);
}
}
else
{
using (var brush = new SolidBrush(Color.Tan))
{
args.Graphics.FillRectangle(brush , keyBounds);
}
using (var brush = new SolidBrush(Color.Black))
{
args.Graphics.DrawString(args.Key.Caption , _font , brush , keyBounds , _format);
}
}
}
public override void DrawTopBar(TopBarRendererEventArgs args)
{
args.Graphics.DrawString(args.Text , _font , ColorTable.TopBarTextBrush , args.Bounds);
}
}
}