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.

406 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using NLog;
using POS.Language.Language;
using POSV.Bean;
using POSV.Entity;
using POSV.MessageEvent;
using POSV.Utils;
namespace POSV
{
public partial class BaseForm : Form
{
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
private static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll")]
private static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);
private readonly Logger _logger = null;
public BaseForm()
{
InitializeComponent();
_logger = NLog.LogManager.GetLogger(GetType().FullName);
//减少闪烁
SetStyles();
this.BackColor = Constant.DefaultBackColor;
this.ImeMode = ImeMode.Disable;
}
#region 减少闪烁
private void SetStyles()
{
SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.DoubleBuffer, true);
//强制分配样式重新应用到控件上
UpdateStyles();
base.AutoScaleMode = AutoScaleMode.None;
}
#endregion
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//网络连接通知事件
MsgEvent.Receive(Constant.NETWORK_EVENT_NOTIFY, NetworkEventNotify);
}
protected virtual void NetworkEventNotify(object sender, MsgEventArgs args)
{
bool isConnected = Convert.ToBoolean(args.Data);
Global.Instance.Online = isConnected;
LOGGER.Debug("检测网络连接状态<{0}>", isConnected);
}
protected virtual void OnInputGotFocus(object sender, EventArgs e)
{
//触摸屏模式下自动关闭虚拟键盘
IntPtr hwnd = WindowsAPI.FindWindow("IPTip_Main_Window", null);
if (hwnd != IntPtr.Zero)
{
WindowsAPI.SendMessage(hwnd, WindowsAPI.WM_SYSCOMMAND, WindowsAPI.SC_CLOSE, 0);
}
}
protected Logger LOGGER
{
get { return _logger; }
}
protected Font GetSystemFont(SystemFont fontSize)
{
Font result = Constant.DEFAULT_FONT;
switch (fontSize)
{
case SystemFont.:
{
result = Constant.DEFAULT_FONT;
}
break;
case SystemFont.:
{
result = Constant.NORMAL_FONT;
}
break;
case SystemFont.:
{
result = Constant.SMALL_FONT;
}
break;
case SystemFont.:
{
result = Constant.BIG_FONT;
}
break;
}
return result;
}
protected void ShowToastNotify(Control ctl, string msg, int duration)
{
if (this.IsDisposed || !this.IsHandleCreated) return;
this.Invoke(new Action(() =>
{
ToastNotification.DefaultToastPosition = eToastPosition.MiddleCenter;
ToastNotification.ToastFont = Constant.BIG_BIG_FONT;
ToastNotification.CustomGlowColor = Color.Transparent;
ToastNotification.ToastBackColor = Color.Black;
ToastNotification.DefaultTimeoutInterval = duration;
ToastNotification.Close(ctl);//关闭所有toast
ToastNotification.Show(ctl, msg);
}));
}
protected void ShowToastNotify(Control ctl, string msg)
{
ShowToastNotify(ctl, msg, 2000);
}
protected void SetF(IntPtr handle)
{
if (handle == GetForegroundWindow())
{
return;
}
IntPtr ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
IntPtr ThreadID2 = GetWindowThreadProcessId(handle, IntPtr.Zero);
if (ThreadID1 != ThreadID2)
{
AttachThreadInput(ThreadID1, ThreadID2, 1);
SetForegroundWindow(handle);
AttachThreadInput(ThreadID1, ThreadID2, 0);
}
else
{
SetForegroundWindow(handle);
}
}
protected void ShowMessage(LabelX label, string message)
{
LOGGER.Debug(message);
this.Invoke(new Action(() =>
{
label.Symbol = "\uf05a";
label.SymbolColor = Color.RoyalBlue;
label.ForeColor = SystemColors.ControlText;
label.Text = message;
label.Refresh();
}));
}
protected void ShowMessage(LabelX label, string message, bool error)
{
LOGGER.Debug(message);
this.Invoke(new Action(() =>
{
label.Symbol = "\uf05a";
label.SymbolColor = Color.RoyalBlue;
label.ForeColor = SystemColors.ControlText;
if (error)
{
label.Symbol = "\uf05c";
label.SymbolColor = Color.Red;
label.ForeColor = Color.Red;
}
label.Text = LangProxy.ToLang(message);
label.Refresh();
}));
}
private List<ScreenInformation> m_Screens = new List<ScreenInformation>(2);
protected ScreenInformation PrimaryScreen
{
get
{
if (m_Screens.Count == 0)
RefreshScreens();
foreach (ScreenInformation s in m_Screens)
{
if (s.Primary)
return s;
}
if (m_Screens.Count > 0)
return m_Screens[0];
return new ScreenInformation(new Rectangle(0, 0, 1024, 768), new Rectangle(0, 0, 1024, 768), true);
}
}
protected void RefreshScreens()
{
m_Screens.Clear();
foreach (System.Windows.Forms.Screen s in System.Windows.Forms.Screen.AllScreens)
m_Screens.Add(new ScreenInformation(s.Bounds, s.WorkingArea, s.Primary));
}
protected ScreenInformation ScreenFromControl(System.Windows.Forms.Control control)
{
Rectangle r;
if (control.Parent != null)
{
Point screenLocation = control.PointToScreen(Point.Empty);
r = new Rectangle(screenLocation, control.Size);
}
else
r = new Rectangle(control.Location, control.Size);
if (m_Screens.Count == 0)
RefreshScreens();
foreach (ScreenInformation s in m_Screens)
{
if (s.Bounds.Contains(r))
{
return s;
}
}
System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.FromControl(control);
if (scr != null)
return new ScreenInformation(scr.Bounds, scr.WorkingArea);
return null;
}
protected ScreenInformation ScreenFromPoint(Point pScreen)
{
if (m_Screens.Count == 0)
RefreshScreens();
foreach (ScreenInformation s in m_Screens)
{
if (s.Bounds.Contains(pScreen))
{
return s;
}
}
System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.FromPoint(pScreen);
if (scr != null && scr.Bounds.Contains(pScreen))
return new ScreenInformation(scr.Bounds, scr.WorkingArea);
return null;
}
public event TransparentEventHandler AcceptButtonClick;
protected virtual void OnAcceptButtonClick(TransparentEventArgs e)
{
AcceptButtonClick?.Invoke(this, e);
}
public event TransparentEventHandler CancelButtonClick;
protected virtual void OnCancelButtonClick(TransparentEventArgs e)
{
CancelButtonClick?.Invoke(this, e);
}
}
public delegate void TransparentEventHandler(object sender, TransparentEventArgs e);
public enum TransparentAction
{
None = 0,
Cancel = 1,
Accept = 2,
Replace = 3
}
public class TransparentEventArgs : EventArgs
{
private readonly TransparentAction _action;
private readonly string _keyCode;
private readonly object _data;
public Tuple<decimal, decimal, List<string>, Worker> Authz;
public TransparentEventArgs(TransparentAction action, string keyCode, object data) : this(action, keyCode, data, null)
{
}
public TransparentEventArgs(TransparentAction action, string keyCode, object data, Tuple<decimal, decimal, List<string>, Worker> authz = null)
{
this._keyCode = keyCode;
this._data = data;
this._action = action;
this.Authz = authz;
}
public TransparentAction Action
{
get
{
return this._action;
}
}
public object Data
{
get
{
return this._data;
}
}
public string KeyCode
{
get
{
return this._keyCode;
}
}
}
public class ScreenInformation
{
public Rectangle Bounds = Rectangle.Empty;
public Rectangle WorkingArea = Rectangle.Empty;
public bool Primary = false;
public ScreenInformation(Rectangle bounds, Rectangle workingarea)
{
this.Bounds = bounds;
this.WorkingArea = workingarea;
}
public ScreenInformation(Rectangle bounds, Rectangle workingarea, bool primary)
{
this.Bounds = bounds;
this.WorkingArea = workingarea;
this.Primary = primary;
}
}
public static class ShowInTaskBar
{
[DllImport("User32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("User32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_HIDE = 0x00;
private const int SW_SHOW = 0x05;
private const int WS_EX_APPWINDOW = 0x40000;
private const int GWL_EXSTYLE = -0x14;
public static void ShowWindowInTaskbar(IntPtr pMainWindow)
{
SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow, GWL_EXSTYLE) | WS_EX_APPWINDOW);
ShowWindow(pMainWindow, SW_HIDE);
ShowWindow(pMainWindow, SW_SHOW);
}
public static void HideWindowFromTaskbar(IntPtr pMainWindow)
{
SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow, GWL_EXSTYLE) | ~WS_EX_APPWINDOW);
ShowWindow(pMainWindow, SW_HIDE);
ShowWindow(pMainWindow, SW_SHOW);
}
}
}