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

  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 : 43
    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
    Points : 734
    Points
    734
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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

  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 : 43
    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
    Points : 734
    Points
    734
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je n'en ai NULL idée, je n'ai jamais utilisé ces fonctions.

  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 : 43
    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
    Points : 734
    Points
    734
    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 : 43
    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
    Points : 734
    Points
    734
    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