Πώς να δημιουργήσει ένα C # Winforms ελέγχου που πλανάται

ψήφοι
8

Πώς μπορείτε να δημιουργήσετε ένα στοιχείο ελέγχου C # Winforms που βγαίνει από τα όρια της περιοχής του; Όπως ένα αναπτυσσόμενο πλαίσιο. Είδος όπως αν είχατε ένα DropDownBox σε ένα μικρού μεγέθους πάνελ.

Δημοσιεύθηκε 09/12/2008 στις 18:21
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
8

Μορφές των Windows δεν υποστηρίζει τα παράθυρα έτσι καλά, είναι αρκετά θεμελιωδώς ασύμβατο με το σχεδιαστή. Εδώ είναι μερικά κωδικό για να ξεκινήσετε. Δεν μπορείτε να χρησιμοποιήσετε αυτό το στοιχείο ελέγχου του σχεδιαστή, θα πρέπει να δημιουργηθεί κατά το χρόνο εκτέλεσης. Μπορείτε επίσης να καλέσετε τη μέθοδο της Απορρίψτε () τον εαυτό σας.

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;
    }
  }
}
Απαντήθηκε 09/12/2008 στις 22:41
πηγή χρήστη

ψήφοι
2

Έκανα κάτι παρόμοιο με αυτό πρόσφατα, και θα χρησιμοποιηθεί ένα πλαίσιο λίστας. Το δροσερό σκεφτείτε για ένα πλαίσιο λίστας, είναι ότι μπορείτε να το εμφανίσετε οπουδήποτε θέλετε, ακόμα και έξω από τα όρια του ελέγχου σας. Με αυτόν τον τρόπο, όταν ανιχνεύσει μέσω ενός κουμπιού κλικ ή οτιδήποτε άλλο, ότι θα πρέπει να εμφανιστεί το αναπτυσσόμενο μενού που θέλετε, απλά συμπληρώσετε το πλαίσιο λίστας και να το εμφανίσετε οπουδήποτε θέλετε. Πήρα την ιδέα από εδώ:

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

Δείχνουν πώς να οικοδομήσουμε μια προσαρμοσμένη DataGridView με φιλτράρισμα, και για να εμφανίσετε τις τιμές του φίλτρου, θα τοποθετήσετε ένα πλαίσιο λίστας κάτω από το κύτταρο τη μπάλα.

Απαντήθηκε 09/12/2008 στις 20:08
πηγή χρήστη

ψήφοι
0

Υπάρχει ένα καλό άρθρο εδώ:

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

Αυτό έχει μια κλάση που χειρίζεται ορισμένες από τις δύσκολες πτυχές του να πάρει αυτό για να λειτουργήσει σωστά, όπως η διατήρηση της γραμμή τίτλου παράθυρο της εφαρμογής ενεργό, το χειρισμό Alt-Tab και την ακύρωση με ένα κλικ του ποντικιού.

Απαντήθηκε 06/07/2012 στις 02:47
πηγή χρήστη

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