2010-12-08 11 views
5

Ich möchte ein Steuerelement die Schwimmer (möglicherweise) außerhalb der Grenzen der es enthält Formular erstellen. Ist das möglich? Wie kann ich es tun?Wie mache ich ein floating-Steuerelement

Das würde ähnlich funktionieren wie das Kontextmenü nur ich muss in der Lage sein, andere Steuerelemente wie Schaltflächen und Bilder hinzuzufügen.

Antwort

5

Sie möchten ein Formular, dessen FormBorderStyle auf None festgelegt ist. Wenn Sie möchten, dass es sich wie ein Kontextmenü verhält, müssen Sie es mit dem entsprechenden Ereignishandler in Ihrem Hauptformular verknüpfen. Ein einfaches Beispiel für das Festlegen des Standorts und das Aufrufen von Shows mit einem Mausklick-Ereignishandler.

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

Es müsste ein separates Fenster sein (ähnlich wie ein Kontextmenü tatsächlich ist) - Sie könnten es als Steuerelement umhüllen, die ein nicht modales Formular anzeigt (das würde Ihnen sogar die Option für nicht rechteckige Fenster geben, wenn Sie wirklich wollte). Da Sie das Fenster von einem nicht sichtbaren Steuerelement aus dem übergeordneten Formular erstellen können, können Sie einen Verweis auf das untergeordnete Element für die Verarbeitung der Inter-Form-Kommunikation verwalten.

+0

gemacht Wie würde ich über gehen Dies tun? – Malfist

2

Werfen Sie einen Blick auf die DockPanel Suite Quelle und übernehmen Sie die Technik.

+0

Wie bewegt sich ein DockPanel 'float [s] ... außerhalb der Grenzen seiner Form? –

+0

@Nelson: Das erwähnte Projekt implementiert das Konzept von schwebenden und angedockten Panels, genau wie in Visual Studio. Sie sind als Formular implementiert, können aber als reguläres Panel in einem Container angezeigt werden. – VVS

+0

Sie haben Recht, aber ich denke nicht, dass das OP der Meinung war, dass es auf der akzeptierten Antwort basiert. Wie auch immer, das DockPanel ist nett für viele Dinge. –

3

Es ist möglich, die Eigenschaft TopLevel steuert dies. Der Designer unterstützt sie jedoch nicht gut, da es schwierig ist, die Kontrolle über Steuerelemente zu behalten, die zur Entwurfszeit auch auf der obersten Ebene stehen.

Abgesehen von Komponenten wie ToolTip und ContextMenuStrip gibt es genau eine Klasse, die von vornherein die oberste Ebene ist, die Form-Klasse. Legen Sie den FormBorderStyle auf None und ControlBox auf False fest, um ein grundlegendes Fenster der obersten Ebene zu erstellen, das Sie mit anderen Steuerelementen belegen können und.

0

Haben Sie Ihre UserControl Überschreibung CreateParams. Zum Beispiel:

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

Dies kann unbeabsichtigte Auswirkungen haben (einschließlich nicht mit Designer gut funktioniert). Ich entscheide mich dafür, einem der obigen Muster zu folgen, aber ich dachte, es wäre erwähnenswert. Lookup CreateParams, um seinen Zweck zu sehen. (Diese Option wurde aus this page entnommen.)

-1

Dieser arbeitete für mich

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

hier ist u für alle Steuer Floating Design kann

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