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

MFC Discussion :

Comment marche l'affichage du curseur de la souris ?


Sujet :

MFC

  1. #1
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut Comment marche l'affichage du curseur de la souris ?
    Tout ma question est dans le titre

    J'aimerai comprendre comment Windows fait pour afficher la souris alors que, par exemple, elle n'apparait pas à l'impression d'écran. Y a-t-il plusieurs couches graphiques menant au rendu final à l'écran ? si oui comment les manipuler (get & set) ? Ma question dépasse au final largement le cadre de la souris, mais je pense que le cas de la souris a au moins le mérite d'être connu par tout le monde

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par MSDN
    When the user moves the mouse, the system moves the cursor accordingly.
    Citation Envoyé par MSDN
    The system automatically displays a cursor for the mouse and updates its position on the screen.
    J'aurais tendance à en conclure que l'OS s'en charge tout seul.

    Dans un rendu écran, Windows doit probablement se charger de coordonner le rendu de tous les composants (fenêtre, souris, taskbars...).
    Dans une impression, un DC dédié est donné à la fenêtre... c'est pourquoi seul ce qu'il y a sur la fenêtre est imprimé.

    Que veux tu faire au juste ?

  3. #3
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Merci de t'intéresser à mon pb.

    Je voudrais réaliser une application qui permet d'afficher une partie de ce qui se trouve à l'écran puis lui appliquer des effets (déformation, ...).
    Le problème c'est que l'appli fait partie de la zone qu'elle doit afficher, mais je ne veux pas qu'elle s'affiche elle-même. Je veux de plus que ceci marche sur un contenu dynamique (une vidéo par exemple) : pas la peine donc de me parler de faire une impression de tout ce qu'il y a à l'écran puis de faire tourner mon appli sur ces données

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Posons la chose à l'envers. Quel serait le fonctionnement idéal de ton appli ?
    En gros, qu'attends-tu comme service?

  5. #5
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Dans l'idéal je pourrais écrire dans plusieurs couches graphiques différentes.
    Par observation j'ai l'impresion qu'un tel mécanisme existe déjà : à vu de nez je pourrais identifier celle de la souris, celle des fenêtres ou encore celle des flux vidéos.
    Le rendu final à l'écran étant la compositions de toutes ces couches.
    J'aimerai donc pouvoir afficher sur une couche le contenu (ou partie) d'une autre ce qui me permet d'avoir mon appli à l'écran sans "qu'elle se voit elle-même".

    Ai-je était assez compréhensible ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Dans ce que j'ai vu (mais ça date déjà un peu) pour appliquer une déformation, l'appli se mettait en mode plein écran, capturait le rendu des autres applis, appliquait la déformation et faisait le rendu sur sa propre vue. Je ne sais pas trop si ce que tu veux faire est possible... J'avoue ne pas voir de piste. A moins de pouvoir se mettre directement au niveau du rendu de la carte graphique ?

  7. #7
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    L'appli ne doit pas se traiter récursivement c'est là le cœur de mon problème
    Je présume que le terme de "couche graphique" est peut-être impropre.
    Si quelqu'un sait comment est géré l'affichage des lecteurs vidéos je pense que ça pourrait être un bon début de piste.

    Merci d'avance.

  8. #8
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    peut être quelques infos par ici : http://msdn.microsoft.com/en-us/libr...08(VS.85).aspx

    en passant par DirectDraw ...

    @+

  9. #9
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    J'ai un peu repris ce sujet en main (j'avais malheureusement des choses plus urgentes à traiter), et je me heurte toujours au même problème.
    En effet j'essaye actuellement de développer une loupe et mon soucis c'est, qu'étant donné qu'elle agrandi la zone qui est "sous elle", elle agrandi son propre rendu et donc finalement n'affiche qu'un zone monochrome (l'agrandissement maximum du pixel pointé par la souris).

    Si quelqu'un a déjà pu travailler là-dessus je suis toujours preneur

    PS :
    il faut que le contenu qui puisse être agrandi soit dynamique, travailler simplement sur un état figé de mon affichage ne suffit donc pas (tout aurait été très facile sinon ).

  10. #10
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Re !

    J'ai un peu avancé avec mon curseur, actuellement j'arrive à déterminer mon image et l'afficher (SetCursor), mais je rencontre des soucis de performance (ips, charge du processeur, ...) et il y a une latence lorsque je passe sur des éléments "fils" de ma fenêtre (le curseur disparait puis réapparait).
    De plus mon curseur ne marche pas en dehors de la fenêtre à moins que j'enfonce le clic gauche de la souris sur un élément "fils" et que je le maintienne (down) tout en me promenant sur mon écran (hors de la fenêtre fille).

    Je ne comprends pas trop comment m'en sortir ... si quelqu'un pouvait tenter de m'éclairer ...

    Merci d'avance.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Plus des hypothèses que des certitudes :
    Pour tes problèmes de perfs, la question trivial : créés-tu ou charges-tu à chaque fois le curseur ou alors est-ce que c'est fait une fois pour toute au démarrage de l'application ?
    A chaque fois que tu changes de fenêtre, il y a des notifications. Donc une fenêtre peut très bien avoir un comportement qui ralentit l'affichage local, qui masque ou qui change le curseur, j'imagine.
    Pour changer le curseur en dehors de ton appli, j'aurais tendance à penser à SetSystemCursor. Mais ça doit être du brutal et je n'en connais pas tous les risques ?

  12. #12
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Merci de te pencher sur mon pb
    Tu sembles avoir plutôt bien compris mon soucis, je vais donc préciser les points que tu as abordés.

    Pour tes problèmes de perfs, la question trivial : créés-tu ou charges-tu à chaque fois le curseur ou alors est-ce que c'est fait une fois pour toute au démarrage de l'application ?
    Je le recrée (jusqu'à 24 fois par sec, mais niveau perf ça n'arrive pas a 24 ...) à chaque fois. En effet la loupe que je développe doit pouvoir afficher du contenu dynamique.

    A chaque fois que tu changes de fenêtre, il y a des notifications. Donc une fenêtre peut très bien avoir un comportement qui ralentit l'affichage local, qui masque ou qui change le curseur, j'imagine.
    Sûrement, j'aimerai en fait que mon appli soit indépendante de ceci, voir ne soit même pas rattachée ou dépendante d'une fenêtre.

    Pour changer le curseur en dehors de ton appli, j'aurais tendance à penser à SetSystemCursor. Mais ça doit être du brutal et je n'en connais pas tous les risques ?
    En effet je pense que ç'est plus violent et ça me forcerait à reboot beaucoup trop de fois, mais lorsque j'aurai une appli vraiment stable je le ferai peut-être pour plus de perf. En effet avec le SetCursor je doit systématiquement refaire cet appel (SetCursor) dans le OnMouseMove sous peine de me retrouver avec le curseur "standard" qui revient.

  13. #13
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    J'ai un autre soucis.
    Au bout d'un petit moment d'utilisation j'ai un plantage sur les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        HDC hdc;
        hdc  = ::GetDC(hWnd);
        ...
        HDC hMemDC = CreateCompatibleDC(hdc);
    hMemDC est NULL ...

    Je présume que je dois avoir de grosses fuites mémoire

    First-chance exception at 0x786cdd6e (mfc90d.dll) in ColorCursorTest.exe: 0xC0000005: Access violation reading location 0x00000004.
    Unhandled exception at 0x786cdd6e (mfc90d.dll) in ColorCursorTest.exe: 0xC0000005: Access violation reading location 0x00000004.
    En debug j'ai l'erreur suivante en sortie.

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    J'ai un autre soucis.
    Au bout d'un petit moment d'utilisation j'ai un plantage sur les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        HDC hdc;
        hdc  = ::GetDC(hWnd);
        ...
        HDC hMemDC = CreateCompatibleDC(hdc);
    hMemDC est NULL ...

    Je présume que je dois avoir de grosses fuites mémoire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    First-chance exception at 0x786cdd6e (mfc90d.dll) in ColorCursorTest.exe: 0xC0000005: Access violation reading location 0x00000004.
    Unhandled exception at 0x786cdd6e (mfc90d.dll) in ColorCursorTest.exe: 0xC0000005: Access violation reading location 0x00000004.
    En debug j'ai l'erreur suivante en sortie.
    J'ai un vague souvenir comme quoi l'erreur (si elle peut être dans ton code) serait aussi quelque part dans le GDI. A confirmer.
    Tout ça pour dire que il serait préférable de créer ton Memory DC une fois pour toute et de le détruire à la sortie de l'application.
    Idem pour les curseurs : pourquoi ne pas les créer/charger en début d'application, et ne faire qu'un SetCursor au besoin ?

  15. #15
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Idem pour les curseurs : pourquoi ne pas les créer/charger en début d'application, et ne faire qu'un SetCursor au besoin ?
    vu que l'image change en permanence (je fais une loupe) je suis bien obligé de le recréer.

  16. #16
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    vu que l'image change en permanence (je fais une loupe) je suis bien obligé de le recréer.
    J'avais pas compris que ton curseur représentait l'image grossie. Pourquoi ne pas se trimbaler une fenêtre sans cadre que tu déplaces avec la souris et qui fait l'affichage grossi. Tu peux utiliser dans cette fenêtre un buffer mémoire et tu n'as plus à gérer ton curseur.

  17. #17
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Mais si je fais comme tu me dis, à la première itération ça marche, mais dès la 2ème je regrossis ma propre fenêtre (car elle "zoom" à l'endroit ou elle se retrouve). Ainsi par récursivité je me retrouve avec une zone monochrome qui correspond au "pixel central" grossi à l'infini.

    Tu vois ce que je veux dire ?

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Comment tu récupères ce que tu dois dessiner (agrandir) ? Car ce rendu devrait se faire sans ta fenêtre, ensuite tu fais ton grossissement et après tu envois le tout pour l'affichage effectif.

  19. #19
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Comment tu récupères ce que tu dois dessiner (agrandir) ? Car ce rendu devrait se faire sans ta fenêtre, ensuite tu fais ton grossissement et après tu envois le tout pour l'affichage effectif.
    ah ça je voudrais bien mais comment faire ?

    Actuellement je fais ça :
    - récupération du HDC de la fenêtre sous mon curseur (je préférerai pouvoir récupérer un HDC me permettant de fonctionner partout ...)
    - je crée un autre HDC qui lui est compatible auquel j'attache un HBITMAP
    - je copie la zone qui m'intéresse du 1er HDC dans le 2ème
    - je crée ensuite un curseur à partir de ce CBitmap et je l'affiche

  20. #20
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 518
    Par défaut
    Pour le réaffichage du curseur standard, l'explication est dans le faite que chaque fenêtre (ou classe de fenêtre, je sais plus) est associé un objet curseur qui sera renvoyer par défaut si les messages Windows associés à la gestion du curseur sont transférés aux routines standards de Windows.

    Utilisez un outil comme Spy++ pour voir ces messages.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. comment gérer la position du curseur de la souris
    Par colorid dans le forum Langage
    Réponses: 3
    Dernier message: 16/05/2011, 08h54
  2. Comment connaître l'état du curseur de la souris ?
    Par thenaoh dans le forum Windows
    Réponses: 6
    Dernier message: 23/09/2010, 19h35
  3. Comment connaître l'état du curseur de la souris ?
    Par thenaoh dans le forum Windows
    Réponses: 14
    Dernier message: 15/06/2010, 11h11
  4. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

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