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

Windows Discussion :

HDC, Clipping et compagnie


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut HDC, Clipping et compagnie
    Bonjour,

    Voila ce que je voudrais faire :

    1/ obtenir un DC sur ma fenetre (pour dessiner dessus)
    2/ determiner une region (rectangulaire) sur ce DC dans laquelle le dessin est autorisé (ailleurs, non)
    3/ dessiner dans cette region

    Le 1/ et le 3/, y'a pas de soucis.

    Parcontre, le 2/, j'aimerais que ma region soit un peu particuliere...

    Par exemple :

    - j'ai une fenetre de 500px * 500px
    - je veux dessiner uniquement dans un rectangle de 100px * 100px
    - le coin en haut à gauche de ce rectangle se trouve aux coordonnées (50px,50px) de la fenetre
    - et (c'est là que c'est subtil) les coordonnées à l'INTERIEUR du rectangle definit sont entre 1000px et 1100px (l'origine est decalé).

    En gros :
    - si je dessine un pixel aux coordonnées (1000,1000), il devra apparaitre aux coordonnées (50,50) de la fenetre
    - si je dessine un peixel aux coordonnées (900,1000), il ne devra pas apparaitre dans le fenetre

    Je sais pas si tout le monde a bien suivit, mais ca correspond à definir une region dans ma fenetre dont l'origine est décalée.

    Merci de votre aide !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Les fonctions sur le clipping sont ici:
    http://msdn2.microsoft.com/en-us/library/ms532592.aspx
    Quant aux coordonnées, tu devrais trouver ton bonheur par là:
    http://msdn.microsoft.com/library/de...dspac_784z.asp
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Merci pour le lien sur les transformations de coordonnées, je connaissais pas !

    Donc, si je comprends bien, je peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    // hdc sur une fenetre de 500*500
    hdc = BeginPaint(hwnd, &ps); 
    
    // clipping dans un rect de 100*100 aux coordonnees 50,50
    hrgn = CreateRectRgn(50,50,150,150);   
    SelectClipRgn(hdc, hrgn);
    
    // a partir de la, tout ce que je dessine en dehors de (50,50,150,150)
    // n'apparait pas à l'ecran
    
    // Decalage de l'origine
    OffsetViewportOrgEx(hdc,-1000,-1000,originalOrigin);
    
    // a partir de la, tout ce que je dessine en dehors de (1000,1000,1100,1100)
    // n'apparait pas à l'ecran
    
    // Je transmet le hdc aux fonctions de dessin
    dessinerLeContenu(hdc);
    
    // Fin du dessingae
    EndPaint(hwnd, &ps);

    Mais 2-3 details m'echappent...
    1/ lorsque j'execute OffsetViewportOrgEx, si je dessine un pixel aux coordonnées (1000,1000), il est decalé de (-1000,-1000) et se retrouve donc en (0,0) ou en (50,50) ?

    2/ apres le EndPaint, l'offset introduit par OffsetViewportOrgEx est annulé ou il faut l'annuler à la main pour ne pas genere le reste des fonctions de dessin ?

    3/ en terme de performance, c'est pas trop mechant de demander à windows de gerer tous ces trucs là ?

    4/ si je fait plusieurs OffsetViewportOrgEx à la suite, ils s'accumulent ou se remplacent ?

    Merci pour tout !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je n'en ai NULL idée, je n'ai jamais utilisé ces fonctions.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ah ah !

    J'ai enfin trouvé un truc que tu ne sais pas faire !!

    (ben oui, à chaque fois que je pose une question, c'est toi qui repond et en plus t'as raison, alors j'commencais à croire que t'etais une sorte de robot automatisé qui reponds aux questions...)

    Du coup je teste tout ça ce soir, et si j'arrive à trouver une facon claire de proceder, je ferais un p'tit résumé ici...

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Donc voila, j'ai testé tout ça....

    Comment ça fonctionne :

    - la région de clipping reste relative aux coordonnées non transformées du hDC
    - les fonctions de dessin sont affectées par les transformations de coordonnées
    - une fois que l'on release le dc ou que l'on en crée un autre, les parametres reviennent par défaut, il n'est donc pas necessaire de remettre l'origine à 0 à chaque fin de traitement


    A quoi ça sert ?
    Ben, ouais, ça parait pas evident, pourquoi vouloir dessiner en (1000,1000) et que ça apparaisse en (50,50) ?
    Ben tout simplement, par exemple :
    - pour dessiner une courbe à l'écran : on veut la dessiner uniquement dans un rectangle (donc clipping) et cette courbe a des valeurs pouvant etre tres grandes...
    - pour faire du "scrolling" : avec un code comme ça, il suffit de changer les valeurs de decalage de l'origine entre chaque dessinage pour "scroller" sur toute la courbe...

    donc, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // On recupere un HDC pour dessiner
    m_HDC = BeginPaint(hwnd, &m_PS);
    
    // On definit une region de clipping
    rc.top = 50;
    rc.left = 50;
    rc.bottom = 150;
    rc.right = 150;
    hrgn = CreateRectRgn(50,50,150,150);   
    SelectClipRgn(m_HDC, hrgn);
    
    // A partir d'ici, on ne peut dessiner que entre (50,50) et (150,150)
    FillRect(m_HDC,&rc,brushTest);
    
    // On decale l'origine de 50-1000 = -950 px
    SetViewportOrgEx(m_HDC,-950,-950,&originalOrigin);
    
    // A partir d'ici, si on ecrit en (1000,1000) a l'ecran ca apparait en (50,50)
    
    // On dessine un rectangle en (950,950)
    rc.top = 950;
    rc.left	= 950;
    rc.bottom = 1050;
    rc.right = 1050;
    FillRect(m_HDC,&rc,brushTest2);
    
    // Le rectangle apparait clippé à l'ecran,
    // entre (50,50) et (150,150)
    
    // On annule le clipping
    SelectClipRgn(m_HDC, NULL);
    
    // On annule le decalage : on remet l'origine à (0,0)
    SetViewportOrgEx(m_HDC,0,0,&originalOrigin);
    
    // Finit de dessiner
    EndPaint(hwnd, &m_PS);
    En tout cas, merci Medinoc pour tes nombreuses reponses qui ne sont jamais a coté de la plaque, et au moins quand tu sais pas, toi t'inventes pas, tu renvoie juste sur la doc, c'est vachement mieux !

    Au fait, quelqu'un sait l'influence que ça a sur les performances, d'utiliser les fonctions SelectClipRgn et SetViewportOrgEx a tout va ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX] Scrollbar associée à un movie-clip
    Par dens63 dans le forum Flash
    Réponses: 19
    Dernier message: 05/06/2006, 11h41
  2. [FLASH MX2004] Clip qui ne s'arrête pas
    Par romain starck dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 10/05/2006, 19h43
  3. Pb d'action sur un clip
    Par bencasp dans le forum Flash
    Réponses: 4
    Dernier message: 22/10/2003, 17h11
  4. Clipping et projection orthogonale
    Par Luke-77 dans le forum DirectX
    Réponses: 4
    Dernier message: 01/10/2003, 20h02
  5. Chemin d'accès au clip et scenario en flash
    Par Gential dans le forum Flash
    Réponses: 4
    Dernier message: 28/02/2003, 10h10

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