Comment faire un contrôle flottant

Je voudrais créer un contrôle les flottants (potentiellement) en dehors des limites de sa forme contenant. Est-ce possible? Comment puis-je le faire?

Cela fonctionnerait un peu comme le menu contextuel, mais il me faut pouvoir lui append d’autres contrôles tels que des boutons et des images.

Vous voulez un formulaire avec son FormBorderStyle défini sur Aucun, si vous voulez qu’il se comporte comme un menu contextuel, vous devez l’associer au gestionnaire d’événement approprié de votre formulaire principal. Exemple simple ci-dessous de définition de l’emplacement et de l’appel à show à partir d’un gestionnaire d’événements de clic de souris.

MyForm form = new MyForm(); form.Location = PointToScreen(new Point(eX, eY)); form.Show(); 

C’est possible, la propriété TopLevel contrôle ceci. Cependant, le concepteur ne les prend pas bien en charge, il est difficile de garder le contrôle sur les contrôles qui sont également des fenêtres de niveau supérieur au moment de la conception.

Au-delà des composants tels que ToolTip et ContextMenuSsortingp, il existe exactement une classe de niveau supérieur par conception, la classe Form. Définissez FormBorderStyle sur None et ControlBox sur False pour créer une fenêtre de niveau supérieur de base que vous pouvez utiliser et renseigner avec d’autres contrôles.

Jetez un coup d’œil à la source DockPanel Suite et adoptez la technique.

Il devrait s’agir d’une fenêtre distincte (un menu similaire à un menu contextuel): vous pouvez l’envelopper en tant que contrôle, qui affiche un formulaire non modal (ce qui vous donnerait même l’option pour des fenêtres non rectangulars si vous le souhaitez vraiment ). . Comme vous pouvez créer la fenêtre à partir d’un contrôle non visible à partir du formulaire parent, vous pouvez conserver une référence à l’enfant pour gérer la communication inter-formulaire.

Demandez à votre UserControl remplacer CreateParams . Par exemple:

 [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] public static extern IntPtr GetDesktopWindow(); protected override CreateParams CreateParams { get { var cp = base.CreateParams; cp.ExStyle &= 0x00080000; // WS_EX_LAYERED cp.Style = 0x40000000 | 0x4000000; // WS_CHILD | WS_CLIPSIBLINGS cp.Parent = GetDesktopWindow(); return cp; } } 

Cela peut avoir des effets inattendus (notamment ne pas bien fonctionner avec Designer). Je choisis de suivre l’un des schémas ci-dessus, mais j’ai pensé qu’il valait la peine d’être mentionné ici. Recherchez CreateParams pour voir son objective. (Cette option a été glanée à partir de cette page .)

voici vous pouvez faire pour tout style de contrôle flottant

  private void Panel_MouseMove(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { Panel.Left += eX - PanelMouseDownLocation.X; Panel.Top += eY - PanelMouseDownLocation.Y; } } private void Panel_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) PanelMouseDownLocation = e.Location; } public Point PanelMouseDownLocation { get; set; } 

Cela a fonctionné pour moi

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Windows.Forms; using LollipopUIControls.UIManagers; namespace Gamasis.Apps.Controls { public class FloatingButton : Button { public FloatingButton() { SetStyle((ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint), true); DoubleBuffered = true; Size = new Size(50, 50); BackColor = Color.Transparent; SF.Alignment = SsortingngAlignment.Center; SF.LineAlignment = SsortingngAlignment.Center; AnimationTimer.Tick += new EventHandler(AnimationTick); } #region Variables Timer AnimationTimer = new Timer { Interval = 1 }; FontManager font = new FontManager(); SsortingngFormat SF = new SsortingngFormat(); Rectangle SsortingngRectangle; bool Focus = false; int margintop = 0, marginleft = 0, marginright = 0, marginBottom = 0; int xx; int yy; float SizeAnimation = 0; float SizeIncNum; ssortingng fontcolor = "#FAFAFA"; ssortingng Backcolor = "#039BE5"; Color EnabledBGColor; Color EnabledBorderColor; Color SsortingngColor; Color DisabledBGColor = ColorTranslator.FromHtml("#B0BEC5"); Color DisabledSsortingngColor = ColorTranslator.FromHtml("#FAFAFA"); Color NonColor = ColorTranslator.FromHtml("#e3e5e7"); Image bGImage = null; #endregion #region Properties [Category("Custom")] public ssortingng BGColor { get { return Backcolor; } set { Backcolor = value; Invalidate(); } } [Category("Custom")] public ssortingng FontColor { get { return fontcolor; } set { fontcolor = value; Invalidate(); } } [Browsable(false)] public Font Font { get { return base.Font; } set { base.Font = value; } } [Browsable(false)] public Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } } [Category("Custom")] public Image BGImage { get { return bGImage; } set { bGImage = value; } } ImageSizeLevel bGimgSize = ImageSizeLevel.peque2; public ImageSizeLevel BGimgSize { get { return bGimgSize; } set { bGimgSize = value; } } #endregion #region Events protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); EnabledBGColor = Color.FromArgb(30, ColorTranslator.FromHtml(BGColor));//SsortingngColor); EnabledBorderColor = Color.FromArgb(20, ColorTranslator.FromHtml(BGColor));//SsortingngColor); Refresh(); } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); EnabledBGColor = ColorTranslator.FromHtml(BGColor); EnabledBorderColor = ColorTranslator.FromHtml(BGColor); Refresh(); } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); EnabledBGColor = Color.FromArgb(30, SsortingngColor); Refresh(); xx = eX; yy = eY; Focus = true; AnimationTimer.Start(); Invalidate(); } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); Focus = false; AnimationTimer.Start(); Invalidate(); } protected override void OnTextChanged(System.EventArgs e) { base.OnTextChanged(e); Invalidate(); } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); //SsortingngRectangle = new Rectangle(3, 0, Width - 6, Height - 6); } #endregion protected override void OnResize(System.EventArgs e) { base.OnResize(e); //SizeIncNum = Width / 34; SizeIncNum = Width / 10; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); var G = e.Graphics; #region Default rectangle //G.SmoothingMode = SmoothingMode.HighQuality | SmoothingMode.AntiAlias; //G.Clear(Parent.BackColor); //SsortingngColor = ColorTranslator.FromHtml(fontcolor); //var BG = DrawHelper.CreateRoundRect(1, 1, Width - 3, Height - 3, 1); //Region region = new Region(BG); //G.FillPath(new SolidBrush(Enabled ? EnabledBGColor : Color.White), BG); //G.DrawPath(new Pen(Enabled ? EnabledBorderColor : Color.White), BG); //G.SetClip(region, CombineMode.Replace); ////The Ripple Effect //G.FillEllipse(new SolidBrush(Color.FromArgb(30, SsortingngColor)), xx - (SizeAnimation / 2), yy - (SizeAnimation / 2), SizeAnimation, SizeAnimation); //G.DrawSsortingng(Text, font.Roboto_Medium10, new SolidBrush(Enabled ? SsortingngColor : DisabledSsortingngColor), R, SF); #endregion #region Circle //G.SmoothingMode = SmoothingMode.AntiAlias; //G.Clear(BackColor); //GraphicsPath bgbtn = new GraphicsPath(); //bgbtn.AddEllipse(0, 0, Width - 5, Height - 5); //GraphicsPath bgShadow = new GraphicsPath(); //bgShadow.AddEllipse(0, 0, Width - 2, Height - 2); //G.FillPath(new SolidBrush(NonColor), bgShadow); //G.DrawPath(new Pen(NonColor), bgShadow); //G.FillPath(new SolidBrush(Color.DeepSkyBlue), bgbtn); //G.DrawPath(new Pen(Color.DeepSkyBlue), bgbtn); #endregion ///---------------------------- G.SmoothingMode = SmoothingMode.AntiAlias; G.Clear(Parent.BackColor); SsortingngColor = ColorTranslator.FromHtml(fontcolor); //var BG = DrawHelper.CreateRoundRect(1, 1, Width - 3, Height - 3, 1); //Círculo principal GraphicsPath bgbtn = new GraphicsPath(); bgbtn.AddEllipse(2, 0, Width - 6, Height - 6); //Círculo para la sombra GraphicsPath bgShadow = new GraphicsPath(); bgShadow.AddEllipse(2, 4, Width - 6, Height - 6); // se dibuja la sombra G.FillPath(new SolidBrush(NonColor), bgShadow); G.DrawPath(new Pen(NonColor), bgShadow); //sedibuja el círculo principal sobre la sombra G.FillPath(new SolidBrush(Enabled ? ColorTranslator.FromHtml(BGColor) : DisabledBGColor), bgbtn); G.DrawPath(new Pen(Enabled ? ColorTranslator.FromHtml(BGColor) : DisabledBGColor), bgbtn); // Se da a la región forma de círculo/elipse Region region = new Region(bgbtn);//BG); G.SetClip(region, CombineMode.Replace); //The Ripple Effect if (Enabled) G.FillEllipse(new SolidBrush(Color.FromArgb(30, EnabledBGColor)), xx - (SizeAnimation / 2), yy - (SizeAnimation / 2), SizeAnimation, SizeAnimation); SsortingngRectangle = new Rectangle((int)bgbtn.GetBounds().Location.X, (int)bgbtn.GetBounds().Location.Y, (int)bgbtn.GetBounds().Size.Width, (int)bgbtn.GetBounds().Size.Height); G.DrawSsortingng(Text, font.Roboto_Medium15, new SolidBrush(Enabled ? SsortingngColor : DisabledSsortingngColor), SsortingngRectangle, SF); if (bGImage != null) { float imgX = 0, imgY = 0; imgY = (bgbtn.GetBounds().Size.Height - (int)bGimgSize) / 2; imgX = ((bgbtn.GetBounds().Size.Width - (int)bGimgSize) + 2) / 2; G.DrawImage(bGImage, imgX, imgY, (float)bGimgSize, (float)bGimgSize); } } protected void AnimationTick(object sender, EventArgs e) { if (Focus) { if (SizeAnimation < Width + 250) { SizeAnimation += SizeIncNum; this.Invalidate(); } } else { if (SizeAnimation > 0) { SizeAnimation = 0; this.Invalidate(); } } } public enum ImageSizeLevel { peque = 12, peque1 = 24, peque2 = 32, maso = 48, maso1 = 56, maso2 = 64, grande = 72, grande1 = 86, grande2 = 96, monstruo = 128, monstruo1 = 256, monstruo2 = 512 } } 

}