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.

323 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Controls;
using DevComponents.DotNetBar.Keyboard;
using POSV.MessageEvent;
using POSV.Utils;
namespace POSV
{
public partial class VirtualKeyboard : BusinessForm
{
private KeyboardType _defaultKeyboardType = KeyboardType.;
public VirtualKeyboard(KeyboardType keyboardType)
{
InitializeComponent();
//订购界面变更通知事件
MsgEvent.RemoveListener(Constant.KEYBOARD_CHANGED_NOTIFY , this.KeyboardChangedEventNotify);
MsgEvent.Receive(Constant.KEYBOARD_CHANGED_NOTIFY , this.KeyboardChangedEventNotify);
this._defaultKeyboardType = keyboardType;
}
protected void KeyboardChangedEventNotify(object sender , MsgEventArgs args)
{
this.Invoke(new Action(() => {
this._defaultKeyboardType = (KeyboardType)args.Data;
switch (this._defaultKeyboardType)
{
case KeyboardType.:
{
this.chkEnglish.Checked = true;
}
break;
case KeyboardType.:
{
this.chkChinese.Checked = true;
}
break;
case KeyboardType.:
{
this.chkNumber.Checked = true;
}
break;
}
}));
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.WindowState = FormWindowState.Normal;
this.StartPosition = FormStartPosition.Manual;
this.keyboardControl.Renderer = new ThreeDRenderer();
this.keyboardControl.TouchEnabled = true;
//标题拖动事件
this.topPanel.MouseDown += OnTitleMouseDown;
switch (this._defaultKeyboardType)
{
case KeyboardType.:
{
this.chkEnglish.Checked = true;
}
break;
case KeyboardType.:
{
this.chkChinese.Checked = true;
}
break;
case KeyboardType.:
{
this.chkNumber.Checked = true;
}
break;
}
this.Activate();
}
private void OnTitleMouseDown(object sender , MouseEventArgs e)
{
WindowsAPI.MoveWindows(this.Handle);
Owner.Activate();
}
#region Window activation handling
private const int WM_MOUSEACTIVATE = 0x0021;
private const int MA_NOACTIVATE = 0x0003;
private const int WS_EX_NOACTIVATE = 0x08000000;
// Override CreateParams to specify that this Form should not be activated.
protected override CreateParams CreateParams
{
get
{
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)
{
Owner.Activate();
}
#endregion
private void OnCloseClick(object sender , EventArgs e)
{
this.Hide();
}
public void ShowVirtualKeyboard(IWin32Window owner, KeyboardType keyboardType)
{
this.Hide();
this.Show(owner);
MsgEvent.Send(Constant.KEYBOARD_CHANGED_NOTIFY , keyboardType);
}
private void KeyboardChanged(object sender , EventArgs e)
{
var item = sender as CheckBoxX;
if (item.Checked)
{
KeyboardType type = KeyboardType.;
Enum.TryParse<KeyboardType>(item.Tag.ToString() , out type);
switch (type)
{
case KeyboardType.:
{
this.lblInputLanguage.Visible = true;
var lang = InputLanguage.FromCulture(CultureInfo.GetCultureInfo("zh-CN"));
InputLanguage.CurrentInputLanguage = lang;
this.keyboardControl.Keyboard = Keyboard.CreateDefaultKeyboard();
}
break;
case KeyboardType.:
{
this.lblInputLanguage.Visible = false;
var lang = InputLanguage.FromCulture(CultureInfo.GetCultureInfo("en-US"));
InputLanguage.CurrentInputLanguage = lang;
this.keyboardControl.Keyboard = Keyboard.CreateDefaultKeyboard();
}
break;
case KeyboardType.:
{
this.lblInputLanguage.Visible = false;
this.keyboardControl.Keyboard = CreateNumericKeyboard();
}
break;
}
}
this.keyboardControl.Invalidate();
this.Owner.Activate();
}
private Keyboard CreateNumericKeyboard()
{
Keyboard keyboard = new Keyboard();
LinearKeyboardLayout layout = new LinearKeyboardLayout();
layout.AddKey("7");
layout.AddKey("8");
layout.AddKey("9");
layout.AddKey("Backspace" , "{BACKSPACE}" , height: 21);
layout.AddLine();
layout.AddKey("4");
layout.AddKey("5");
layout.AddKey("6");
layout.AddLine();
layout.AddKey("1");
layout.AddKey("2");
layout.AddKey("3");
layout.AddKey("Enter" , "{ENTER}" , height: 21);
layout.AddLine();
layout.AddKey("0" , width: 21);
layout.AddKey(".");
keyboard.Layouts.Add(layout);
return keyboard;
}
private void OnChangedLanguage(object sender , EventArgs e)
{
InputSimulatorUtils.SendCtrlShift();
}
}
public class ThreeDRenderer : Renderer
{
private Font _Font = new Font("Segoe UI" , 11 , FontStyle.Bold);
private StringFormat _Format;
/// <summary>
/// Initializes a new instance of the ThreeDRenderer class.
/// </summary>
public ThreeDRenderer()
{
_Format = (StringFormat)StringFormat.GenericDefault.Clone();
_Format.LineAlignment = StringAlignment.Center;
_Format.Alignment = StringAlignment.Center;
}
public override void DrawBackground(BackgroundRendererEventArgs args)
{
//
using (TextureBrush brush = new TextureBrush(global::POSV.Properties.Resources.fiber))
{
brush.WrapMode = System.Drawing.Drawing2D.WrapMode.Tile;
args.Graphics.FillRectangle(brush , args.Bounds);
}
}
public override void DrawKey(KeyRendererEventArgs args)
{
Rectangle keyBounds = args.Bounds;
args.Graphics.FillRectangle(ColorTable.KeysBrush , keyBounds);
if (args.IsDown || args.Key.Style == KeyStyle.Pressed || args.Key.Style == KeyStyle.Toggled)
{
Draw3DBorder(args.Graphics , keyBounds , ColorTable.DarkKeysBrush , ColorTable.LightKeysBrush);
keyBounds.Offset(1 , 1);
if (args.Key.Style == KeyStyle.Toggled)
args.Graphics.DrawString(args.Key.Caption , _Font , ColorTable.ToggleTextBrush , keyBounds , _Format);
else
args.Graphics.DrawString(args.Key.Caption , _Font , ColorTable.TextBrush , keyBounds , _Format);
}
else
{
Draw3DBorder(args.Graphics , keyBounds , ColorTable.LightKeysBrush , ColorTable.DarkKeysBrush);
args.Graphics.DrawString(args.Key.Caption , _Font , ColorTable.TextBrush , keyBounds , _Format);
}
}
public override void DrawTopBar(TopBarRendererEventArgs args)
{
args.Graphics.DrawString(args.Text , _Font , ColorTable.TopBarTextBrush , args.Bounds);
}
public override void DrawCloseButton(CloseButtonRendererEventArgs args)
{
if (args.IsDown)
Draw3DBorder(args.Graphics , args.Bounds , ColorTable.DarkKeysBrush , ColorTable.LightKeysBrush);
else
Draw3DBorder(args.Graphics , args.Bounds , ColorTable.LightKeysBrush , ColorTable.DarkKeysBrush);
Rectangle rect = args.Bounds;
rect.Inflate(-5 , -5);
using (Pen p = new Pen(ColorTable.TextBrush , 2))
{
args.Graphics.DrawLine(p , rect.Left , rect.Top , rect.Right , rect.Bottom);
args.Graphics.DrawLine(p , rect.Left , rect.Bottom , rect.Right , rect.Top);
}
}
private static void Draw3DBorder(Graphics g , Rectangle bounds , Brush light , Brush dark)
{
int borderSize = 1;
g.FillRectangle(light , new Rectangle(bounds.Left , bounds.Top , bounds.Width , borderSize));
g.FillRectangle(light , new Rectangle(bounds.Left , bounds.Top , borderSize , bounds.Height));
g.FillRectangle(dark , new Rectangle(bounds.Left , bounds.Bottom - borderSize , bounds.Width , borderSize));
g.FillRectangle(dark , new Rectangle(bounds.Right - borderSize , bounds.Top , borderSize , bounds.Height));
}
}
}