Bonjour,
Je me pose une question d'ordre conceptuelle :)
Comme dans le démineur, je cherche à créer un logiciel qui réagit en fonction
de zone où on clique. Par exemple dans ma zone de paint, j'aurais une grille
et
quand je clique sur un carré ça le colorie selon la couleur que j'aurais
choisi
(sachant que ça n'ira pas plus loin que ce coloriage par case).
Je ne sais pas comment concevoir cette "grille" au mieux, et récupérer
correctement la zone carrée qui a été cliquée. Ma première idée est de faire
une division par le nombre de carrés sur la longueur, et un modulo par le
nombre de carrés sur la largeur afin d'obtenir la position du vrai carré
(pour transformer les coordonées du clic en coordonées dans mon tableau).
N'y a t'il pas une meilleure technique plus puissante ?
Merci de m'éclairer :)
Bonjour,
Je me pose une question d'ordre conceptuelle :)
Comme dans le démineur, je cherche à créer un logiciel qui réagit en fonction
de zone où on clique. Par exemple dans ma zone de paint, j'aurais une grille
et
quand je clique sur un carré ça le colorie selon la couleur que j'aurais
choisi
(sachant que ça n'ira pas plus loin que ce coloriage par case).
Je ne sais pas comment concevoir cette "grille" au mieux, et récupérer
correctement la zone carrée qui a été cliquée. Ma première idée est de faire
une division par le nombre de carrés sur la longueur, et un modulo par le
nombre de carrés sur la largeur afin d'obtenir la position du vrai carré
(pour transformer les coordonées du clic en coordonées dans mon tableau).
N'y a t'il pas une meilleure technique plus puissante ?
Merci de m'éclairer :)
Bonjour,
Je me pose une question d'ordre conceptuelle :)
Comme dans le démineur, je cherche à créer un logiciel qui réagit en fonction
de zone où on clique. Par exemple dans ma zone de paint, j'aurais une grille
et
quand je clique sur un carré ça le colorie selon la couleur que j'aurais
choisi
(sachant que ça n'ira pas plus loin que ce coloriage par case).
Je ne sais pas comment concevoir cette "grille" au mieux, et récupérer
correctement la zone carrée qui a été cliquée. Ma première idée est de faire
une division par le nombre de carrés sur la longueur, et un modulo par le
nombre de carrés sur la largeur afin d'obtenir la position du vrai carré
(pour transformer les coordonées du clic en coordonées dans mon tableau).
N'y a t'il pas une meilleure technique plus puissante ?
Merci de m'éclairer :)
Comme dans le démineur, je cherche à créer un logiciel qui réagit en
fonction
de zone où on clique. Par exemple dans ma zone de paint, j'aurais une grille
et
quand je clique sur un carré ça le colorie selon la couleur que j'aurais
choisi
(sachant que ça n'ira pas plus loin que ce coloriage par case).
Comme dans le démineur, je cherche à créer un logiciel qui réagit en
fonction
de zone où on clique. Par exemple dans ma zone de paint, j'aurais une grille
et
quand je clique sur un carré ça le colorie selon la couleur que j'aurais
choisi
(sachant que ça n'ira pas plus loin que ce coloriage par case).
Comme dans le démineur, je cherche à créer un logiciel qui réagit en
fonction
de zone où on clique. Par exemple dans ma zone de paint, j'aurais une grille
et
quand je clique sur un carré ça le colorie selon la couleur que j'aurais
choisi
(sachant que ça n'ira pas plus loin que ce coloriage par case).
Ma première idée est
de faire une division par le nombre de carrés sur la longueur, et un
modulo par le nombre de carrés sur la largeur afin d'obtenir la
position du vrai carré (pour transformer les coordonées du clic en
coordonées dans mon tableau).
Ma première idée est
de faire une division par le nombre de carrés sur la longueur, et un
modulo par le nombre de carrés sur la largeur afin d'obtenir la
position du vrai carré (pour transformer les coordonées du clic en
coordonées dans mon tableau).
Ma première idée est
de faire une division par le nombre de carrés sur la longueur, et un
modulo par le nombre de carrés sur la largeur afin d'obtenir la
position du vrai carré (pour transformer les coordonées du clic en
coordonées dans mon tableau).
Bonjour,Ma première idée est
de faire une division par le nombre de carrés sur la longueur, et un
modulo par le nombre de carrés sur la largeur afin d'obtenir la
position du vrai carré (pour transformer les coordonées du clic en
coordonées dans mon tableau).
C'est exactement ça. Comment faire autrement? La technique qui
consisterait à transformer chaque zone en une fenêtre et à récupérer les
messages souris au niveau de cette fenêtre est bien plus coûteuse.
Je dois avoir un TP MFC que j'utilise pendant mes cours qui est la
transposition en MFC du "Checker" de Petzold déjà cité. Je vous l'envoie
sur réception d'un e-mail.
Bonjour,
Ma première idée est
de faire une division par le nombre de carrés sur la longueur, et un
modulo par le nombre de carrés sur la largeur afin d'obtenir la
position du vrai carré (pour transformer les coordonées du clic en
coordonées dans mon tableau).
C'est exactement ça. Comment faire autrement? La technique qui
consisterait à transformer chaque zone en une fenêtre et à récupérer les
messages souris au niveau de cette fenêtre est bien plus coûteuse.
Je dois avoir un TP MFC que j'utilise pendant mes cours qui est la
transposition en MFC du "Checker" de Petzold déjà cité. Je vous l'envoie
sur réception d'un e-mail.
Bonjour,Ma première idée est
de faire une division par le nombre de carrés sur la longueur, et un
modulo par le nombre de carrés sur la largeur afin d'obtenir la
position du vrai carré (pour transformer les coordonées du clic en
coordonées dans mon tableau).
C'est exactement ça. Comment faire autrement? La technique qui
consisterait à transformer chaque zone en une fenêtre et à récupérer les
messages souris au niveau de cette fenêtre est bien plus coûteuse.
Je dois avoir un TP MFC que j'utilise pendant mes cours qui est la
transposition en MFC du "Checker" de Petzold déjà cité. Je vous l'envoie
sur réception d'un e-mail.
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les deux
sont appelés aux mêmes moments)
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les deux
sont appelés aux mêmes moments)
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les deux
sont appelés aux mêmes moments)
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les
deux sont appelés aux mêmes moments)
2. Dans la classe CDocument, quel est la différence entre le
constructeur et OnNewDocument ?
3. Dois-je faire une gestion de clic dans le Document ou dans la View
? Je crois que c'est dans le Document, vu qu'on met notre structure
de données à jour, et on fait un UpdateAllView ensuite... j'ai besoin
d'une confirmation :)
4. Dans un ancien programme MFC que j'avais très mal fait, j'avais
un problème de scintillement... Je sais pas d'où ça vient en même
temps je veux pas trop regarder le code qui est mal foutu...
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les
deux sont appelés aux mêmes moments)
2. Dans la classe CDocument, quel est la différence entre le
constructeur et OnNewDocument ?
3. Dois-je faire une gestion de clic dans le Document ou dans la View
? Je crois que c'est dans le Document, vu qu'on met notre structure
de données à jour, et on fait un UpdateAllView ensuite... j'ai besoin
d'une confirmation :)
4. Dans un ancien programme MFC que j'avais très mal fait, j'avais
un problème de scintillement... Je sais pas d'où ça vient en même
temps je veux pas trop regarder le code qui est mal foutu...
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les
deux sont appelés aux mêmes moments)
2. Dans la classe CDocument, quel est la différence entre le
constructeur et OnNewDocument ?
3. Dois-je faire une gestion de clic dans le Document ou dans la View
? Je crois que c'est dans le Document, vu qu'on met notre structure
de données à jour, et on fait un UpdateAllView ensuite... j'ai besoin
d'une confirmation :)
4. Dans un ancien programme MFC que j'avais très mal fait, j'avais
un problème de scintillement... Je sais pas d'où ça vient en même
temps je veux pas trop regarder le code qui est mal foutu...
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à l'affichage
en une passe en copiant le MemoryDC sur le DC réel. Vous y gagnerez
également en performance.
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à l'affichage
en une passe en copiant le MemoryDC sur le DC réel. Vous y gagnerez
également en performance.
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à l'affichage
en une passe en copiant le MemoryDC sur le DC réel. Vous y gagnerez
également en performance.
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à
l'affichage en une passe en copiant le MemoryDC sur le DC réel. Vous
y gagnerez également en performance.
A quels points de vue?
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à
l'affichage en une passe en copiant le MemoryDC sur le DC réel. Vous
y gagnerez également en performance.
A quels points de vue?
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à
l'affichage en une passe en copiant le MemoryDC sur le DC réel. Vous
y gagnerez également en performance.
A quels points de vue?
JM wrote:Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à
l'affichage en une passe en copiant le MemoryDC sur le DC réel. Vous
y gagnerez également en performance.
A quels points de vue?
Touts les opérations réalisées sur un MemoryDC se font en mémoire et
n'ont pas de réprésentation physique à l'écran: on n'affiche rien. On va
donc nécessairement plus vite que si toutes ces modifications
intermédiaires étaient à chaque fois transmises au buffer d'écran. Ou
dit autrement, les opérations graphiques sur un MemoryDC sont plus
rapides que les mêmes opérations graphiques réalisées à l'écran.
JM wrote:
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à
l'affichage en une passe en copiant le MemoryDC sur le DC réel. Vous
y gagnerez également en performance.
A quels points de vue?
Touts les opérations réalisées sur un MemoryDC se font en mémoire et
n'ont pas de réprésentation physique à l'écran: on n'affiche rien. On va
donc nécessairement plus vite que si toutes ces modifications
intermédiaires étaient à chaque fois transmises au buffer d'écran. Ou
dit autrement, les opérations graphiques sur un MemoryDC sont plus
rapides que les mêmes opérations graphiques réalisées à l'écran.
JM wrote:Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à
l'affichage en une passe en copiant le MemoryDC sur le DC réel. Vous
y gagnerez également en performance.
A quels points de vue?
Touts les opérations réalisées sur un MemoryDC se font en mémoire et
n'ont pas de réprésentation physique à l'écran: on n'affiche rien. On va
donc nécessairement plus vite que si toutes ces modifications
intermédiaires étaient à chaque fois transmises au buffer d'écran. Ou
dit autrement, les opérations graphiques sur un MemoryDC sont plus
rapides que les mêmes opérations graphiques réalisées à l'écran.
TigrouMeow wrote:1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les
deux sont appelés aux mêmes moments)
OnPaint traite le message WM_PAINT. Ce qui concerne donc directement
l'affichage dans une fenêtre. OnDraw est plus neutre et permet au
framework d'utiliser le même code que l'on dessine sur une fenêtre, une
imprimante ou n'importe quel autre device graphique. OnDraw est ce qui
permet la mise en oeuvre de la Print Preview, par exemple.2. Dans la classe CDocument, quel est la différence entre le
constructeur et OnNewDocument ?
La différence est surtout importante pour les applications SDI. Dans ce
cas, le framework ne crée qu'un seul document qui est réutilisé en
permanence pour chaque nouveau document chargé ou créé. Le constructeur
n'est donc appelé qu'une fois pendant toute la vie du programme. Par
contre, OnNewDocument est appelé à chaque utilisation de la commande
"Nouveau Document" même si en réalité, on ne ré-instancie pas un nouveau
document.
Il vaut donc mieux mettre le code d'initialisation dans OnNewDocument car
si vous passez l'appli de MDI (ou d'un autre modèle) à SDI, vous devrez
revoir votre code si vous avez initialisé des données dans le
constructeur.3. Dois-je faire une gestion de clic dans le Document ou dans la View
? Je crois que c'est dans le Document, vu qu'on met notre structure
de données à jour, et on fait un UpdateAllView ensuite... j'ai besoin
d'une confirmation :)
Éternel débat :-) . Le modèle document/vue est en fait un modèle simplifié
dérivé du modèle MVC (Model-View-Controller). S'il est plus simple à gérer
que le modèle MVC, il présente l'inconvénient de ne pas définir clairement
où l'on doit gérer l'interaction avec l'utilisateur. D'où votre question
qui est un grand classique. C'est une des carences majeures des MFCs
comparées à un framework comme OWL (Borland) par exemple (sauf que OWL n'a
pas été repris dans Delphi ce qui est une bêtise regrettable).
Cependant, quelques règles de bon sens peuvent aider. Si l'action en
question n'a d'influence que sur l'état la vue courante, sans impact sur
le document, on peut envisager de la traiter directement au niveau de
cette vue. Si l'action utilisateur modifie l'état du document (et a donc
par conséquent un impact immédiat sur les autres vues connectées sur le
même document), votre raisonnement s'applique. Si l'action en question a
un impact sur l'état de l'application, on la traitera au niveau
application et pas au niveau document.
Tout cela ne vaut pas une bonne implémentation du modèle MVC. Il en existe
une, directement connectable sur les MFC: Objective Toolkit inclus dans
Stingray Studio. Les outils Stingray ont été rachetés par Roguewave, ce
qui est regrettable (par pour les fondateurs de Stingray mais pour les
clients). C'est du code de qualité mais pas très bon marché. Et le support
technique de Roguewave en France laisse à désirer au moins pour certains
produits comme Objective Views. Le code source est fourni.4. Dans un ancien programme MFC que j'avais très mal fait, j'avais
un problème de scintillement... Je sais pas d'où ça vient en même
temps je veux pas trop regarder le code qui est mal foutu...
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à l'affichage en
une passe en copiant le MemoryDC sur le DC réel. Vous y gagnerez également
en performance.
TigrouMeow wrote:
1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les
deux sont appelés aux mêmes moments)
OnPaint traite le message WM_PAINT. Ce qui concerne donc directement
l'affichage dans une fenêtre. OnDraw est plus neutre et permet au
framework d'utiliser le même code que l'on dessine sur une fenêtre, une
imprimante ou n'importe quel autre device graphique. OnDraw est ce qui
permet la mise en oeuvre de la Print Preview, par exemple.
2. Dans la classe CDocument, quel est la différence entre le
constructeur et OnNewDocument ?
La différence est surtout importante pour les applications SDI. Dans ce
cas, le framework ne crée qu'un seul document qui est réutilisé en
permanence pour chaque nouveau document chargé ou créé. Le constructeur
n'est donc appelé qu'une fois pendant toute la vie du programme. Par
contre, OnNewDocument est appelé à chaque utilisation de la commande
"Nouveau Document" même si en réalité, on ne ré-instancie pas un nouveau
document.
Il vaut donc mieux mettre le code d'initialisation dans OnNewDocument car
si vous passez l'appli de MDI (ou d'un autre modèle) à SDI, vous devrez
revoir votre code si vous avez initialisé des données dans le
constructeur.
3. Dois-je faire une gestion de clic dans le Document ou dans la View
? Je crois que c'est dans le Document, vu qu'on met notre structure
de données à jour, et on fait un UpdateAllView ensuite... j'ai besoin
d'une confirmation :)
Éternel débat :-) . Le modèle document/vue est en fait un modèle simplifié
dérivé du modèle MVC (Model-View-Controller). S'il est plus simple à gérer
que le modèle MVC, il présente l'inconvénient de ne pas définir clairement
où l'on doit gérer l'interaction avec l'utilisateur. D'où votre question
qui est un grand classique. C'est une des carences majeures des MFCs
comparées à un framework comme OWL (Borland) par exemple (sauf que OWL n'a
pas été repris dans Delphi ce qui est une bêtise regrettable).
Cependant, quelques règles de bon sens peuvent aider. Si l'action en
question n'a d'influence que sur l'état la vue courante, sans impact sur
le document, on peut envisager de la traiter directement au niveau de
cette vue. Si l'action utilisateur modifie l'état du document (et a donc
par conséquent un impact immédiat sur les autres vues connectées sur le
même document), votre raisonnement s'applique. Si l'action en question a
un impact sur l'état de l'application, on la traitera au niveau
application et pas au niveau document.
Tout cela ne vaut pas une bonne implémentation du modèle MVC. Il en existe
une, directement connectable sur les MFC: Objective Toolkit inclus dans
Stingray Studio. Les outils Stingray ont été rachetés par Roguewave, ce
qui est regrettable (par pour les fondateurs de Stingray mais pour les
clients). C'est du code de qualité mais pas très bon marché. Et le support
technique de Roguewave en France laisse à désirer au moins pour certains
produits comme Objective Views. Le code source est fourni.
4. Dans un ancien programme MFC que j'avais très mal fait, j'avais
un problème de scintillement... Je sais pas d'où ça vient en même
temps je veux pas trop regarder le code qui est mal foutu...
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à l'affichage en
une passe en copiant le MemoryDC sur le DC réel. Vous y gagnerez également
en performance.
TigrouMeow wrote:1. Quel est la différence entre OnDraw et OnPaint ?
(pour l'instant je n'utilise que OnDraw, et j'ai l'impression que les
deux sont appelés aux mêmes moments)
OnPaint traite le message WM_PAINT. Ce qui concerne donc directement
l'affichage dans une fenêtre. OnDraw est plus neutre et permet au
framework d'utiliser le même code que l'on dessine sur une fenêtre, une
imprimante ou n'importe quel autre device graphique. OnDraw est ce qui
permet la mise en oeuvre de la Print Preview, par exemple.2. Dans la classe CDocument, quel est la différence entre le
constructeur et OnNewDocument ?
La différence est surtout importante pour les applications SDI. Dans ce
cas, le framework ne crée qu'un seul document qui est réutilisé en
permanence pour chaque nouveau document chargé ou créé. Le constructeur
n'est donc appelé qu'une fois pendant toute la vie du programme. Par
contre, OnNewDocument est appelé à chaque utilisation de la commande
"Nouveau Document" même si en réalité, on ne ré-instancie pas un nouveau
document.
Il vaut donc mieux mettre le code d'initialisation dans OnNewDocument car
si vous passez l'appli de MDI (ou d'un autre modèle) à SDI, vous devrez
revoir votre code si vous avez initialisé des données dans le
constructeur.3. Dois-je faire une gestion de clic dans le Document ou dans la View
? Je crois que c'est dans le Document, vu qu'on met notre structure
de données à jour, et on fait un UpdateAllView ensuite... j'ai besoin
d'une confirmation :)
Éternel débat :-) . Le modèle document/vue est en fait un modèle simplifié
dérivé du modèle MVC (Model-View-Controller). S'il est plus simple à gérer
que le modèle MVC, il présente l'inconvénient de ne pas définir clairement
où l'on doit gérer l'interaction avec l'utilisateur. D'où votre question
qui est un grand classique. C'est une des carences majeures des MFCs
comparées à un framework comme OWL (Borland) par exemple (sauf que OWL n'a
pas été repris dans Delphi ce qui est une bêtise regrettable).
Cependant, quelques règles de bon sens peuvent aider. Si l'action en
question n'a d'influence que sur l'état la vue courante, sans impact sur
le document, on peut envisager de la traiter directement au niveau de
cette vue. Si l'action utilisateur modifie l'état du document (et a donc
par conséquent un impact immédiat sur les autres vues connectées sur le
même document), votre raisonnement s'applique. Si l'action en question a
un impact sur l'état de l'application, on la traitera au niveau
application et pas au niveau document.
Tout cela ne vaut pas une bonne implémentation du modèle MVC. Il en existe
une, directement connectable sur les MFC: Objective Toolkit inclus dans
Stingray Studio. Les outils Stingray ont été rachetés par Roguewave, ce
qui est regrettable (par pour les fondateurs de Stingray mais pour les
clients). C'est du code de qualité mais pas très bon marché. Et le support
technique de Roguewave en France laisse à désirer au moins pour certains
produits comme Objective Views. Le code source est fourni.4. Dans un ancien programme MFC que j'avais très mal fait, j'avais
un problème de scintillement... Je sais pas d'où ça vient en même
temps je veux pas trop regarder le code qui est mal foutu...
Pour éviter le scintillement, effectuez toutes les manipulations
graphiques sur un DC en mémoire (MemoryDC) puis procédez à l'affichage en
une passe en copiant le MemoryDC sur le DC réel. Vous y gagnerez également
en performance.