Comment créer un contrôle C # Winforms qui plane

voix
8

Comment pouvez-vous créer un contrôle C # Winforms qui sort des limites de sa région? Comme une liste déroulante. Un peu comme si vous aviez un DropDownBox dans un petit panneau de taille moyenne.

Créé 09/12/2008 à 18:21
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
2

Je l'ai fait quelque chose de similaire à ce que récemment, et je ListBox. La fraîcheur pense à une zone de liste, est que vous pouvez l'afficher partout où vous voulez, même en dehors des limites de votre contrôle. De cette façon, lorsque vous détectez via un bouton clic ou autre, que vous devez afficher le menu déroulant que vous voulez, renseignez simplement la zone de liste et l'afficher partout où vous voulez. J'ai eu l'idée d'ici:

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

Ils montrent comment construire une DataGridView personnalisée avec filtrage, et pour afficher les valeurs de filtre, ils placent un ListBox dans la cellule d'en-tête.

Créé 09/12/2008 à 20:08
source utilisateur

voix
8

Windows Forms ne prend pas en charge les fenêtres comme ça bien, il est assez fondamentalement incompatible avec le concepteur. Voici un code pour vous aider à démarrer. Vous ne pouvez pas utiliser ce contrôle dans le concepteur, il doit être créé au moment de l'exécution. Vous devez également appeler sa méthode Dispose () vous-même.

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;
    }
  }
}
Créé 09/12/2008 à 22:41
source utilisateur

voix
0

Il y a un bon article ici:

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

Cela a une classe qui gère certains des aspects délicats d'obtenir que cela fonctionne correctement, comme le maintien de la fenêtre d'application titlebar actif, la manipulation Alt-Tab et l'annulation d'un clic de souris.

Créé 06/07/2012 à 02:47
source utilisateur

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