using Microsoft.Windows.Forms; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.Design; using System.Windows.Forms.Design.Behavior; namespace DPumpHydr.WinFrmUI.WenSkin.Design.Designer { public class UiControlsDesigner : ControlDesigner { public UiControlsDesigner() : base() { } //获取当前选择的子控件 #region 私有属性 public IUIControl uIControl => this.Component as IUIControl; private IUIControl selectUiControl; #region 鼠标 private bool isMouseDown = false; private Point oldPoint; #endregion #endregion public static int LoWord(int dwValue) => dwValue & 0xFFFF; public static int HiWord(int dwValue) => (dwValue >> 16) & 0xFFFF; protected override void WndProc(ref Message m) { base.WndProc(ref m); switch (m.Msg) { case 0x203: Point pi = new Point(LoWord((int)m.LParam), HiWord((int)m.LParam)); var c = selectUiControl = FindSelectedControl(pi); if (c == null) return; CreateEventCode(); break; //case 0x200: // pi = new Point(LoWord((int)m.LParam), HiWord((int)m.LParam)); // if (isMouseDown && selectUiControl != null) // { // selectUiControl.Location = new Point(selectUiControl.Location.X + pi.X - oldPoint.X, selectUiControl.Location.Y + pi.Y - oldPoint.Y); // oldPoint = pi; // HookChildControls(this.Control); // } // break; } } private UIControl FindSelectedControl(Point pi) { if (uIControl != null) foreach (var item in uIControl.UIControls) { RectangleF rec = new RectangleF(item.Location, item.Size); if (rec.Contains(pi)) { return item; } } return null; } private DesignerActionListCollection actionLists; public override DesignerActionListCollection ActionLists { get { if (actionLists == null) { actionLists = new DesignerActionListCollection(); this.ActionLists.Add(new WenDesignerActionList(this.Component)); } return actionLists; } } public class WenDesignerActionList : DesignerActionList { public WenDesignerActionList(IComponent component) : base(component) { } public IUIControl uIControl => this.Component as IUIControl; [Editor(typeof(DPumpHydr.WinFrmUI.WenSkin.Design.Editor.DuiWenCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] public UIControl.UIControlCollection UIControls => uIControl.UIControls; public override DesignerActionItemCollection GetSortedActionItems() { DesignerActionPropertyItem uIControls = new DesignerActionPropertyItem("UIControls", "子控件集合"); return new DesignerActionItemCollection() { uIControls }; } } //当响应在组件上按住鼠标左键不放这一操作时接收调用。 protected override void OnMouseDragBegin(int x, int y) { var pi = this.Control.PointToClient(new Point(x, y)); var c = selectUiControl = FindSelectedControl(pi); if (c != null) { isMouseDown = true; oldPoint = pi; } else base.OnMouseDragBegin(x, y); } //在拖放操作结束时接收调用,以完成或取消此次操作。 protected override void OnMouseDragEnd(bool cancel) { isMouseDown = false; if (selectUiControl != null) { this.Control.Invalidate(); selectUiControl = null; } base.OnMouseDragEnd(cancel); } //为拖放操作期间的每一次鼠标移动接收调用。 protected override void OnMouseDragMove(int x, int y) { var pi = this.Control.PointToClient(new Point(x, y)); if (isMouseDown && selectUiControl != null) { selectUiControl.Location = new Point(selectUiControl.Location.X + pi.X - oldPoint.X, selectUiControl.Location.Y + pi.Y - oldPoint.Y); oldPoint = pi; UpdateCode(selectUiControl as IComponent); } else base.OnMouseDragMove(x, y); } //重绘 选中的时候外框虚线框 protected override void OnPaintAdornments(PaintEventArgs pe) { base.OnPaintAdornments(pe); if (selectUiControl != null) { using var pen = new Pen(Color.FromArgb(106, 106, 106)) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash }; pe.Graphics.DrawRectangle(pen, selectUiControl.Location.X - 2, selectUiControl.Location.Y - 2, selectUiControl.Width + 4, selectUiControl.Height + 4); } } private void UpdateCode(IComponent com) { if (TryGetService(out IComponentChangeService service) && com != null) { service.OnComponentChanged(com, null, null, null); } } internal bool TryGetService(out T service) where T : class { service = GetService(); return service != null; } internal T GetService() where T : class => GetService(typeof(T)) as T; public override void DoDefaultAction() { } private void CreateEventCode() { if (!TryGetService(out IEventBindingService ebs)) { return; } var ss = TypeDescriptor.GetEvents(selectUiControl); var eve = ss.Find("Click", true); if (eve == null) return; CreateEventCode(ebs, selectUiControl as IComponent, eve); ebs.ShowCode(selectUiControl as IComponent, eve); } private void CreateEventCode(IEventBindingService ebs, IComponent comp, EventDescriptor eventDescriptor) { if (ebs == null || comp == null || eventDescriptor == null) return; //如果找不到此事件的属性,或者该属性的属性为只读,则中止。 if (!(ebs.GetEventProperty(eventDescriptor) is PropertyDescriptor propEvent) || propEvent.IsReadOnly) return; //如果解析的init方法中没有显式事件连接,则处理程序将为null object result = propEvent.GetValue(comp); string handler = result as string; bool eventChanged; if (handler is null) { //跳过无效属性。 if (result != null) { return; } eventChanged = true; handler = ebs.CreateUniqueMethodName(comp, eventDescriptor); } else { //确保处理程序仍在那里 eventChanged = true; ICollection methods = ebs.GetCompatibleMethods(eventDescriptor); if (methods != null) { foreach (string compatibleMethod in methods.OfType()) { if (handler == compatibleMethod) { eventChanged = false; break; } } } } //生成持久事件代码 //保存新值。。。在导航到它之前! if (eventChanged) { propEvent.SetValue(comp, handler); } } protected override void PreFilterEvents(IDictionary events) { base.PreFilterEvents(events); } protected override void PreFilterProperties(System.Collections.IDictionary properties) { base.PreFilterProperties(properties); } } }