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

Windows Discussion :

Comment empêcher que les textout se chevauchent ?


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut Comment empêcher que les textout se chevauchent ?
    Bonjour,

    Sauriez vous comment faire pour empêcher que mes textout se chevauchent ? une méthode d'effacement par exemple, sachant que mon background est un bmp ? (Car chaque timer, un textout est affiché ... et cela fait horrible...)

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Réafficher le bmp ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    J'ai déjà essayé ... ou plutôt je pense l'avoir déjà fait :
    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
        HDC hdc2;
                  PAINTSTRUCT ps;
    
                  hdc2 = BeginPaint(hDlg, &ps);
    
                  DrawState(hdc2,NULL,NULL,(long)hBmp,NULL,0,10,0,0,DST_BITMAP);
    
                  EndPaint(hDlg, &ps);
    
                 HDC hDC;
                 hDC=GetDC(hDlg);
                  SetBkMode(hDC,TRANSPARENT);
    
                TextOut(hDC,20, 20,data.tag[0],strlen(data.tag[0]));
                TextOut(hDC,20, 42,data.tag[1],strlen(data.tag[1]));
                TextOut(hDC,20, 64,data.tag[2],strlen(data.tag[2]));
                TextOut(hDC,20, 102,data.status,strlen(data.status));
                TextOut(hDC,155, 102,data.allT,strlen(data.allT));
    
                UpdateWindow(hDlg);
    
                  ReleaseDC(hDlg,hDC);
    (j'oubliais... c'est dans le WM_TIMER et WM_PAINT)

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Pas le choix, il faut effacer le texte précédent.

    Si c'est un fond de couleur unie, 2 solutions assez simple:
    - reécrire le texte précédent avec la couleur du fond
    - tracer un rectangle de la dimension du texte avec contour et remplissage de la couleur du fond (on peut obtenir le rectangle nécessaire avec GetTextExtent [ou quelque chose comme ça, je ne me souviens pas exactement])

    Si le fond n'est pas uni:
    - sois travailler sur un duplicata du bmp pour l'affichage, et restaurer à chaque fois qu'on doit mettre un texte
    - sois copier le rectangle qui va être couvert pas le texte, et restaurer avant d'écrire le prochain texte, ce qui peut économiser un peu de mémoire.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par kidpaddle2
    (j'oubliais... c'est dans le WM_TIMER et WM_PAINT)
    Tu sais, généralement on ne dessine rien dans le WM_TIMER...
    À la rigueur, on fait un InvalidateRect() pour être sûr de recevoir un WM_PAINT dans les plus brefs délais...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Ca, je le sais. Mais justement je n'ai pas trouvé d'autre solution. En fait je suis en train de créer un lecteur mp3, et j'aimerais afficher par l'intermédiaire de textout les tags musicaux seulement à chaque changement de chansons (à l'aide d'un booléen change, qui vaut true quand NEXT, PREVIOUS ou PLAY), et le temps écoulé, et ce chaque seconde (je me suis débrouillé avec une variable statique mem pour qu'il mémorise le temps précédent et ainsi vérifie s'il a changé depuis. (et donc l'affiche)

    Mais voilà je ne sais pas du tout comment faire avec le invalidaterect... Je sais que je demande beaucoup mais pourriez vous me montrer une fonction par exemple "DrawText(HWND hwnd, char *string, RECT coordinates, HBITMAP hBmp){}" permettant d'effacer un rectangle derriere le texte, (afin qu'il soit redessiné par envoi de WM_PAINT) et d'afficher le texte proprement dit ?

    Cela m'aiderait beaucoup car cela fait déjà depuis 2jours que je bloque sur ce problème et m'empêche de le finir... Il me reste que ce problème et celui des sliders transparents...

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pourquoi ne pas utiliser des static, maintenant qu'on a le moyen de les rendre transparents en dessinant l'image derrière eux quand ils envoient WM_CTLCOLORSTATIC ?

    Il suffirait de se faire une liste d'IDs de static pour vérifier que le contrôle qui envoie le message est bien un static.
    Alors comme ça, on change le texte du static dans le WM_TIMER (avec un simple SetWindowText() ou SetDlgItemText()), et puis ça redessine tout seul comme il faut...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    mat.M
    Invité(e)
    Par défaut
    C'est le même principe du dessin dans des tampons hors-écran puis copie de ces tampons vers le tampon de l'écran

  9. #9
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Médinoc -> Oui c'est ce que j'ai fait ... Tu peux même vérifier, bien que cela fasse quand même beaucoup de code à vérifier j'en suis conscient.
    Mat M -> Tu parles du code de Médinoc ? Car je ne reconnais pas le mien dans ta citation... Aurais tu une idée à mon problème alors ?
    (Tu dis que ERASEBGND est superflu mais j'ai remarqué que sans, une partie du bitmap était effacée [toujours la même, et au même moment : apres un browse])

    Voici le code tout bête généré par code::blocks et un peu modifié pour le static :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #include <windows.h>
    
    /*  Declare Windows procedure  */
    HWND hTags;
    HINSTANCE hInst;
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "test";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nFunsterStil)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        hInst = hThisInstance;
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "test",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
            hTags = CreateWindow("STATIC", "", SS_LEFT | SS_NOPREFIX | WS_CHILD | WS_VISIBLE, 50,50, 353, 53, hwnd, NULL, hInst, NULL);
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
        ShowWindow (hTags, TRUE);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                SetWindowText(hTags, "salut tout le monde !");
                UpdateWindow(hTags);
                break;
            case WM_CTLCOLORSTATIC:
                return (LRESULT)CreateSolidBrush(RGB(178,178,178));
    
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    kidpaddle2:
    1. Je croyais t'avoir dit que la brush retournée par WM_CTLCOLORSTATIC devait être persistante et non pas être créée à chaque fois...
    2. Attention : On n'utilise pas TRUE pour ShowWindow() mais SW_SHOW (même si ça ne devrait pas vraiment causer de problème, puisque TRUE correspond à SW_SHOWNORMAL)
    3. Tu vérifies bien que hTags n'est pas NULL? Et au passage, pas la peine de le créer avec un text vide: Tu verras mieux si son text n'est pas vide à la création
    4. hTags n'existe pas encore lorsque WM_CREATE est traité: La fenêtre reçoit ce message-là avant que CreateWindow() ne retourne...
      ----> Conclusion : Tu crées un static vide et tu ne le remplis pas (car tu le remplis avant qu'il n'existe) --> C'est normal que tu ne voies rien, le static est vide...
    5. Quand quelque chose foire, on commence petit: Est-ce que le static marche quand tu ne joues pas avec WM_CTLCOLORSTATIC ?


    Mat.M : Le Memory DC peut être persistant ou non, ça ne change pas grand-chose ici (sauf question parformance) du moment que le bitmap lui-même est persistant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Exact c'était le fait qu'il n'existe pas Je suis vraiment stupide parfois ...
    Mais de toute façon le texte possède un fond blanc... même après un ctlcolorstatic. Donc cela ne m'aide pas beaucoup...

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est normal, il faut régler le HDC en TRANSPARENT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetBkMode(hdc, TRANSPARENT);
    Tu constatera le même phénomène si tu écris directement dans un DC avec DrawText()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Comment sélectionner que les lignes doublons
    Par Inconnu_du_69 dans le forum Langage SQL
    Réponses: 20
    Dernier message: 12/02/2009, 16h18
  2. Réponses: 14
    Dernier message: 11/01/2009, 17h27
  3. Comment empêcher un menu CSS de chevaucher un tableau?
    Par dudule0 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 17/11/2008, 21h08
  4. Réponses: 4
    Dernier message: 22/05/2007, 09h22
  5. [Math] Comment empêcher que les fractions rapetissent ?
    Par sekiryou dans le forum Mathématiques - Sciences
    Réponses: 3
    Dernier message: 19/08/2006, 05h29

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