2010-12-08 11 views
5

Me gustaría crear un control de los flotadores (potencialmente) fuera de los límites de su formulario. es posible? ¿Cómo puedo hacerlo?Cómo hacer un control flotante

Esto funcionaría de manera muy parecida al menú contextual, solo necesito poder agregarle otros controles, como botones e imágenes.

Respuesta

5

Desea un Formulario con su FormBorderStyle establecido en Ninguno, si desea que se comporte como un menú contextual, deberá atarlo y mostrarlo al controlador de eventos correspondiente en su formulario principal. A continuación, se muestra un sencillo ejemplo de configuración de la ubicación y de la llamada desde un controlador de eventos de clic del mouse.

MyForm form = new MyForm(); 
form.Location = PointToScreen(new Point(e.X, e.Y)); 
form.Show(); 
0

Necesitaría ser una ventana separada (como lo es realmente un menú contextual) - podría envolverlo como control, que muestra una forma no modal (que incluso le daría la opción de ventanas no rectangulares si Realmente quería). Como podría crear la ventana desde un control no visible desde el formulario principal, puede mantener una referencia al niño para manejar la comunicación entre formularios.

+0

¿Cómo hago para ¿haciendo esto? – Malfist

2

Eche un vistazo a la fuente DockPanel Suite y adopte la técnica.

+0

¿Cómo funciona un DockPanel 'float [s] ... fuera de los límites de su [sic] que contiene form'? –

+0

@Nelson: Ese proyecto mencionado implementa el concepto de paneles flotantes y acoplados, al igual que en Visual Studio. Se implementan como un Formulario pero se pueden mostrar como un panel regular dentro de un contenedor. – VVS

+0

Tiene razón, pero no creo que eso sea exactamente lo que el OP tenía en mente basado en la respuesta aceptada. De todos modos, el DockPanel es bueno para muchas cosas. –

3

Es posible, la propiedad TopLevel controla esto. Sin embargo, el diseñador no los admite bien, es difícil mantener el control sobre los controles que también son ventanas de alto nivel en el momento del diseño.

Más allá de componentes como ToolTip y ContextMenuStrip, hay exactamente una clase que es de nivel superior por diseño, la clase Form. Establezca su FormBorderStyle en Ninguno y ControlBox en False para crear una ventana básica de nivel superior que puede usar y poblar con otros controles.

0

Haga que su anulación UserControlCreateParams. Por ejemplo:

[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; 
    } 
} 

Esto puede tener efectos involuntarios (incluso no funcionar bien con Designer). Elijo seguir uno de los patrones anteriores, pero pensé que valía la pena mencionarlo aquí. Busque CreateParams para ver su propósito. (Esta opción fue obtenida de this page.)

-1

Esto funcionó para mí

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 = StringAlignment.Center; 
     SF.LineAlignment = StringAlignment.Center; 

     AnimationTimer.Tick += new EventHandler(AnimationTick); 
    } 

    #region Variables 

    Timer AnimationTimer = new Timer { Interval = 1 }; 

    FontManager font = new FontManager(); 
    StringFormat SF = new StringFormat(); 
    Rectangle StringRectangle; 

    bool Focus = false; 
    int margintop = 0, marginleft = 0, marginright = 0, marginBottom = 0; 
    int xx; 
    int yy; 

    float SizeAnimation = 0; 
    float SizeIncNum; 

    string fontcolor = "#FAFAFA"; 
    string Backcolor = "#039BE5"; 

    Color EnabledBGColor; 
    Color EnabledBorderColor; 
    Color StringColor; 

    Color DisabledBGColor = ColorTranslator.FromHtml("#B0BEC5"); 
    Color DisabledStringColor = ColorTranslator.FromHtml("#FAFAFA"); 
    Color NonColor = ColorTranslator.FromHtml("#e3e5e7"); 

    Image bGImage = null; 


    #endregion 

    #region Properties 
    [Category("Custom")] 
    public string BGColor 
    { 
     get { return Backcolor; } 
     set 
     { 
      Backcolor = value; 
      Invalidate(); 
     } 
    } 
    [Category("Custom")] 
    public string 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));//StringColor); 
     EnabledBorderColor = Color.FromArgb(20, ColorTranslator.FromHtml(BGColor));//StringColor); 
     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, StringColor); 
     Refresh(); 

     xx = e.X; 
     yy = e.Y; 

     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); 
     //StringRectangle = 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); 

     //StringColor = 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, StringColor)), xx - (SizeAnimation/2), yy - (SizeAnimation/2), SizeAnimation, SizeAnimation); 

     //G.DrawString(Text, font.Roboto_Medium10, new SolidBrush(Enabled ? StringColor : DisabledStringColor), 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); 

     StringColor = 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); 
     StringRectangle = new Rectangle((int)bgbtn.GetBounds().Location.X, (int)bgbtn.GetBounds().Location.Y, 
      (int)bgbtn.GetBounds().Size.Width, (int)bgbtn.GetBounds().Size.Height); 
     G.DrawString(Text, font.Roboto_Medium15, new SolidBrush(Enabled ? StringColor : DisabledStringColor), StringRectangle, 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 
    } 
} 

}

0

aquí es u puede hecho para todo el estilo flotante de control

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


public Point PanelMouseDownLocation { get; set; } 
Cuestiones relacionadas