|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Bonjour !
A partir de cet excellent tutoriel, j'ai écrit un petit exemple qui résume les principes du dessin dans une fenêtre au moyen de la librairie des objets Windows. Autrement le point particulier auquel je me suis intéressé, c'est le moyen de faire un dégradé. J'ai repris une formule qui consiste à faire varier la couleur du pixel en fonction d'une distance. Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
10
|
|
|
#2 |
![]() ![]() ![]() |
Superbe !
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Merci pour vos encouragements, maître Alcatîz !
Je cherchais comment obtenir une fenêtre qu'on ne puisse pas redimensionner, et je suis tombé sur un parfait petit exemple de fenêtre sans bordure ni barre de titre. Je l'ai légèrement modifié pour le rendre un peu plus joli. Je voulais me servir de la procedure Drawtext mais je n'y suis pas arrivé. Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#4 | |||
![]() ![]() ![]() |
Citation:
Par exemple, pour centrer horizontalement le texte avec une marge supérieure de 50 pixels : Code :
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
|||
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Parfait ! Merci pour le code.
![]() Dans la foulée j'ai trouvé comment changer la police. Code :
Je joins le fichier compilé. (Cliquez sur la fenêtre pour la fermer.)
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
La plupart des exemples qu'on trouve ici et là sont en C ou C++. A force d'en lire depuis deux jours je commence à m'y faire.
Je viens de tomber sur l'exemple TYPER.C de Charles Petzold. J'y ai trouvé cette ligne qui permet de rétablir la police par défaut : Code :
DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))) ;
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#7 |
![]() ![]() ![]() |
En fait, la fonction SelectObject retourne toujours le handle de l'objet précédemment sélectionné, ce qui permet de le restaurer très simplement après coup. Il faut d'ailleurs toujours adopter le réflexe de restaurer un contexte de périphérique dans son état initial avant sa libération.
Pour éviter de recréer la police F à chaque exécution de la méthode Paint, il vaut mieux la créer par exemple dans le constructeur Init, stocker son handle dans un champ de tFenetre et la détruire dans le destructeur Done. Au sujet de l'inclusion d'une police comme ressource, de quel type est-elle ?
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
|
00
|
|
|
#8 | ||||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
![]() Citation:
Code :
__________________
L'Art est long et le Temps est court. |
||||
|
|
00
|
|
|
#9 |
![]() ![]() ![]() |
Cela ne me semble pas évident du tout et je n'ai jamais essayé.
A priori, je pense que, dans Borland Resource Workshop, il faut faire File / Add file to project, sélectionner comme type de ressource User resource data puis choisir le fichier ttf ; il faut alors créer un nouveau type de ressource (par exemple TTFFONT) et attribuer à ce nouveau type un identificateur supérieur à 255. Dans le programme, le handle de la ressource peut être retourné par la fonction FindResource et ce handle peut être utilisé avec la fonction LoadResource. Cette dernière fonction contient un handle vers un bloc de mémoire globale ; pour obtenir l'adresse réelle de la ressource, je pense qu'il faut utiliser LockResource. Ensuite, cela se corse car je pense qu'il faut faire appel à la fonction AddFontMemResourceEx, qui n'est pas implémentée dans Virtual Pascal et qu'il faut déclarer comme fonction externe dans la bibliothèque gdi32. Bref, ça me semble assez compliqué. Mais à coeur vaillant, rien d'impossible !
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Merci pour l'explication. Je vais continuer à étudier la question. En attendant, je me contenterai d'inclure le fichier TTF dans mon archive.
J'ai modifié l'exemple "GDI Demo" de TPW pour ne garder que la partie concernant les polices de caractères. J'ai tenté, sans succès jusqu'à présent, d'en faire une version Virtual Pascal. Le code se compile, mais à l'exécution la fenêtre ne s'ouvre pas. Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#11 |
![]() ![]() ![]() |
Une exception est déclenchée dans la fonction EnumerateFont. Cette exception disparaît lorsqu'on lui donne comme dernier paramètre l'adresse d'une variable de type lParam, et non Nil.
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
|
00
|
|
|
#12 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Merci pour l'indication. Voici la modification que j'ai faite :
Code :
EnumFonts(TheDC, nil, EnumProc, @NumFonts); // ?
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#13 |
![]() ![]() ![]() |
Surtout que plusieurs fonctions utilisées dans l'exemple de TPW sont obsolètes et n'existent plus dans l'API de Windows que par souci de compatibilité avec l'API 16 bits.
Par exemple, GetTextExtent est à présent remplacée par GetTextExtentPoint, qui fonctionne de la même façon sauf qu'il faut lui passer comme paramètre une structure de type TSize. Autre exemple : EnumFonts est remplacée par EnumFontFamilies, qui nécessite comme fonction callback une fonction de type EnumFontFamProc, dont les paramètres sont quelque peu différents de la fonction EnumerateFont. P.S. Dans les exemples fournis avec Virtual Pascal, il y a un programme CHESS dans le répertoire W32.
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
|
00
|
|
|
#14 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Pour mettre en pratique ces nouvelles connaissances, j'ai commencé un jeu d'échecs.
Afin que l'échiquier soit redessiné quand une pièce a été déplacée, j'ai utilisé l'instruction suivante : Ça fonctionne mais ce n'est pas très esthétique. L'échiquier étant un texte et non pas un dessin point par point, il y a un blanc entre les deux images. Après consultation de l'aide de Win32, j'ai pensé changer la valeur du second paramètre au moyen de la fonction SetRect() afin que seules les cases modifiées soient redessinées. Seulement je ne sais pas ce que c'est qu'une "structure Rect" et je connais encore moins son adresse. Comment déclarer et manipuler une "structure Rect" ?
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#15 | ||||
![]() ![]() ![]() |
Tu peux très utilement consulter le code source de l'unité Windows, qui se trouve dans le répertoire Source\Rtl.
La déclaration du type TRect est : Code :
Un petit truc : pour forcer le réaffichage immédiat du petit rectangle qui est rendu invalide par InvalidateRect, tu peux exécuter UpdateWindow tout de suite après. P.S. A l'exécution, j'obtiens plein d'exceptions dans l'unité Moteur. Je vais voir où se situe(nt) le(s) problème(s). [Edit] J'ai trouvé ceci : Code :
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
||||
|
00
|
|
|
#16 | |||||||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 687 ![]() |
Citation:
Et en changeant également la valeur du troisième paramètre, le résultat est parfait. J'ai écrit un exemple qui permet de comparer les différentes possibilités : Code :
Citation:
Citation:
Merci pour le test et pour le compte-rendu.
__________________
L'Art est long et le Temps est court. |
|||||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com