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

DirectX Discussion :

Effacer un texte


Sujet :

DirectX

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut Effacer un texte
    Bonjour,

    Je suis en Win32 et DirectX.
    J'affiche un texte avec :

    DrawText(NULL, sText.c_str(), -1, &rct, _iCentered, fontColor );

    Comment puis je l'effacer pour réécrire par dessus ?


    Merci pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    J'imagine que tu utilises un ID3DXFont.

    Donc un release puis un re-D3DXCreateFont...

    Sinon, si ce n'est que le texte changes la string : DrawText(NULL, NewsText.c_str(), -1, &rct, _iCentered, fontColor );

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Bonjour,


    Un nouveau DrawText réécrit par dessus mais n'efface pas le texte précédent

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Cela sous-entends que tu n'effaces pas le backbuffer de DirectX ?

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Bonjour,

    Non, il n'est pas effacé.
    A mon avis, il faut faire une copie du front buffer dans une surface et copier le rectangle sous le texte de cette surface dans une surface de sauvegarde.
    Puis restituer cette surface de sauvegarde vers le front buffer.

    Qu'en penses tu ?

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Désolé mais je ne comprends pas le fonctionnement de ton programme.

    Sous DirectX, il me semble, ça se passe souvent comme cela :

    -> j'efface le backbuffer.
    -> je redessine mes objets (texte, mesh-3d, etc...)
    -> je swap le tout -> ça devient le frontbuffer
    -> je présente le frontbuffer (affichage sur l'écran).
    -> je recommence...

    Certes, pour optimiser, tu peux effacer une partie précise du backbuffer et redessiner le texte à cet endroit... Mais je ne sais pas en quoi consiste exactement ton programme.

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Oui je suis d'accord, on peut effacer le backbuffer en entier mais je souhaitais seulement effacer sous mon texte pour le changer

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Voici mon code :

    /********************************************************************
    * Render_Background *
    * Writes the background bitmap to the display *
    * ******************************************************************/
    void dxManager::Render_Background(string BackgroundFileName)
    {
    IDirect3DSurface9* _bkgrd = getSurfaceFromBitmap(format_Bitmap(BackgroundFileName));
    IDirect3DSurface9* backbuffer;

    pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);

    HRESULT hResult = pd3dDevice->StretchRect(_bkgrd, NULL, backbuffer, NULL, D3DTEXF_NONE);
    // Creates an image surface matching the screen
    pd3dDevice->CreateOffscreenPlainSurface(945,1680,D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM,&backbuffer_mem,NULL);
    // Saves the back buffer to the back buffer backup
    hResult = pd3dDevice->StretchRect(backbuffer,NULL,backbuffer_mem,NULL,D3DTEXF_NONE);
    // Present the backbuffer contents to the display (front buffer)
    pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }

    /*******************************************************************
    * Render_Text *
    * Renders the text from the top left coordinates _X,_Y *
    * The text may be centered or not *
    * We suggest to have _X = 0 for centered message *
    ********************************************************************/
    void dxManager::Render_Text(int _X,int _Y,int _iMsgType,bool _bCentered,int _ID_Msg)
    {
    LPD3DXFONT m_font;
    LONG rct_width;
    string sText = get_translation(_ID_Msg);

    // Creates a D3DX font object
    D3DXCreateFont( pd3dDevice, pMessageStyle[_iMsgType]->Get_FontSize(), 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET,
    OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
    pMessageStyle[_iMsgType]->Get_FontName(), &m_font );
    // Creates a colour for the text
    D3DCOLOR fontColor = pMessageStyle[_iMsgType]->Get_MessageColor();

    // Creates a rectangle to indicate where on the screen it should be drawn
    RECT rct;
    rct.left = _X;
    if (_bCentered)
    rct.left = 0;
    rct.top = _Y;

    // Calculates the rectangle size
    m_font->DrawText(NULL, sText.c_str(), -1, &rct, DT_CALCRECT, fontColor );

    if (_bCentered)
    {
    // Tested on 01/21/10 for many fonts
    rct_width = rct.right-rct.left;
    rct.left = (My_Turn_For_You.Get_Height()-rct_width)/2;
    rct.right = rct.left + rct_width;
    };

    // Creates the object within the message class
    pMessage.push_back(new CMessage(_X,_Y,rct,_ID_Msg));
    ++ Nb_Messages;
    // Draws text
    m_font->DrawText(NULL, sText.c_str(), -1, &rct, 0, fontColor );
    }

    /****************************************************************************
    * Delete_Text *
    * Deletes the text from the top left coordinates _X,_Y *
    * _X,_Y must have the same values than the ones used for rendering the text *
    *****************************************************************************/
    void dxManager:elete_Text(int _X,int _Y,int _ID_Msg)
    {
    // Searches for rectangle index coming with this message
    int i = 0;
    bool loop = true;
    //POINT TLPoint;
    RECT TLRect;
    IDirect3DSurface9* backbuffer;
    pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);
    while (loop)
    {
    if ((pMessage[i]->Get_XMessage()==_X) &&
    (pMessage[i]->Get_YMessage()==_Y) &&
    (pMessage[i]->Get_IDMessage()==_ID_Msg))
    {
    loop = false;
    }
    else
    ++i;
    }
    TLRect = pMessage[i]->Get_RectMessage();
    pd3dDevice->StretchRect(backbuffer_mem,&TLRect,backbuffer,&TLRect,D3DTEXF_NONE);
    // Present the backbuffer contents to the display
    pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }



    Explications :

    La première méthode affiche l'image de fond d'écran. Elle mémorise de plus le backbuffer dans backbuffer_mem.
    La deuxième affiche un texte à un endroit précis et mémorise les coordonnées du rectangle utilisé pour l'affichage du texte ainsi que le numéro du message
    La troisième est censée effacer le texte en retrouvant le rectangle associé et restituant backbuffer_mem dans ce rectangle.
    Génial non ?
    Mais cela ne fonctionne pas ...

    Why ?

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    j'ai appuyé sur # pour mettre en valeur le code mais cela ne fonctionne pas apparemment

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Bon je progresse :

    J'ai remplacé D3DPOOL_SYSTEMMEM par D3DPOOL_DEFAULT et le texte est bien effacé.
    Par contre, le fond d'écran n'est pas restitué, j'ai un rectangle noir

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Par défaut
    Bon, j'ai trouvé :

    L'erreur vient que je mélange offscreen surface et backbuffer dans la ligne :

    hResult = pd3dDevice->StretchRect(backbuffer,NULL,backbuffer_mem,NULL,D3DTEXF_NONE);

    Il suffit donc de remplacer backbuffer par _bkgrd ...
    Et cela fonctionne parfaitement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/07/2008, 09h23
  2. onFocus > effacer le texte par defaut
    Par harlock59 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/04/2007, 14h50
  3. Effacer du texte
    Par Dénisss dans le forum C++
    Réponses: 5
    Dernier message: 28/12/2006, 20h22
  4. Réponses: 2
    Dernier message: 28/04/2006, 17h51
  5. effacer du texte dans une fenetre
    Par exter666 dans le forum Windows
    Réponses: 5
    Dernier message: 08/03/2005, 11h25

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