10
votes

C # contrôle en dehors des limites des parents?

J'ai découvert que les contrôles d'enfants ne sont pas dessinés à l'extérieur des limites de leurs parents. Donc, si j'ai un bouton qui sort des panneaux à droite, il est dessiné à mi-chemin de la partie où le panneau se termine.

2 questions: strong> p>

  • Y a-t-il tout moyen fort> d'avoir des contrôles d'enfants en dehors des limites des parents (avec quelques astuces peut-être)? Li>
  • Quelle est la raison de cette limitation? (Je veux comprendre que) li> ul>

    p>


    Exemple fort>

    avec 2 boutons: B1 est le Big Parent, B2 Le petit enfant: P>

    public Form1()
    {
        Size = new Size(800, 600);
    
        Button b1 = new Button();
        b1.Text = "hello world";
        b1.SetBounds(0,0,256,128);
        Controls.Add(b1);
    
        Button b2 = new Button();
        b2.Text = "abcdefghijklmnopqrstuvwxyz";
        b2.SetBounds(192,32,128,64);
        b1.Controls.Add(b2);
    }
    


1 commentaires

Je suis curieux: pourquoi veux-tu faire ça?


3 Réponses :


6
votes

a < Code> Formulaire est un contrôle également, il se comporte donc beaucoup comme d'autres commandes.

La limitation du rendu provient du fait que les commandes sont des fenêtres dans le système d'exploitation qui représentent simplement une zone rectangulaire de l'écran. Une fenêtre ne peut rien dessiner en dehors de ses propres limites, donc si un contrôle des enfants est placé en dehors de ces limites, ce ne sera pas rendu (ou partiellement, en fonction de sa position).

Il n'y a pas de solution facile autour de cela et tout le concept de contrôle des enfants tourne autour du parent contrôlant ce qui est tiré. Si vous souhaitez dessiner un contrôle des enfants en dehors des limites de son parent, supprimez l'enfant du parent, puisque la relation ne s'applique pas vraiment.

Vous pouvez proposer un code de rendu personnalisé qui fonctionnerait autour de cela, mais les contrôles ne seraient pas de vrais enfants d'autres conteneurs et que vous devriez écrire une bonne quantité de code de rendu pour le faire fonctionner. Il peut y avoir des situations dans lesquelles ce serait le comportement souhaité, mais dans la plupart des cas, le comportement du système par défaut est meilleur (et signifie moins de travail pour le programmateur).

Vous pouvez obtenir un effet visuel d'un bouton "à l'extérieur" du formulaire en rendant sur mesure le formulaire (c'est-à-dire qu'il est en train de le dessiner plus petit que celui-ci) puis rendu le bouton dans l'espace vide. C'est cependant beaucoup de travail et je ne suis pas sûr que vous voudriez prendre cette route.

Si vous essayez de faire une interface utilisateur de fantaisie où certaines commandes sont formées comme une blob (pas comme un rectangle) ou ils semblent flottants (détachés de l'interface utilisateur "principale", semblable à certains lecteurs multimédias, etc.: Ces programmes font toute la chose de rendu personnalisée; Leurs fenêtres sont toujours des fenêtres rectangulaires mais pendant le rendu, ils utilisent des images transparentes et des régions pour rendre le formulaire.

Il vous aiderait si vous avez ajouté plus de détails à votre question de savoir pourquoi voulez-vous faire cela.


2 commentaires

Je travaille simplement sur un contrôle avec des fonctionnalités très complexes et je dois la diviser à quelques contrôles d'enfants pour faciliter le développement. Pensez-vous qu'il serait bon d'avoir un grand parent pour mon "parent" et c'est des enfants qui ont donné 1 nouveau grand parent et tous les contrôles que j'ai maintenant en tant que frères et sœurs? Et non à la partie de l'interface utilisateur fantaisie ^^


@ N4PGamer Je suis désolé, je ne comprends pas bien mais laissez-moi essayer de répondre. Si vous avez un contrôle personnalisé complexe que vous effectuez, alors oui, divisez de plus petits morceaux dans d'autres contrôles personnalisés, puis incluez-les dans le contrôle personnalisé principal en tant qu'enfants. Si vous ajoutez plus de détails sur la structure du contrôle, je vais essayer d'ajouter davantage à la réponse.



0
votes

dans Winforms, il n'est pas possible de dessiner en dehors des limites d'un contrôle.

Le moyen le plus simple de limiter un bouton à l'intérieur d'un panneau consiste à utiliser la propriété ancreur de manière appropriée. Les boutons généralement sont correctement alignés. Si vous souhaitez conserver cet alignement lorsque le panneau est redimensionné, dockez le bouton situé sur le côté droit. Si le bouton est à l'ancrage inférieur en bas, sinon au sommet.

Si vous souhaitez que le bouton redimensionne avec la largeur du panneau, puis dockez-le à gauche et à droite en même temps et en bas au haut ou en bas.

Entrez la description de l'image ici>
Image trouvée ici: Mise en route avec Windows Formulaires: Ancrez les boutons au bas droit .


0 commentaires

3
votes

Vous ne pouvez pas dessiner en dehors des modes de contrôle / des parents. Cependant, vous pouvez placer le contrôle dans l'un des ancêtres des parents.

Ceci est un code que j'utilise pour créer un menu déroulant lorsque ce contrôle personnalisé est basculé: xxx

Le DropdownMenu est un contrôle qui est configuré ailleurs dans le constructeur de ce contrôle.

i Commencez par obtenir la principale la plupart des parents, car je vérifie chaque parent, je reçois également une valeur X et Y en cours de la position des commandes relatif au parent.

Si ce contrôle est basculé puis je l'ajoutez au sommet le plus parent et définissez sa position, sinon je l'enlève.

Je suis sûr qu'il existe des moyens plus complexes et cela peut ne pas fonctionner dans toutes les circonstances, mais cette solution fonctionne parfaitement pour Moi écrit un bouton de menu .NET CF.


2 commentaires

Je crois que cela ne fonctionnera pas avec des winforms car la forme active n'a pas de parent.


À condition que vous ne vouliez pas dessiner en dehors du niveau supérieur (c'est-à-dire le formulaire), cela fonctionne. La première partie de l'exemple sélectionne l'élément de niveau supérieur qui est dans la plupart des cas la forme. Ceci est idéal pour .NET CF sur des appareils mobiles où le formulaire est généralement plein écran.