IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Développement graphique de UserControl


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Automaticien
    Inscrit en
    Mars 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 11
    Par défaut Développement graphique de UserControl
    Bonjour,

    Je code en C# maintenant depuis un an et je commence à développer des choses intéressantes. Je suis automaticien et j'ai comme projet de développer un système le plus complet possible avec un PC. Le PC me sert d'automate, de serveur base de données et de moyen de supervision. Pour l'instant je communique avec des base d'entrées/sorties déportés grâce à mes méthodes MODBUS, je peux enregistrer des évenement dans des bases de données, etc.... Pour l'instant je suis assez content de mon travail .
    Une seule chose me pose problème: l'interface graphique. j'aimerai créer des objets utilisateurs pour ma partie supervision mais une chose me gène: c'est le fond du UserControl. Comment me débarrasser de ce fond? Imaginons que je crée un UserControl avec un cercle et un bouton, je me retrouve avec un fond très grand. Si je veux placer ce UserControl sur ma page de supervision, ce fond va venir cacher d'autres élément que j'aurais posé sur cette page.Nom : Capture.PNG
Affichages : 352
Taille : 2,2 Ko
    Sur cette image la ligne est effacé par le fond du UserControl alors que ce que j'aimerai, c'est qu'elle ne soit cachée que par le cercle par exemple.
    J'ai vraiment besoin d'aide pour cet aspect graphique dans lequel je suis complètement incompétent.

    Je remercie d'ores et déjà tous ceux qui prendront le temps de lire ces quelques lignes et de passer un peu de temps à réfléchir à mon problème.

    Cordialement

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    bonjour,

    Tout d abord je tiens a te feliciter pour l attention et la tenacité que tu portes a ce domaine en tant qu auto didacte
    Concernant la gestion de la transparence il existe 2 possibilités :

    1- depuis le constructeur de ton usercontrol tu ajoutes forces la gestion de la transparence ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.BackColor = Color.Transparent;
    NB : il faudra prevoir la notion de controles contenant contenu sinon la transparence seea mal geree.

    2- grace aux methodes : onPaint et createParams :

    http://stackoverflow.com/questions/9...ol-transparent

    Bon codage

  3. #3
    Membre averti
    Homme Profil pro
    Automaticien
    Inscrit en
    Mars 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 11
    Par défaut
    Merci pour cette réponse si rapide.

    Je n'arrive pas à obtenir le résultat souhaité. Je pense que cette notion de transparence est en fait un "mensonge" (oups ). En fait je pense que derrière cette propriété se trouve un code qui pompe les propriétés de couleur et de texture du contrôle parent. En fait il ne disparaît jamais. En fouillant sur internet j'ai vu que certain parlait de bibliothèque SDL ou XNA pour la partie graphique mais j'avoue ne pas avoir trouvé beaucoup d'explication sur ces bibliothèques, et le peu que j'ai trouvé m'a paru inabordable, bien trop spécifique aux développeur confirmé.

    Si quelqu'un a des informations la dessus je suis preneur

    Cordialement.

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    Salut,

    il me semble que la transparence en windows form s'appuie un peu sur le ZOrder, mais effectivement, ne permet pas d'empiler 10 controles correctement.

    En général, une des solutions est d'avoir un seul userControl qui fait le boulot, ou bien d'utiliser lors du draw d'un control, la portion d'écran du parent ou se trouve
    le control à dessiner

    Celà dit, en faisant celà, on ne va pas gérer le chevauchement de UserControl...


    De toute façon, les UserControl n'ont pas d'Opacity (que ça soit le control personnalisé ou le User Control de base).

    Peut-être en basculant sur WPF, tu aurais ce type de comportement...

    Sinon, tu peux aussi te faire ton propre outil de dessin genre un PanelBoard dans lequel tu ajouterais tes "controles" qui seraient des shapes que tu dessinerais toi même et au final,
    comme tu aurais un control qui dessinerait tout, tu y arriverais...

    C'est ce genre d'approche qui est utilisée quand on veut faire un canvas en winforms affichant plus de "shape" (je mets entre guillemets car la notion de shape / canvas n'existe pas
    vraiment en Winforms...

    Ce qui veut dire que tu te fais ta propre librairie de controles ... genre un Panel qui un Usercontrol, et des shapes qui seront ta propre classe

    Si besoin, possible de t'aider si tu trouves celà trop compliqué (en fait, c'est assez simple à faire.. mais bon, faut prendre le temps de créer les objets de base !!!

  5. #5
    Membre averti
    Homme Profil pro
    Automaticien
    Inscrit en
    Mars 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 11
    Par défaut
    Merci TheMonz pour cette réponse,

    Je t'ai relue plusieurs fois et je t'avoue que je ne comprend pas tout. Pas que tu ne sois pas clair mais plutôt qu'il y a des notions qui m'échappent. En fait comme je le disais dans mon premier message, je souhaite créer un système mais le but est de permettre de l'utiliser simplement. Le UserControl que j'ai montré sur mon premier message possède une foule de propriétés qu'un futur utilisateur pourra modifier, ce contrôle est rattacher à un objet via une propriété. L'utilisateur entrera une chaîne de caractère correspondant au nom de l'objet qui aura été instancié au lancement de l'application.
    En instanciant l'objet, l'utilisateur, sans le savoir, l’intègre à un Dictionnaire<string,objet> et le comportement de l'objet influencera le graphisme du userControl. Donc le principe UserControl est idéal pour moi. C'est cette aspect graphique qui est contraignant pour rendre quelques chose de conviviale.
    Alors peut être que l'on peut faire tout cela avec la méthode que tu me décris mais j'ai besoin de plus d'explication.

    Cordialement

  6. #6
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Il y a éventuellement une piste à creuser de ce côté ici et (ce sont des boutons mais il y a une bonne gestion de la superposition des contrôles et de la zone du click par exemple).

    Personnellement je m'en inspirerai (sans oublier les crédits adequats)


    Bonne continuation.

  7. #7
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Ben oui ,c'est un vrai mensonge tu as raison...
    Tomlev l'as appele fort justement la "transparence debile" !!!

    Tout ce que tu trouveras sur les formuns des "fakes" ou semblants de transparence...

    Le probleme des Winforms est que chaque control est responsable de la peinture ou dessin de sa zone cliente y compris l'arriere-plan ...
    Il s'ensuit que si l'on devait voir entierement ou partiellement (si transparence il y avait) un vrai control button ou un label derriere ton UserControl....Cela exigerait de repeindre toute l'arboresecence de controls meme partiellement chevauchees par ton UserControl mais qui appartiennent au Form & qui n'appartienent pas à ton UserControl ....
    En bref l'integralite du Form...!!!
    Pour resoudre ce probleme il faut l'algo du "peintre" Renoir ,puisqu'un bon peintre dessine les objets les plus eloignes puis remonte vers les plus proches....
    Celui--ci n'est pas implemente dans les winforms...
    En Wnforms,chaque control redessine son arriere-plan avec le BackColor du Parent et se contente de redessiner ses controls enfants...

    Seul les Winforms du WPF utilise l' algo du meticuleux "Peintre" Renoir qui gere parfaitment la transparence ,et le HitTestVisible de souris ...On peut cliquer sur un control place derriere un autre control !!!
    Bon code....

  8. #8
    Membre averti
    Homme Profil pro
    Automaticien
    Inscrit en
    Mars 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 11
    Par défaut
    Wouah, Merci pour ce message. Finalement je me trompe pas tant que ça sur le fonctionnement globale de Visual studio.

    Alors pour le WPF, je ne connais pas. J'ai déjà programmer en HTML et j'ai vu que les deux codes se ressembler un peu, au moins visuellement ( balise, etc...).

    Puis-je créer un usercontrol WPF et l'utiliser dans un projet WinForm?? tel est la question?

    Je sais que si je veux progresser, il faut que je passe au WPF car Visual Studio nous oriente de plus en plus vers cette façon de faire.

    Voici donc une excellente raison de laisser mon projet en Suspend et de me plonger la dedans.

    Cordialement.

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    lu en diagonale, mais je confirme déjà que la transparence du winforms c'est du bricolage qui ne convient pas si des controles se chevauchent
    et aussi que wpf est un autre framework graphique de .net qui est très efficace sur le graphisme et qui permet de gérer ça
    par contre wpf nécessite de recommencer l'interface à 0, et si ton code n'est pas dissocié entre interface et code ca oblige à reprendre à aussi
    de plus wpf est un peu déroutant au début car ca ne s'utilise pas de la même manière (mais ca reste plaisant)


    il reste une solution, c'est de faire toi même ton moteur de rendu
    ca parrait compliqué dit comme ca, mais ca reste faisable je pense (enfin j'en ai déjà fait)

    pour ca il te faut des classes qui remplaceront tes usercontrol, avec les mêmes propriétés, mais il faut que ca soit des classes non graphiques
    il te faut aussi un parent qui s'occupe d'héberger ces "controles", et faire toi même un système de dessin sur chaque classe "controle" (que le parent appelera)
    il y a tout ce qu'il faut (drawline, drawrectangle, drawellipse, fill*, drawstring ...)
    tu peux au passage ajouter plusieurs fonctionnalités comme le zoom ou la modification de l'interface à l'exécution
    il faudra aussi gérer les clics, pour ca il y a aussi des choses simples, dans le principe seul le parent sera appelé sur onclick, mais il peut demander à chaque hébergé s'il contient les coordonnées de la souris (hittest)

    (il faut compter plusieurs centaines de lignes de code, connaitre comment fonctionne le rendu en winforms peut aider)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Développement graphique en C#
    Par Nowwis dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/12/2009, 07h42
  2. [C#] Développement graphique (dessin).
    Par insane_80 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/10/2008, 11h41
  3. Réponses: 4
    Dernier message: 10/06/2008, 12h54
  4. c/c++ développement graphique
    Par ggnore dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 02/09/2004, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo