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

C++Builder Discussion :

Antigrain et C++ builder [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 8
    Par défaut Antigrain et C++ builder
    Finalement je dois me résoudre a demander de l'aide.

    Je tente de réaliser des choses très simple avec la librairie graphique Antigrain. Le problème c'est que bien que ça compile il ne se passe rien du tout.

    Comment tracer un ligne dans un fenetre (TForm) ou bien un TCanvas ou un TImage en utilisant cette superbe librairie ????

    La moindre info sera la bienvenue

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Si c'est pour tracer une ligne je ne vois pas l'intérêt d'utiliser une libraire vu que le composant TCanvas le fait...superbement bien

    L'exemple ci-dessous trace une ligne du point (1, 1) au point (2, 3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaForm->Canvas->MoveTo(1, 1);
    MaForm->Canvas->LineTo(2, 3);
    Si tu veux faire d'autres choses graphique je te conseille de bien lire l'aide sur le TCanvas.
    En espérant t'avoir aidé,

    Bon courage !

  3. #3
    Membre éprouvé
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Par défaut
    bien d'accord je me demande bien ce que le TCanvas ne peut pas faire ... sauf cas particulier ...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 8
    Par défaut Je ne me suis pas bien expliqué
    J'ai créé une très grosse application mais elle fonctionne grace au timage et tcanvas. ceque je veux faire avec la librairie graphique antigrain c'est réécrire tout le code de la partie graphique pour utiliser des fonctions comme l'antialiasing ou bien le remplissage vec des patterns etc etc.

    merci pour les premières réponses en tout cas

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Il faut dessiner sur un TPaintBox. Les autres composants s'effacent automatiquement puisque leur contenu est stocké dans l'objet avec TPaintBox le dessin est libre et vive le GDI.
    btw Pas mal antigrain je ne connaissais pas.

  6. #6
    Membre éprouvé
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Par défaut
    Salut,

    t'aurai pas un bout de code pour que je puisse dessiner sur un TCanvas ... ( sur un TPaintBox par exemple ) ... parce que pour le moment j'arrive à créer un fichier mais pas moyen de dessiner directement sur le canvas ...

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Ceci desine cela http://www.senosoft.com/tmp/anitgrain.jpg dans une PaintBox (le screenshot est extrait de mon soft: P3dO). Note que j'ai enlevé quelques éléments dont l'icone et le GradientFill.
    Avec TCanvas (CBuilder 5) il n'y a pas de GradientFill, ni la fonction DrawText implementée ici. DrawText est bien plus puissante que TextOut.
    L'icone dans le PaintBox est clickable, tout ceci donne un petit contrôle mais sans les 4 ou 5 TLabel et le TImage qu'il aurait fallut placer.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    void __fastcall Form1::PaintBox1Paint(TObject *Sender)
    {
      CGDRecord* pGdrec;
      RECT rcDraw;
      int nLeft = 11;                 // Text painting bounds
      int nRight= viewInfo->Width-5;
      int nTextHeight = 13;
     
      if ((m_bmPaintBox1->Empty) ||
          (m_bmPaintBox1->Width!=PaintBox1->Width))
      {
        m_bmPaintBox1->Width = PaintBox1->Width;
        m_bmPaintBox1->Height= PaintBox1->Height;
     
        m_bmPaintBox1->Canvas->Brush->Color = clWindow;
        m_bmPaintBox1->Canvas->FillRect(Rect(0, 0, m_bmPaintBox1->Width, m_bmPaintBox1->Height));
     
    		m_bmPaintBox1->Canvas->Brush->Color = clHighlight;
        m_bmPaintBox1->Canvas->FillRect(Rect(1, 24, m_bmPaintBox1->Width, 24+2));
    	}
     
    	PaintBox1->Canvas->Draw(0, 0, m_bmPaintBox1);
     
    	::SetBkMode(viewInfo->Canvas->Handle, TRANSPARENT);
     
      TCHAR* pszDisplay = new TCHAR[_MAX_PATH];
      AnsiString sDisplay;
     
      // Display current folder name
      viewInfo->Canvas->Brush->Color = clWindow;
      viewInfo->Canvas->Font->Name = "Arial";
      viewInfo->Canvas->Font->Size = 12;
      viewInfo->Canvas->Font->Style = TFontStyles() << fsBold;
      _tcscpy(pszDisplay, m_pszCurrentDir);
      PathStripPath(pszDisplay);
      SetRect(&rcDraw, nLeft, 3, nRight, 3+19);
      ::DrawText(viewInfo->Canvas->Handle, pszDisplay, -1, &rcDraw,
                 DT_SINGLELINE | DT_LEFT | DT_NOPREFIX | DT_END_ELLIPSIS | DT_NOCLIP);
     
      // Display current file infos
      if (GDGetFocused(pGdrec)) {
        viewInfo->Canvas->Font->Name = "Verdana";
        viewInfo->Canvas->Font->Size = 8;
     
        _tcscpy(pszDisplay, pGdrec->m_sFullPath.c_str());
        PathStripPath(pszDisplay);
        SetRect(&rcDraw, nLeft+m_dwShlIconLarge+2, 41, nRight, 41+nTextHeight);
        ::DrawText(viewInfo->Canvas->Handle, pszDisplay, -1, &rcDraw, //(ici) DT_PATH_ELLIPSIS
                   DT_SINGLELINE | DT_LEFT | DT_NOPREFIX | DT_END_ELLIPSIS | DT_NOCLIP);
     
        viewInfo->Canvas->Font->Style = TFontStyles();
        SetRect(&rcDraw, nLeft+m_dwShlIconLarge+2, 54, nRight, 54+nTextHeight);
        ::DrawText(viewInfo->Canvas->Handle, pGdrec->m_sTypeName.c_str(), -1, &rcDraw,
                   DT_SINGLELINE | DT_LEFT | DT_NOPREFIX | DT_END_ELLIPSIS | DT_NOCLIP);
    		...
      }
      delete [] pszDisplay;
    }
    Il suffit de savoir que :
    - TCanvas->Handle == HDC (Device context du GDI de Windows)
    - On ne doit dessiner que quand et là ou Windows nous y autorise, sinon tout est effacé - en l'occurence ici et en général dans le OnPaint du contrôle.
    Dès lors toutes les méthodes de dessin du GDI s'appliquent.

  8. #8
    Membre éprouvé
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Par défaut
    Salut,

    En regardant ton exemple je vois que je me suis mal exprimé... ma question portait sur la bibliothèque antigrain ... voici un bout de code exemple que j'aimerai mettre à l'écran ... pour le moment je créé uniquement un fichier ...

    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
     
       unsigned char* buffer = new unsigned    char[FRAMEWIDTH*FRAMEHEIGHT*3];
     
       memset(buffer,255,FRAMEWIDTH*FRAMEHEIGHT*3);
       agg::rendering_buffer rbuf(buffer,FRAMEWIDTH,FRAMEHEIGHT,FRAMEWIDTH*3);
       agg::pixfmt_rgb24 pixf(rbuf);
       agg::rgba8 span[FRAMEWIDTH];
     
       unsigned int i;
       for(i=0;i<FRAMEWIDTH;++i)
       {  agg::rgba c(380.0+400.0*i/FRAMEWIDTH,0.8);
          span[i]=agg::rgba8(c);                    }
     
       for(i=0;i<FRAMEHEIGHT;++i)
          pixf.blend_color_hspan(0,i,FRAMEWIDTH,span,0,255);
     
       FILE* fd = fopen("essai.ppm","wb");
       if(fd)
       {
          fprintf(fd,"P6 %d %d 255 ",FRAMEWIDTH,FRAMEHEIGHT);
          fwrite(buffer,1,FRAMEWIDTH*FRAMEHEIGHT*3,fd);
          fclose(fd);
       }
       delete [] buffer;
    évidemment pour se servir de ce code il faut utiliser la bibliothèque antigrain disponible ici --> http://www.antigrain.com/agg23.zip

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    En fait, ton buffer est le buffer d'un bitmap 24 bits. Au lieu de remplir un buffer tu peux tout aussi bien remplir celui d'un TBitmap (ScanLine) que tu pourras ensuite dessiner dans un TPaintBox comme ci-dessus ou un TImage.

    Je n'ai pas CBuilder sur cette machine, mais pour ce faite il faut procéder comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bmBmp = new Gaphics::TBitmap();
    bmBmp->Width = FRAMEWIDTH;
    bmBmp->Height = FRAMEHEIGHT;
    bmBmp->(?) = 24 bits (désolé me rappelle plus nom méthode)
     
    // Scanner par la hauteur
    for(i=0;i<FRAMEHEIGHT;++i) 
      for(j=0;j<FRAMEWIDTH;++i) 
         bmBmp->ScanLine
    Le code est incomplet mais Il faut que tu regarde la propriété ScanLine de l'objet Bitmap.
    Comme les bits d'un Bitmap sont alignés en mémoire tu peux racourcir en faisant un memcpy mais il vaut mieux travailler par ScanLine (par la hauteur) pour des raisons d'alignement des lignes entre elles.
    Et pour finir chaque pixel de ton bitmap est composé de 3 BYTES, c'est à dire de 3 rgba8 dans ton code. Un Rouge, un Vert, un Bleu => 24 bits. Tu le savais peut-être mais c'est important pour assigner les ScanLine.

Discussions similaires

  1. Choisir Visual c++ ou Borland C++Builder ?
    Par DevEric dans le forum Choisir un environnement de développement
    Réponses: 31
    Dernier message: 14/06/2007, 23h48
  2. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  3. c++ builder JavaDoc :)
    Par JEG dans le forum C++Builder
    Réponses: 8
    Dernier message: 08/06/2002, 13h31
  4. Documentation DirectX dans C++Builder 3
    Par srvremi dans le forum DirectX
    Réponses: 1
    Dernier message: 26/04/2002, 09h59
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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