123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182 |
- using PaintDotNet.Base.CommTool;
- using PaintDotNet.Base.Functionodel;
- using PaintDotNet.SystemLayer;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.IO;
- using System.Resources;
- using System.Threading;
- using System.Windows.Forms;
- namespace PaintDotNet
- {
- /// <summary>
- /// This Form class is used to fix a few bugs in Windows Forms, and to add a few performance
- /// enhancements, such as disabling opacity != 1.0 when running in a remote TS/RD session.
- /// We derive from this class instead of Windows.Forms.Form directly.
- /// </summary>
- public class PdnBaseForm : Form, ISnapManagerHost
- {
- public static string xmlPath = "";
- static PdnBaseForm()
- {
- Application.EnterThreadModal += new EventHandler(Application_EnterThreadModal);
- Application.LeaveThreadModal += new EventHandler(Application_LeaveThreadModal);
- Application_EnterThreadModal(null, EventArgs.Empty);
- }
- // This set keeps track of forms which cannot be the current modal form.
- private static Stack<List<Form>> parentModalForms = new Stack<List<Form>>();
- private static bool IsInParentModalForms(Form form)
- {
- foreach (List<Form> formList in parentModalForms)
- {
- foreach (Form parentModalForm in formList)
- {
- if (parentModalForm == form)
- {
- return true;
- }
- }
- }
- return false;
- }
- private static List<Form> GetAllPeerForms(Form form)
- {
- if (form == null)
- {
- return new List<Form>();
- }
- if (form.Owner != null)
- {
- return GetAllPeerForms(form.Owner);
- }
- List<Form> forms = new List<Form>();
- forms.Add(form);
- forms.AddRange(form.OwnedForms);
- return forms;
- }
- private static void Application_EnterThreadModal(object sender, EventArgs e)
- {
- Form activeForm = Form.ActiveForm;
- List<Form> allPeerForms = GetAllPeerForms(activeForm);
- parentModalForms.Push(allPeerForms);
- }
- private static void Application_LeaveThreadModal(object sender, EventArgs e)
- {
- parentModalForms.Pop();
- }
- protected override void OnShown(EventArgs e)
- {
- isShown = true;
- Tracing.LogFeature("ShowDialog(" + GetType().FullName + ")");
- base.OnShown(e);
- }
- public bool IsShown
- {
- get
- {
- return this.isShown;
- }
- }
- private bool isShown = false;
- private bool enableOpacity = true;
- private double ourOpacity = 1.0; // store opacity setting so that when we go from disabled->enabled opacity we can set the correct value
- private SnapManager snapManager = null;
- private System.ComponentModel.IContainer components;
- private bool instanceEnableOpacity = true;
- private static bool globalEnableOpacity = true;
- private FormEx formEx;
- private bool processFormHotKeyMutex = false; // if we're already processing a form hotkey, don't let other hotkeys execute.
- private static Dictionary<Keys, Function<bool, Keys>> hotkeyRegistrar = null;
- /// <summary>
- /// 分析设置存储信息
- /// </summary>
- protected AnalyzeSettingModel analyzeSettingModel;
- public AnalyzeSettingModel AnalyzeSettingModel
- {
- get
- {
- return this.analyzeSettingModel;
- }
- set
- {
- this.analyzeSettingModel = value;
- }
- }
- /// <summary>
- /// Registers a form-wide hot key, and a callback for when the key is pressed.
- /// The callback must be an instance method on a Control. Whatever Form the Control
- /// is on will process the hotkey, as long as the Form is derived from PdnBaseForm.
- /// </summary>
- public static void RegisterFormHotKey(Keys keys, Function<bool, Keys> callback)
- {
- IComponent targetAsComponent = callback.Target as IComponent;
- IHotKeyTarget targetAsHotKeyTarget = callback.Target as IHotKeyTarget;
- if (targetAsComponent == null && targetAsHotKeyTarget == null)
- {
- throw new ArgumentException("target instance must implement IComponent or IHotKeyTarget", "callback");
- }
- if (hotkeyRegistrar == null)
- {
- hotkeyRegistrar = new Dictionary<Keys, Function<bool, Keys>>();
- }
- Function<bool, Keys> theDelegate = null;
- if (hotkeyRegistrar.ContainsKey(keys))
- {
- theDelegate = hotkeyRegistrar[keys];
- theDelegate += callback;
- hotkeyRegistrar[keys] = theDelegate;
- }
- else
- {
- theDelegate = new Function<bool, Keys>(callback);
- hotkeyRegistrar.Add(keys, theDelegate);
- }
- if (targetAsComponent != null)
- {
- targetAsComponent.Disposed += TargetAsComponent_Disposed;
- }
- else
- {
- targetAsHotKeyTarget.Disposed += TargetAsHotKeyTarget_Disposed;
- }
- }
- private bool ShouldProcessHotKey(Keys keys)
- {
- Keys keyOnly = keys & ~Keys.Modifiers;
- if (keyOnly == Keys.Back ||
- keyOnly == Keys.Delete ||
- keyOnly == Keys.Left ||
- keyOnly == Keys.Right ||
- keyOnly == Keys.Up ||
- keyOnly == Keys.Down ||
- keys == (Keys.Control | Keys.A) || // select all
- keys == (Keys.Control | Keys.Z) || // undo
- keys == (Keys.Control | Keys.Y) || // redo
- keys == (Keys.Control | Keys.X) || // cut
- keys == (Keys.Control | Keys.C) || // copy
- keys == (Keys.Control | Keys.V) || // paste
- keys == (Keys.Shift | Keys.Delete) || // cut (left-handed)
- keys == (Keys.Control | Keys.Insert) || // copy (left-handed)
- keys == (Keys.Shift | Keys.Insert) // paste (left-handed)
- )
- {
- Control focused = Utility.FindFocus();
- if (focused is TextBox || focused is ComboBox || focused is UpDownBase)
- {
- return false;
- }
- }
- return true;
- }
- private static void TargetAsComponent_Disposed(object sender, EventArgs e)
- {
- ((IComponent)sender).Disposed -= TargetAsComponent_Disposed;
- RemoveDisposedTarget(sender);
- }
- private static void TargetAsHotKeyTarget_Disposed(object sender, EventArgs e)
- {
- ((IHotKeyTarget)sender).Disposed -= TargetAsHotKeyTarget_Disposed;
- RemoveDisposedTarget(sender);
- }
- static void RemoveDisposedTarget(object sender)
- {
- // Control was disposed, but it never unregistered for its hotkeys!
- List<Keys> keysList = new List<Keys>(hotkeyRegistrar.Keys);
- foreach (Keys keys in keysList)
- {
- Function<bool, Keys> theMultiDelegate = hotkeyRegistrar[keys];
- foreach (Delegate theDelegate in theMultiDelegate.GetInvocationList())
- {
- if (object.ReferenceEquals(theDelegate.Target, sender))
- {
- UnregisterFormHotKey(keys, (Function<bool, Keys>)theDelegate);
- }
- }
- }
- }
- public static void UnregisterFormHotKey(Keys keys, Function<bool, Keys> callback)
- {
- if (hotkeyRegistrar != null)
- {
- //Function<bool, Keys> theDelegate = hotkeyRegistrar[keys];
- //theDelegate -= callback;
- //hotkeyRegistrar[keys] = theDelegate;
- IComponent targetAsComponent = callback.Target as IComponent;
- if (targetAsComponent != null)
- {
- targetAsComponent.Disposed -= TargetAsComponent_Disposed;
- }
- IHotKeyTarget targetAsHotKeyTarget = callback.Target as IHotKeyTarget;
- if (targetAsHotKeyTarget != null)
- {
- targetAsHotKeyTarget.Disposed -= TargetAsHotKeyTarget_Disposed;
- }
- if (hotkeyRegistrar.ContainsKey(keys)/*theDelegate.GetInvocationList().Length == 0*/)
- {
- Function<bool, Keys> theDelegate = hotkeyRegistrar[keys];
- theDelegate -= callback;
- hotkeyRegistrar.Remove(keys);
- }
- if (hotkeyRegistrar.Count == 0)
- {
- hotkeyRegistrar = null;
- }
- }
- }
- public void Flash()
- {
- UI.FlashForm(this);
- }
- public void RestoreWindow()
- {
- if (WindowState == FormWindowState.Minimized)
- {
- UI.RestoreWindow(this);
- }
- }
- /// <summary>
- /// Returns the currently active modal form if the process is in the foreground and is active.
- /// </summary>
- /// <remarks>
- /// If Form.ActiveForm is modeless, we search up the chain of owner forms
- /// to find its modeless owner form.
- /// </remarks>
- public static Form CurrentModalForm
- {
- get
- {
- Form theForm = Form.ActiveForm;
- while (theForm != null && !theForm.Modal && theForm.Owner != null)
- {
- theForm = theForm.Owner;
- }
- return theForm;
- }
- }
- /// <summary>
- /// Gets whether the current form is the processes' top level modal form.
- /// </summary>
- public bool IsCurrentModalForm
- {
- get
- {
- if (IsInParentModalForms(this))
- {
- return false;
- }
- if (this.ContainsFocus)
- {
- return true;
- }
- foreach (Form ownedForm in this.OwnedForms)
- {
- if (ownedForm.ContainsFocus)
- {
- return true;
- }
- }
- return (this == CurrentModalForm);
- }
- }
- private bool IsTargetFormActive(object target)
- {
- Control targetControl = null;
- if (targetControl == null)
- {
- Control asControl = target as Control;
- if (asControl != null)
- {
- targetControl = asControl;
- }
- }
- if (targetControl == null)
- {
- IFormAssociate asIFormAssociate = target as IFormAssociate;
- if (asIFormAssociate != null)
- {
- targetControl = asIFormAssociate.AssociatedForm;
- }
- }
- // target is not a control, or a type of non-control that we recognize as hosted by a control
- if (targetControl == null)
- {
- return false;
- }
- Form targetForm = targetControl.FindForm();
- // target is not on a form
- if (targetForm == null)
- {
- return false;
- }
- // is the target on the currently active form?
- Form activeModalForm = CurrentModalForm;
- if (targetForm == activeModalForm)
- {
- return true;
- }
- // Nope.
- return false;
- }
- private static object GetConcreteTarget(object target)
- {
- Delegate asDelegate = target as Delegate;
- if (asDelegate == null)
- {
- return target;
- }
- else
- {
- return GetConcreteTarget(asDelegate.Target);
- }
- }
- protected virtual bool ProcessFormHotKey(Keys keyData)
- {
- bool processed = false;
- if (this.processFormHotKeyMutex)
- {
- processed = true;
- }
- else
- {
- this.processFormHotKeyMutex = true;
- try
- {
- if (hotkeyRegistrar != null && hotkeyRegistrar.ContainsKey(keyData))
- {
- Function<bool, Keys> theDelegate = hotkeyRegistrar[keyData];
- Delegate[] invokeList = theDelegate.GetInvocationList();
- for (int i = invokeList.Length - 1; i >= 0; --i)
- {
- Function<bool, Keys> invokeMe = (Function<bool, Keys>)invokeList[i];
- object concreteTarget = GetConcreteTarget(invokeMe.Target);
- if (IsTargetFormActive(concreteTarget))
- {
- bool result = invokeMe(keyData);
- if (result)
- {
- // The callback handled the key.
- processed = false;
- break;
- }
- }
- }
- }
- }
- finally
- {
- this.processFormHotKeyMutex = false;
- }
- }
- return processed;
- }
- private void OnProcessCmdKeyRelay(object sender, FormEx.ProcessCmdKeyEventArgs e)
- {
- bool handled = e.Handled;
- if (!handled)
- {
- handled = ProcessCmdKeyData(e.KeyData);
- e.Handled = handled;
- }
- }
- public bool RelayProcessCmdKey(ref Message msg, Keys keyData)
- {
- return ProcessCmdKeyData(keyData);
- }
- protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
- {
- bool processed = ProcessCmdKeyData(keyData);
- if (!processed)
- {
- processed = base.ProcessCmdKey(ref msg, keyData);
- }
- return processed;
- }
- private bool ProcessCmdKeyData(Keys keyData)
- {
- bool shouldHandle = ShouldProcessHotKey(keyData);
- if (shouldHandle)
- {
- bool processed = ProcessFormHotKey(keyData);
- return processed;
- }
- else
- {
- return false;
- }
- }
- public static void UpdateAllForms()
- {
- try
- {
- foreach (Form form in Application.OpenForms)
- {
- try
- {
- form.Update();
- }
- catch (Exception)
- {
- }
- }
- }
- catch (InvalidOperationException)
- {
- }
- }
- /*protected override void OnHelpRequested(HelpEventArgs hevent)
- {
- if (!hevent.Handled)
- {
- Utility.ShowHelp(this);
- hevent.Handled = true;
- }
- base.OnHelpRequested(hevent);
- }*/
- public static EventHandler EnableOpacityChanged;
- private static void OnEnableOpacityChanged()
- {
- if (EnableOpacityChanged != null)
- {
- EnableOpacityChanged(null, EventArgs.Empty);
- }
- }
- public bool EnableInstanceOpacity
- {
- get
- {
- return instanceEnableOpacity;
- }
- set
- {
- instanceEnableOpacity = value;
- this.DecideOpacitySetting();
- }
- }
- /// <summary>
- /// Gets or sets a flag that enables or disables opacity for all PdnBaseForm instances.
- /// If a particular form's EnableInstanceOpacity property is false, that will override
- /// this property being 'true'.
- /// </summary>
- public static bool EnableOpacity
- {
- get
- {
- return globalEnableOpacity;
- }
- set
- {
- globalEnableOpacity = value;
- OnEnableOpacityChanged();
- }
- }
- /// <summary>
- /// Gets or sets the titlebar rendering behavior for when the form is deactivated.
- /// </summary>
- /// <remarks>
- /// If this property is false, the titlebar will be rendered in a different color when the form
- /// is inactive as opposed to active. If this property is true, it will always render with the
- /// active style. If the whole application is deactivated, the title bar will still be drawn in
- /// an inactive state.
- /// </remarks>
- public bool ForceActiveTitleBar
- {
- get
- {
- return this.formEx.ForceActiveTitleBar;
- }
- set
- {
- this.formEx.ForceActiveTitleBar = value;
- }
- }
- private ThreadPriority originalPriority;
- protected override void OnScroll(ScrollEventArgs se)
- {
- Thread.CurrentThread.Priority = this.originalPriority;
- base.OnScroll(se);
- }
- public PdnBaseForm()
- {
- this.originalPriority = Thread.CurrentThread.Priority;
- Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
- UI.InitScaling(this);
- this.SuspendLayout();
- InitializeComponent();
- this.formEx = new PaintDotNet.SystemLayer.FormEx(this, new RealParentWndProcDelegate(this.RealWndProc));
- this.Controls.Add(this.formEx);
- this.formEx.Visible = false;
- DecideOpacitySetting();
- this.ResumeLayout(false);
- this.formEx.ProcessCmdKeyRelay += OnProcessCmdKeyRelay;
- }
- protected override void OnLoad(EventArgs e)
- {
- if (!this.DesignMode)
- {
- LoadResources();
- }
- base.OnLoad(e);
- }
- public virtual void LoadResources()
- {
- if (!this.DesignMode)
- {
- string stringName = this.Name + ".Localized";
- string stringValue = StringsResourceManager.GetString(stringName);
- if (stringValue != null)
- {
- try
- {
- bool boolValue = bool.Parse(stringValue);
- if (boolValue)
- {
- LoadLocalizedResources();
- }
- }
- catch (Exception)
- {
- }
- }
- }
- }
- protected virtual ResourceManager StringsResourceManager
- {
- get
- {
- return PdnResources.Strings;
- }
- }
- private void LoadLocalizedResources()
- {
- LoadLocalizedResources(this.Name, this);
- }
- private void ParsePair(string theString, out int x, out int y)
- {
- string[] split = theString.Split(',');
- x = int.Parse(split[0]);
- y = int.Parse(split[1]);
- }
- private void LoadLocalizedResources(string baseName, Control control)
- {
- // Text
- string textStringName = baseName + ".Text";
- string textString = this.StringsResourceManager.GetString(textStringName);
- if (textString != null)
- {
- control.Text = textString;
- }
- // Location
- string locationStringName = baseName + ".Location";
- string locationString = this.StringsResourceManager.GetString(locationStringName);
- if (locationString != null)
- {
- try
- {
- int x;
- int y;
- ParsePair(locationString, out x, out y);
- control.Location = new Point(x, y);
- }
- catch (Exception ex)
- {
- Tracing.Ping(locationStringName + " is invalid: " + locationString + ", exception: " + ex.ToString());
- }
- }
- // Size
- string sizeStringName = baseName + ".Size";
- string sizeString = this.StringsResourceManager.GetString(sizeStringName);
- if (sizeString != null)
- {
- try
- {
- int width;
- int height;
- ParsePair(sizeString, out width, out height);
- control.Size = new Size(width, height);
- }
- catch (Exception ex)
- {
- Tracing.Ping(sizeStringName + " is invalid: " + sizeString + ", exception: " + ex.ToString());
- }
- }
- // Recurse
- foreach (Control child in control.Controls)
- {
- if (child.Name == null || child.Name.Length > 0)
- {
- string newBaseName = baseName + "." + child.Name;
- LoadLocalizedResources(newBaseName, child);
- }
- else
- {
- Tracing.Ping("Name property not set for an instance of " + child.GetType().Name + " within " + baseName);
- }
- }
- }
- protected override void OnClosing(CancelEventArgs e)
- {
- base.OnClosing(e);
- if (!e.Cancel)
- {
- this.ForceActiveTitleBar = false;
- }
- }
- private void EnableOpacityChangedHandler(object sender, EventArgs e)
- {
- DecideOpacitySetting();
- }
- protected override void OnHandleCreated(EventArgs e)
- {
- base.OnHandleCreated(e);
- PdnBaseForm.EnableOpacityChanged += new EventHandler(EnableOpacityChangedHandler);
- UserSessions.SessionChanged += new EventHandler(UserSessions_SessionChanged);
- DecideOpacitySetting();
- }
- protected override void OnHandleDestroyed(EventArgs e)
- {
- base.OnHandleDestroyed(e);
- PdnBaseForm.EnableOpacityChanged -= new EventHandler(EnableOpacityChangedHandler);
- UserSessions.SessionChanged -= new EventHandler(UserSessions_SessionChanged);
- }
- /// <summary>
- /// Clean up any resources being used.
- /// </summary>
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- if (components != null)
- {
- components.Dispose();
- components = null;
- }
- }
- base.Dispose(disposing);
- }
- /// <summary>
- /// Sets the opacity of the form.
- /// </summary>
- /// <param name="newOpacity">The new opacity value.</param>
- /// <remarks>
- /// Depending on the system configuration, this request may be ignored. For example,
- /// when running within a Terminal Service (or Remote Desktop) session, opacity will
- /// always be set to 1.0 for performance reasons.
- /// </remarks>
- public new double Opacity
- {
- get
- {
- return this.ourOpacity;
- }
- set
- {
- if (enableOpacity)
- {
- // Bypassing Form.Opacity eliminates a "black flickering" that occurs when
- // the form transitions from Opacity=1.0 to Opacity != 1.0, or vice versa.
- // It appears to be a result of toggling the WS_EX_LAYERED style, or the
- // fact that Form.Opacity re-applies visual styles when this value transition
- // takes place.
- SystemLayer.UI.SetFormOpacity(this, value);
- }
- this.ourOpacity = value;
- }
- }
- /// <summary>
- /// Decides whether or not to have opacity be enabled.
- /// </summary>
- private void DecideOpacitySetting()
- {
- if (UserSessions.IsRemote || !PdnBaseForm.globalEnableOpacity || !this.EnableInstanceOpacity)
- {
- if (this.enableOpacity)
- {
- try
- {
- UI.SetFormOpacity(this, 1.0);
- }
- // This fails in certain odd situations (bug #746), so we just eat the exception.
- catch (System.ComponentModel.Win32Exception)
- {
- }
- }
- this.enableOpacity = false;
- }
- else
- {
- if (!this.enableOpacity)
- {
- // This fails in certain odd situations (bug #746), so we just eat the exception.
- try
- {
- UI.SetFormOpacity(this, this.ourOpacity);
- }
- catch (System.ComponentModel.Win32Exception)
- {
- }
- }
- this.enableOpacity = true;
- }
- }
- public double ScreenAspect
- {
- get
- {
- Rectangle bounds = System.Windows.Forms.Screen.FromControl(this).Bounds;
- double aspect = (double)bounds.Width / (double)bounds.Height;
- return aspect;
- }
- }
- #region Windows Form Designer generated code
- /// <summary>
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- /// </summary>
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- this.SuspendLayout();
- //
- // PdnBaseForm
- //
- this.AutoScaleDimensions = new SizeF(96F, 96F);
- this.AutoScaleMode = AutoScaleMode.Dpi;
- this.ClientSize = new System.Drawing.Size(291, 270);
- this.Name = "PdnBaseForm";
- this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
- this.Text = "PdnBaseForm";
- this.ResumeLayout(false);
- }
- #endregion
- public event MovingEventHandler Moving;
- protected virtual void OnMoving(MovingEventArgs mea)
- {
- if (Moving != null)
- {
- Moving(this, mea);
- }
- }
- public event CancelEventHandler QueryEndSession;
- protected virtual void OnQueryEndSession(CancelEventArgs e)
- {
- if (QueryEndSession != null)
- {
- QueryEndSession(this, e);
- }
- }
- private void UserSessions_SessionChanged(object sender, EventArgs e)
- {
- this.DecideOpacitySetting();
- }
- void RealWndProc(ref Message m)
- {
- OurWndProc(ref m);
- }
- protected override void WndProc(ref Message m)
- {
- if (this.formEx == null)
- {
- base.WndProc(ref m);
- }
- else if (!this.formEx.HandleParentWndProc(ref m))
- {
- OurWndProc(ref m);
- }
- }
- private void OurWndProc(ref Message m)
- {
- switch (m.Msg)
- {
- case 0x0216: // WM_MOVING
- unsafe
- {
- int* p = (int*)m.LParam;
- Rectangle rect = Rectangle.FromLTRB(p[0], p[1], p[2], p[3]);
- MovingEventArgs mea = new MovingEventArgs(rect);
- OnMoving(mea);
- p[0] = mea.Rectangle.Left;
- p[1] = mea.Rectangle.Top;
- p[2] = mea.Rectangle.Right;
- p[3] = mea.Rectangle.Bottom;
- m.Result = new IntPtr(1);
- }
- break;
- // WinForms doesn't handle this message correctly and wrongly returns 0 instead of 1.
- case 0x0011: // WM_QUERYENDSESSION
- CancelEventArgs e = new CancelEventArgs();
- OnQueryEndSession(e);
- m.Result = e.Cancel ? IntPtr.Zero : new IntPtr(1);
- break;
- default:
- base.WndProc(ref m);
- break;
- }
- }
- public SnapManager SnapManager
- {
- get
- {
- if (this.snapManager == null)
- {
- this.snapManager = new SnapManager();
- }
- return snapManager;
- }
- }
- public Size ClientSizeToWindowSize(Size clientSize)
- {
- Size baseClientSize = ClientSize;
- Size baseWindowSize = Size;
- int extraWidth = baseWindowSize.Width - baseClientSize.Width;
- int extraHeight = baseWindowSize.Height - baseClientSize.Height;
- Size windowSize = new Size(clientSize.Width + extraWidth, clientSize.Height + extraHeight);
- return windowSize;
- }
- public Size WindowSizeToClientSize(Size windowSize)
- {
- Size baseClientSize = ClientSize;
- Size baseWindowSize = Size;
- int extraWidth = baseWindowSize.Width - baseClientSize.Width;
- int extraHeight = baseWindowSize.Height - baseClientSize.Height;
- Size clientSize = new Size(windowSize.Width - extraWidth, windowSize.Height - extraHeight);
- return clientSize;
- }
- public Rectangle ClientBoundsToWindowBounds(Rectangle clientBounds)
- {
- Rectangle currentBounds = this.Bounds;
- Rectangle currentClientBounds = this.RectangleToScreen(ClientRectangle);
- Rectangle newWindowBounds = new Rectangle(
- clientBounds.Left - (currentClientBounds.Left - currentBounds.Left),
- clientBounds.Top - (currentClientBounds.Top - currentBounds.Top),
- clientBounds.Width + (currentBounds.Width - currentClientBounds.Width),
- clientBounds.Height + (currentBounds.Height - currentClientBounds.Height));
- return newWindowBounds;
- }
- public Rectangle WindowBoundsToClientBounds(Rectangle windowBounds)
- {
- Rectangle currentBounds = this.Bounds;
- Rectangle currentClientBounds = this.RectangleToScreen(ClientRectangle);
- Rectangle newClientBounds = new Rectangle(
- windowBounds.Left + (currentClientBounds.Left - currentBounds.Left),
- windowBounds.Top + (currentClientBounds.Top - currentBounds.Top),
- windowBounds.Width - (currentBounds.Width - currentClientBounds.Width),
- windowBounds.Height - (currentBounds.Height - currentClientBounds.Height));
- return newClientBounds;
- }
- public void EnsureFormIsOnScreen()
- {
- if (this.WindowState == FormWindowState.Maximized)
- {
- return;
- }
- if (this.WindowState == FormWindowState.Minimized)
- {
- return;
- }
- Screen ourScreen;
- try
- {
- ourScreen = Screen.FromControl(this);
- }
- catch (Exception)
- {
- ourScreen = null;
- }
- if (ourScreen == null)
- {
- ourScreen = Screen.PrimaryScreen;
- }
- Rectangle currentBounds = Bounds;
- Rectangle newBounds = EnsureRectIsOnScreen(ourScreen, currentBounds);
- Bounds = newBounds;
- }
- public static Rectangle EnsureRectIsOnScreen(Screen screen, Rectangle bounds)
- {
- Rectangle newBounds = bounds;
- Rectangle screenBounds = screen.WorkingArea;
- // Make sure the bottom and right do not fall off the edge, by moving the bounds
- if (newBounds.Right > screenBounds.Right)
- {
- newBounds.X -= (newBounds.Right - screenBounds.Right);
- }
- if (newBounds.Bottom > screenBounds.Bottom)
- {
- newBounds.Y -= (newBounds.Bottom - screenBounds.Bottom);
- }
- // Make sure the top and left haven't fallen off, by moving
- if (newBounds.Left < screenBounds.Left)
- {
- newBounds.X = screenBounds.Left;
- }
- if (newBounds.Top < screenBounds.Top)
- {
- newBounds.Y = screenBounds.Top;
- }
- // Make sure that we are not too wide / tall, by resizing
- if (newBounds.Right > screenBounds.Right)
- {
- newBounds.Width -= (newBounds.Right - screenBounds.Right);
- }
- if (newBounds.Bottom > screenBounds.Bottom)
- {
- newBounds.Height -= (newBounds.Bottom - screenBounds.Bottom);
- }
- // All done.
- return newBounds;
- }
- public virtual void CreateProjectName(AnalyzeSettingModel model)
- {
- }
- public virtual void CreateProjectName(AnalyzeSettingModel model, int id)
- {
- }
- public virtual void GetCreateName(string name)
- {
- }
- public virtual void GetCreateName(string name, string desc)
- {
- }
- /// <summary>
- /// 从xml读取对应分析报告的设置项
- /// </summary>
- public void SetAnalyzeModelFromXml(string languageName)
- {
- string filePath = Application.StartupPath + "\\Config\\" + xmlPath + "\\" + "AnalyzeSavedModel.xml";
- if (System.IO.File.Exists(filePath))
- {
- AnalyzeSavedModel analyzeSavedModel = XmlSerializeHelper.DESerializer<AnalyzeSavedModel>(FileOperationHelper.ReadStringFromFile(filePath, FileMode.Open));
- if (analyzeSavedModel.modelItems != null && analyzeSavedModel.modelItems.Count > 0)
- {
- AnalyzeSavedModel.ModelItem modelItem = analyzeSavedModel.modelItems.Find(a => a.languageName == languageName);
- if (modelItem != null && modelItem.analyzeSettingModel != null)
- {
- this.analyzeSettingModel = modelItem.analyzeSettingModel;
- }
- }
- }
- }
- /// <summary>
- /// 计算并修改DataGridView的列宽度
- /// 使其看起来舒服一点
- /// </summary>
- /// <param name="dgViewFiles"></param>
- /// <param name="offset"></param>
- public void AutoSizeColumn(DataGridView dgViewFiles, int offset)
- {
- int width = 0;
- //使列自使用宽度
- //对于DataGridView的每一个列都调整
- for (int i = 0; i < dgViewFiles.Columns.Count; i++)
- {
- //将每一列都调整为自动适应模式
- dgViewFiles.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);
- //记录整个DataGridView的宽度
- width += dgViewFiles.Columns[i].Width + offset;
- }
- //判断调整后的宽度与原来设定的宽度的关系,如果是调整后的宽度大于原来设定的宽度,
- //则将DataGridView的列自动调整模式设置为显示的列即可,
- //如果是小于原来设定的宽度,将模式改为填充。
- if (width > dgViewFiles.Size.Width)
- {
- dgViewFiles.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
- for (int i = 0; i < dgViewFiles.Columns.Count; i++)
- {
- dgViewFiles.Columns[i].Width += offset;
- }
- }
- else
- {
- for (int i = 0; i < dgViewFiles.Columns.Count; i++)
- {
- dgViewFiles.Columns[i].Width = (int)(dgViewFiles.Size.Width / dgViewFiles.Columns.Count);
- }
- //dgViewFiles.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
- }
- //冻结某列 从左开始 0,1,2
- //dgViewFiles.Columns[1].Frozen = true;
- }
- }
- }
|