File: System\Windows\Forms\Design\ControlDesigner.DesignerWindowTarget.cs
Web Access
Project: src\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);
            }
        }
    }
}