Je voudrais créer un contrôle des flotteurs (potentiellement) en dehors des limites de sa forme contenant. Est-ce possible? Comment puis-je le faire? P>
Cela fonctionnerait beaucoup comme le menu contextuel que je n'ai besoin de pouvoir ajouter d'autres contrôles tels que des boutons et des images. P>
7 Réponses :
Il aurait besoin d'une fenêtre séparée (beaucoup comme un menu contextuel est réellement) - vous pouvez l'envelopper comme un contrôle, qui affiche une forme sans refuge (ce qui vous donnerait même l'option pour des fenêtres non rectangulaires si vous < em> vraiment em> voulait). Comme vous pouvez créer la fenêtre d'un contrôle non visible de la forme parent, vous pouvez conserver une référence à l'enfant pour la manipulation de la communication inter-formulaire. P>
Comment allais-je faire cela?
Jetez un oeil à la Suite DockPanel source et adoptez la technique. P>
Comment un dockpanel float [S] ... en dehors des limites de sa forme [sic] contenant forme code>?
@Nelson: Ce projet mentionné implémente le concept de panneaux flottants et amassés, comme dans Visual Studio. Ils sont implémentés comme une forme mais peuvent être représentés comme un panneau régulier dans un conteneur.
Vous avez raison, mais je ne pense pas que c'est tout à fait ce que l'OP avait en tête basé sur la réponse acceptée. Quoi qu'il en soit, le dockpanel est agréable pour beaucoup de choses.
Il est possible, la propriété Toplevel contrôle ceci. Cependant, le concepteur ne les supporte pas bien, difficile à maintenir le contrôle des contrôles de contrôle des fenêtres de haut niveau au moment de la conception. P>
Au-delà des composants tels que ToolTip et contextMentrip, il existe exactement une classe de niveau supérieur par design, la classe de formulaire. Définissez sa formulaire de formulaire sur None and Controlbox sur FALSE pour créer une fenêtre de base de base que vous pouvez utiliser et em> peupler avec d'autres commandes. P>
Vous voulez un formulaire avec son formulaire de formulaire, si vous voulez qu'il se comporte comme un menu contextuel, vous devez le faire l'afficher sur le gestionnaire d'événements approprié sur votre formulaire principal. Exemple simple ci-dessous dans la définition de l'emplacement et de l'appel du spectacle d'un facteur d'événement de clic de souris.
MyForm form = new MyForm(); form.Location = PointToScreen(new Point(e.X, e.Y)); form.Show();
avoir votre usercontrol code> remplacer créeparams code>. Par exemple: [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle &= 0x00080000; // WS_EX_LAYERED
cp.Style = 0x40000000 | 0x4000000; // WS_CHILD | WS_CLIPSIBLINGS
cp.Parent = GetDesktopWindow();
return cp;
}
}
Ceci a fonctionné pour moi } p> p>
Voici vous pouvez faire pour tous les styles de flotte de contrôle
private void Panel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Panel.Left += e.X - PanelMouseDownLocation.X;
Panel.Top += e.Y - PanelMouseDownLocation.Y;
}
}
private void Panel_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) PanelMouseDownLocation = e.Location;
}
public Point PanelMouseDownLocation { get; set; }