Como criar um # WinForms Controle C que paira

votos
8

Como você pode criar um controle C # Winforms que sai dos limites da sua região? Tal como uma caixa suspensa. Tipo como se você tivesse um dropdownbox em um painel de pequeno porte.

Publicado 09/12/2008 em 18:21
fonte usuário
Em outras línguas...                            


3 respostas

votos
8

O Windows Forms não suporta janelas como tão bem, é bastante fundamentalmente incompatíveis com o designer. Aqui está algum código para você começar. Você não pode usar este controle no designer, ele deve ser criado em tempo de execução. Você também deve chamar o método Dispose () você mesmo.

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;
    }
  }
}
Respondeu 09/12/2008 em 22:41
fonte usuário

votos
2

Eu fiz algo semelhante ao que, recentemente, e eu usei uma caixa de listagem. O legal pensar em uma caixa de listagem, é que você pode exibi-lo em qualquer lugar que você quer, mesmo fora dos limites de seu controle. Dessa forma, quando você detectar através de um clique de botão ou o que quer, o que você precisa para exibir a lista suspensa que você quiser, basta preencher o ListBox e exibi-lo onde quiser. Eu tive a idéia de aqui:

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

Eles mostram como construir um DataGridView personalizada com filtragem e para exibir os valores de filtro, eles colocam uma caixa de listagem, sob a célula de cabeçalho.

Respondeu 09/12/2008 em 20:08
fonte usuário

votos
0

Há um bom artigo aqui:

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

Isto tem uma classe que lida com alguns dos aspectos complicados de conseguir isso funcione corretamente, tais como manter a barra de título da janela do aplicativo ativo, manuseio Alt-Tab e cancelando com um clique do mouse.

Respondeu 06/07/2012 em 02:47
fonte usuário

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