Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :



GDI : Dessin et découpe de tracé.

Par CGi

Le 24 avril 2004


Introduction :

Dans cet article nous allons voir à l'aide d'un exemple comment tracer le chemin d'un texte (contour des lettres), faire une découpe de ce chemin et dessiner sur la découpe.

Pour arriver à nos fins nous utiliserons les fonctions de Paths et de Clipping du GDI de Windows.

Explication :

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
    LOGFONT lf;
    HDC hdc = GetDC(Handle);

    // Initialisation de la structure LOGFONT 
    char f[32]={"Arial Black"};
    ZeroMemory(&lf, sizeof(LOGFONT));
    strcpy(lf.lfFaceName,f);
    lf.lfHeight = 100;

    // Céation de la fonte 
    HFONT hfont = CreateFontIndirect(&lf);
    HFONT hfontOld = SelectObject(hdc, hfont);

    // Création du crayon 
    HPEN hpen = CreatePen(PS_SOLID, 3, 0);
    HPEN hpenOld = SelectObject(hdc, hpen);

    // Dessin du chemin 
    BeginPath(hdc);
        TextOut(hdc, 10, 10, "Bonjour", 7);
    EndPath(hdc);
    StrokePath(hdc);

    // Dessin dans la découpe du chemin 
    SIZE sz;
    GetTextExtentPoint32(hdc, "Bonjour",7 , &sz);
    BeginPath(hdc);
        TextOut(hdc, 10, 120, "Bonjour", 7);
    EndPath(hdc);
    SelectClipPath(hdc, RGN_XOR);
    for (int i = 121; i < (120 + sz.cy); i += 6) {
       MoveToEx(hdc, 11, i, (LPPOINT) NULL);
       LineTo(hdc, (10 + sz.cx), i);
    }

    SelectObject(hdc, hfontOld);
    SelectObject(hdc, hpenOld);
    DeleteObject(hpen);
    DeleteObject(hfont);
    
    ReleaseDC(Handle, hdc);
}

Dans cet exemple nous dessinerons uniquement à l'aide des fonctions du GDI. Tout d'abord nous récuperons un contex de périférique HDC pour dessiner puis nous créons une fonte à l'aide de la fonction CreateFontIndirect qui utilise la structure LOGFONT précédement initialisé. Nous sélectionnons cette fonte pour le contex de périférique en cours. Même opération pour un crayon.

Dessin du chemin :
Un chemin ce prépare avant d'être dessiner entre les fonctions BeginPath et EndPath. Dans cette exemple nous dessinons un texte avec la fonction TextOut. (Entre ces deux fonctions on peut utiliser toutes les fonctions de dessin du GDI.) C'est StrokePath qui dessine réellement le chemin avec le crayon courant. Il y a aussi la fonction FillPath qui peut remplir l'interieur du chemin avec la brosse courante et StrokeAndFillPath qui fait les deux. Quand vous avez appellé l'une de ces fonctions le chemin n'est plus utilisable.
Un tracé dont le chemin n'est pas fermé peut être fermé avec la fonction CloseFigure.

Remplissage d'une découpe :
Comme dans la première partie nous traçons le chemin puis nous en fesons une découpe grace à la fonction SelectClipPath. La découpe ce trouve en sorte qu'elle ne fait plus partie du contex de périférique. Donc les traits dessinés ulterieurement dans la boucle ne le serons pas dans la découpe. La fonction SelectClipPath à comme deuxième argument un int précisant le mode de découpe.

Bon découpage.

CGi





Tous les articles de l'auteur :

C++ Builder

Trucs et astuces pour C++ Builder.
Création d'un composant.
TRichEdit.
Construction d'une application MDI.
TThread.
Installation de wxWidgets avec C++ Builder.
Application au style Windows XP.

C/C++

Les pointeurs du C et du C++.
Les listes chainées en C.
            Liste simplement chaînée.
            Liste triée.
            Liste doublement chaînée.
Les Arbres. New
Le C orienté objets ?

Assembleur

Programmer en assembleur avec Visual C++.

DotNet

Création d'un composant .Net avec C# Builder.
Création d'un contrôle WinForm pour .Net.
Création d'une application MDI avec C# Builder.

wxWidgets

1 - Ma première application avec wxWidgets.
2 - Construire un menu avec wxWidgets.
3 - Dessiner avec wxWidgets.
4 - Sizers, Timers... sous wxWidgets.
5 - Les boîtes de dialogues standards.
6 - Les boîtes de dialogues personnalisées.


API Windows

1 - La fenêtre principale.
2 - Contrôles et messages.
3 - Les commandes et notifications.
4 - Les boîtes de dialogue communes.
5 - Les contextes de périphériques.
6 - Dessiner.
7 - Les ressources.
8 - Les boîtes de dialogue personnalisées.
9 - Communiquer avec les boîtes de dialogue.
10 - Les accélérateurs clavier.


Java

Applet: Animation dans une applet java.
   


Contacter le responsable de la rubrique C