| File: System\Windows\Forms\Design\ControlDesigner.DesignerWindowTarget.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace System.Windows.Forms.Design; public partial class ControlDesigner { private class DesignerWindowTarget : IWindowTarget, IDesignerTarget, IDisposable { internal ControlDesigner _designer; internal IWindowTarget _oldTarget; public DesignerWindowTarget(ControlDesigner designer) { Control control = designer.Control; _designer = designer; _oldTarget = control.WindowTarget; control.WindowTarget = this; } public void DefWndProc(ref Message m) { _oldTarget.OnMessage(ref m); } public void Dispose() { if (_designer is not null) { _designer.Control.WindowTarget = _oldTarget; _designer = null!; } } public void OnHandleChange(IntPtr newHandle) { _oldTarget.OnHandleChange(newHandle); if (newHandle != IntPtr.Zero) { _designer.OnHandleChange(); } } public void OnMessage(ref Message m) { // We want these messages to go through the designer's WndProc method, and we want people to be able // to do default processing with the designer's DefWndProc. So, we stuff ourselves into the designers // window target and call their WndProc. ControlDesigner currentDesigner = _designer; if (currentDesigner is not null) { IDesignerTarget? designerTarget = currentDesigner.DesignerTarget; currentDesigner.DesignerTarget = this; try { currentDesigner.WndProc(ref m); } catch (Exception ex) { currentDesigner.SetUnhandledException(currentDesigner.Control, ex); } finally { currentDesigner.DesignerTarget = designerTarget; } } else { DefWndProc(ref m); } } } }