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