Cómo crear un control C # Winforms que se cierne

votos
8

¿Cómo se puede crear un control C # Winforms que salga de los límites de su región? Como un cuadro desplegable. Algo así como si tuviera un DropDownBox en un Panel de Tamaño Pequeño.

Publicado el 09/12/2008 a las 18:21
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
8

Windows Forms no es compatible con ventanas como esa, es básicamente incompatible con el diseñador. Aquí hay un código para comenzar. No puede usar este control en el diseñador, debe crearse en tiempo de ejecución. También debe llamar a su método Dispose () usted mismo.

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

public class MyListBox : ListBox {
  private Control mParent;
  private Point mPos;
  private bool mInitialized;

  public MyListBox(Control parent) {
    mParent = parent;
    mInitialized = true;
    this.SetTopLevel(true);
    parent.LocationChanged += new EventHandler(parent_LocationChanged);
    mPos = mParent.Location;
  }

  public new Point Location {
    get { return mParent.PointToClient(this.Location); }
    set { 
      Point zero = mParent.PointToScreen(Point.Empty);
      base.Location = new Point(zero.X + value.X, zero.Y + value.Y);
    }
  }

  protected override Size DefaultSize {
    get {
      return mInitialized ? base.DefaultSize : Size.Empty;
    }
  }

  protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) {
    if (this.mInitialized)
      base.SetBoundsCore(x, y, width, height, specified);
  }

  void parent_LocationChanged(object sender, EventArgs e) {
    base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y);
    mPos = mParent.Location;
  }

  protected override CreateParams CreateParams {
    get {
      CreateParams cp = base.CreateParams;
      if (mParent != null && !DesignMode) {
        cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000);
        cp.Parent = mParent.Handle;
        Point pos = mParent.PointToScreen(Point.Empty);
        cp.X = pos.X;
        cp.Y = pos.Y;
        cp.Width = base.DefaultSize.Width;
        cp.Height = base.DefaultSize.Height;
      }
      return cp;
    }
  }
}
Respondida el 09/12/2008 a las 22:41
fuente por usuario

votos
2

Hice algo similar a eso recientemente, y utilicé un ListBox. Lo bueno de un cuadro de lista es que puedes mostrarlo donde quieras, incluso fuera de los límites de tu control. De esta forma, cuando detecte mediante un clic de un botón o lo que sea, que necesita mostrar el DropDown que desea, simplemente llene el ListBox y muéstrelo en cualquier lugar que desee. Tengo la idea desde aquí:

http://msdn.microsoft.com/en-us/library/aa480727.aspx

Muestran cómo construir un DataGridView personalizado con filtrado, y para mostrar los valores de filtro, colocan un ListBox debajo de la celda del encabezado.

Respondida el 09/12/2008 a las 20:08
fuente por usuario

votos
0

Hay un buen artículo aquí:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

Esto tiene una clase que se ocupa de algunos de los aspectos difíciles de conseguir que esto funcione correctamente, tales como el mantenimiento de la barra de título de ventana de la aplicación activa, manejo Alt-Tab y cancelación con un clic del ratón.

Respondida el 06/07/2012 a las 02:47
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more