Hvordan lage en C # Winforms kontroll som svever

stemmer
8

Hvordan kan du lage en C # Winforms kontroll som går ut av grensene for sin region? Slik som en rullegardin. Typen som hvis du hadde en DropDownBox i en liten størrelse Panel.

Publisert på 09/12/2008 klokken 17:21
kilden bruker
På andre språk...                            


3 svar

stemmer
8

Windows Forms støtter ikke Windows som det vel, det er ganske fundamentalt uforenlig med designeren. Her er noen kode for å komme i gang. Du kan ikke bruke denne kontrollen i designer, det må skapes ved kjøring. Du må også ringe sin Kast () metoden selv.

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;
    }
  }
}
Svarte 09/12/2008 kl. 21:41
kilden bruker

stemmer
2

Jeg gjorde noe lignende til det nylig, og jeg brukte en ListBox. Den kjølige tenke på en listeboksen, er at du kan vise den hvor du vil, selv utenfor banen av kontroll. På den måten når du oppdager via en knapp klikk eller hva, at du trenger å vise dropdown som du vil, bare fylle ListBox og vise den hvor du vil. Jeg fikk ideen fra her:

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

De viser hvordan å bygge en tilpasset Datagridview med filtrering, og for å vise filterverdiene, de plasserer en ListBox under tittelcelle.

Svarte 09/12/2008 kl. 19:08
kilden bruker

stemmer
0

Det er en god artikkel her:

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

Dette har en klasse som håndterer noen av de vanskelige sidene ved å få dette til å fungere korrekt, slik som å holde programvinduet tittellinja aktiv, håndtering Alt-Tab og avbryter med et museklikk.

Svarte 06/07/2012 kl. 01:47
kilden bruker

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