Partage
  • Partager sur Facebook
  • Partager sur Twitter

[API WIN32] Texte avec identificateur

J'ai pensé au static mais alors le fond n'est pas transparent

    11 avril 2007 à 19:17:31

    Lu,

    Je cherche à pouvoir identifier mon texte car je dois pouvoir le modifier et pouvoir le cacher (ShowWindow(h, SW_*);) parceque j'ai une 'boite à onglet' (tabControl).
    Avec le TextOut() je ne peux pas identifier le texte et le cacher.
    Et avec le static le fond n'est pas transparent.

    <EDIT> Je cherche aussi comment rendre une certaine couleur transparente avec un bitmap (j'ai trouvé un code mais il fait 400 lignes, n'y a t-il pas plus court ?) pour par exemple rendre tout les pixels rouge (ffffff) transparents ?


    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      12 avril 2007 à 11:54:33

      En ce qui concerne les textout, rien ne t'empêche de les effacer (il s'agit juste d'un dessin dans un HDC), par exemple avec InvalidateRect().

      Pour les static, tu peux bien entendu rendre leur fond transparent : pour ceux-ci, tout se passe à réception du message WM_CTLCOLORSTATIC. Si c'est une image que tu as en fond, c'est un peu plus compliqué : tu vas devoir effectuer des BitBlt() en fonction des coordonnées et dimensions, etc. Par contre, si c'est une couleur, rien de plus simple : retourne la brush du fond de ta fenêtre.

      Enfin, dans mon tuto il y a une fonction pour "rendre un bitmap transparent" (abus de langage) à partir d'une couleur de transparence, et à ma connaissance c'est le plus court (à une dizaine de lignes près, et encore).
      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2007 à 11:59:59

        Merci de ta réponse :)
        Pour les textOut(), ok mais je veux utiliser les statics. ^^
        Mais justement dans un de mes précédents topic j'ai demandé comment changer la couleur de fond d'une boite à onglet car comme je ne sais pas la couleur qu'elle va avoir donc je ne peux pas la rendre transparente (car ça change sous Vista/XP/98/...).

        Tu comprends ?

        Pour l'image je vais voir dans ton tuto. ;)
        • Partager sur Facebook
        • Partager sur Twitter
          12 avril 2007 à 12:52:29

          Il me semble que les onglets sont de la même couleur que la fenêtre, or celle-ci est définie dans la classe de fenêtre... tu peux donc tout à fait savoir la couleur de ton contrôle Tab, indépendamment des OS sous lesquels ton programme tourne.

          Par contre, veille à utiliser une brush fixe, et non des constantes du style COLOR_BTNFACE ou autre...
          • Partager sur Facebook
          • Partager sur Twitter
            12 avril 2007 à 17:28:48

            Non, sous 98 ils ont la même couleurs ok mais pas sur XP et Vista, ils n'ont pas la même couleur que la fenêtre et en plus :-° il y a un léger dégradé sous XP/Vista c'est pour ça que je ne sais pas comment faire, regarde:
            Image utilisateur (oui, c'est beau paint ^^)
            • Partager sur Facebook
            • Partager sur Twitter
              12 avril 2007 à 18:33:18

              Hmmm... je pense (si les onglets, et donc tous les contrôles Windows, sont dessinés en utilisant le HDC de la fenêtre) que tu peux effectuer, lors de ton WM_CTLCOLORSTATIC, un BitBlt du HDC de la fenêtre (en utilisant les coordonnées du contrôle) dans celui du contrôle (en WPARAM).
              • Partager sur Facebook
              • Partager sur Twitter
                12 avril 2007 à 20:11:22

                Euh, mais il n'y a pas plus simple pour afficher un "bête" texte sur un onglet comme le fait n'importe quel programme ?
                Je crois que je vais quand même utilise le TextOut() :-°

                * Mais le problème du TextOut() c'est qu'il s'affiche en dessous de mes onglets :o , on ne le voit pas, je ne sais pas pourquoi.
                * J'ai un autre problème, pourquoi GetWindowText() ne fonctionne pas ?
                    while(GetWindowText(prop.hRapport, TEXT(str), 255) != 0)
                        fputs(str, log);

                Je n'ai rien dans mon fichier texte. oO
                Pourtant il y a du texte dans prop.hRapport.
                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2007 à 12:03:34

                  Up, c'est important.

                  Merci :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2007 à 12:20:55

                    Pour les TextOut(), je pense que tu devrais plutôt utiliser un HDC sur les onglets, et non sur la fenêtre.

                    Puis, en ce qui concerne ton GetWindowText(), m'est avis que c'est TEXT() qui en est la cause :p . Cette macro, tu dois t'en servir en "out", pas en "in". D'après moi, ça altère le tableau passé.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 avril 2007 à 12:32:17

                      Pour le HDC de fenêtre, je devais être fatigué :-°

                      Pour le GetWindowText() enfait, je fais:
                          while(GetWindowText(prop.hRapport, str, 255) != 0) {
                              /* TEST */
                              MessageBox(NULL, str, "Test LOG", 0);
                              fprintf(log, str);
                          }

                      Et ça ne passe même pas une seule fois dans la boucle.
                      (str est un char[])


                      Merci
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 avril 2007 à 12:38:16

                        Déjà (je ne l'avais même pas remarqué avant), à quoi sert cette boucle ? Encore heureux que ça ne marche pas, sinon ça aurait été l'invasion des MessageBox chez toi ^^

                        Plusieurs choses à vérifier :
                        • str doit être un char[255]
                        • [j'ai oublié le deuxième :-° ]
                          Edit: Ah oui, bien sûr que la fenêtre comporte un titre :p
                        Au cas où cela ne marche toujours pas, tu peux utiliser GetLastError() (codes), histoire de voir ce qui se passe ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 avril 2007 à 12:53:58

                          Bah, si il y a plus de 255 caractères dans l'EDIT, il faut qu'on refasse un GetWindowText(), non ?
                          Et comme celon MSDN, GetWindowText() renvoit 0 en cas d'erreur. ^^
                          str[] fais 256 caractères (c'est toujours bien d'avoir un en plus :-° )
                          Pour GetLastError(), je vais voir après le redémarrage, car les pilotes NVIDIA me demande de redmérrarer...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 avril 2007 à 13:08:47

                            Oulaaaa tu utilises GetWindowText() pour un contrôle d'édition ? ^^ Utilise plutôt les messages appropriés : EM_GETLINE avec EM_GETLINECOUNT.

                            P.S: Pas besoin de se garder d'un caractère en plus, msdn spécifie que le caractère de fin de string 'NULL' est compris dans la longueur de chaîne passée.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 avril 2007 à 15:13:47

                              Et une fois le message intercepté je fais quoi ? ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 avril 2007 à 15:20:12

                                Là si tu me demande ça, c'est que tu n'as pas compris leur fonctionnement : les messages ne fonctionnent pas qu'en réception, mais aussi en émission.

                                Ces messages, tu dois les envoyer au contrôle, via SendMessage(). Si tu cherches sur msdn les pages consacrées à ces deux messages, tu verras leurs paramètres respectifs et valeur de retour.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 avril 2007 à 20:24:10

                                  J'y avais pas pensé ^^.
                                  C'est bon, je sais tu sais :p mais merci pour le déclic. ^^
                                  <EDIT> Pas simple le message EM_GETLINE, chiant d'ailleurs. :D
                                  Je dois mettre les 4 premiers octects (DWORD) de mon buffer à la taille qu'il peut recevoir ? oO
                                  Et me servire du message EM_GETLINECOUNT pour savoir à quelle ligne je dois me positionner ?


                                  Maintenant, j'ai un problème pour le HDC sur les onglets, si je fais:
                                  /* Dans WM_PAINT... */
                                  PAINTSTRUCT psT;
                                  HDC hdcTabs;

                                  hdcTabs = BeginPaint(hTabs, &psT);

                                  EndPaint(hTabs, &psT);

                                  Ce bête code même sans TextOut(), rends mes onglets transparents. oO
                                  Tout ce qui est sûr les onglets disparait, quand on passe la souris sur le bouton par exemple, il revient, tu comprends ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 avril 2007 à 20:55:27

                                    Pour le EM_GETLINE :
                                    //Soit char szbuff[256];
                                    *((WORD*) szbuff) = 256;

                                    A mon avis, pour ton autre problème tu devrais subclasser tes onglets, et traiter cette partie de code dans le WM_PAINT des onglets.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 avril 2007 à 21:07:05

                                      Pour EM_GETLINE, je fais:
                                          char str[256] = {0};
                                          *((WORD*) str) = 256;
                                          SendMessage(...);
                                          /* TEST */
                                          MessageBox(NULL, str, "TEST", 0);

                                      Mais je n'ai rien oO

                                      Pour les onglets, tu dis "subclasser", càd ?
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 avril 2007 à 23:16:04

                                        Pour EM_GETLINE, je vais voir ça, mais j'aimerais que tu me montres ton SendMessage() (ça m'éviterait, au cas où, de reposter pour l'avoir, même si je pense que cela ne vient pas de là).

                                        Ensuite, pour le sous classement, il s'agit de redéfinir une procédure pour un contrôle, intercepter directement les messages que l'on veut définir pour celui-ci, et rappeler enfin la procédure normale. Dans ton cas, cela nous permet d'intercepter le message WM_PAINT, spécifique au contrôle.

                                        Voici le code correspondant :
                                        //Certains compilos recquièrent l'utilisation de FARPROC
                                        #ifdef STRICT
                                          #define PROC_TYPE WNDPROC
                                        #else
                                          #define PROC_TYPE FARPROC
                                        #endif

                                        PROC_TYPE oldTabsProc;

                                        LRESULT APIENTRY TabsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
                                        {
                                           if (uMsg == WM_PAINT)
                                           {
                                               //Dessin
                                           }

                                           return CallWindowProc(oldTabsProc, hwnd, uMsg, wParam, lParam);
                                        }

                                        //Dans la callback de la fenêtre

                                        oldTabsProc = (PVOID)SetWindowLong(hTabs, GWL_WNDPROC, (LONG)TabsProc);
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 avril 2007 à 17:26:56

                                          Ok, j'ai un callback pour mes onglets mais ça ne change rien au problème, ils sont toujours transparents, et maintenant on ne 'voit' plus les boutons quand on passe la souris dessus... :o

                                          Pour le SendMessage():
                                          SendMessage((HWND) hTabs, (UINT) EM_GETLINE, 0, str);
                                          (je soupsone le hTabs de ne "plus être valide" dans cette fonction)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 avril 2007 à 19:40:30

                                            Essaye avec GetDC(), plutôt. Mais j'avoue que c'est bizarre. Par ailleurs, même si je ne vois pas très bien ce que tu veux dire pour ton problème, j'ai bien l'impression de l'avoir déjà eu (du moins pour les boutons)... ça me frustre, ça ^^

                                            Pour le SendMessage(), tes casts sont inutiles. Ces variables sont déjà du type convenu... de plus, hTabs est forcément encore valide... à part si tu l'as libéré toi-même, mais ça serait stupide de ta part :p

                                            T'as essayé GetLastError() ?

                                            Edit: Ah mais attends... si on traite le WM_PAINT du hTabs avec le dessin des TextOut, puis qu'on appelle la procédure normale (le dessin du contrôle, puisque WM_PAINT est envoyé à la procédure), c'est normal que l'on ne voie pas le contrôle... fais le test de ne retourner CallWindowProc() que si le message n'est pas WM_PAINT, pour voir ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 avril 2007 à 18:02:57

                                              Attends, car je me perds un peu dans mes problèmes là :D

                                              Pour GetDC(hTabs) ça fonctionne mais plusieurs problèmes se posent:
                                              * je ne sais pas comment rendre le fond transparent (du texte) car impossible de faire une action sur un HDC.
                                              * le texte ne s'affiche pas au démarrage de l'application, il faut "toucher" l'onglet pour qu'il s'affiche (puisqu'il faut un WM_PAINT sur l'onglet) j'ai alors essayé de faire
                                              SendMessage(hTabs, WM_PAINT, wParam, lParam);
                                              mais sans résultat. :o

                                              Pour le test de retourner 0 quand c'est un WM_PAINT, ça ne change rien avec un TextOut() (chez moi ^^).
                                              TextOut() ne me renvoit pas d'erreur (quand je le fais dans le WM_PAINT) :-\


                                              Pour le SendMessage(), je fais quoi ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                17 avril 2007 à 18:34:19

                                                Bon, déjà, ça marche. Donc ce que je redoutais plus haut s'est révélé faux ^^ (pour une fois que je suis content d'avoir tort)...

                                                * SetBkMode(hdc, TRANSPARENT);
                                                * Je te conseille de faire une fonction d'affichage d'un texte, et de l'appeler au WM_CREATE, ainsi que dans le WM_PAINT. Ainsi, même sans cliquer sur l'onglet, ça marchera.

                                                Citation : PianoPâriss

                                                Pour le test de retourner 0 quand c'est un WM_PAINT, ça ne change rien avec un TextOut() (chez moi ^^).
                                                TextOut() ne me renvoit pas d'erreur (quand je le fais dans le WM_PAINT) :-\


                                                De quoi parles-tu ?

                                                Pour le SendMessage(), si tu as fait ce que je t'ai dit, je ne vois pas... poste les parties de code concernées, je verrai plus tard (si personne - y compris toi ^^ - ne trouve entre-temps).
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 avril 2007 à 19:39:09

                                                  Citation : kidpaddle2

                                                  SetBkMode(hdc, TRANSPARENT);


                                                  Comment veux tu que je fais un SetBkMode() sur un HDC qui n'existe pas ? :p
                                                  Puisque j'utilise GetDC(), donc, je n'utilise pas de HDC, tu vois ?

                                                  Citation : kidpaddle2

                                                  * Je te conseille de faire une fonction d'affichage d'un texte, et de l'appeler au WM_CREATE, ainsi que dans le WM_PAINT. Ainsi, même sans cliquer sur l'onglet, ça marchera.


                                                  Ok ok mais bon, je n'aime pas trop les WM_PAINT normalement.
                                                  Domage qu'on soit "obligé" ^^

                                                  Citation : kidpaddle2

                                                  Citation : PianoPâriss

                                                  Pour le test de retourner 0 quand c'est un WM_PAINT, ça ne change rien avec un TextOut() (chez moi ^^).


                                                  De quoi parles-tu ?

                                                  ==>

                                                  Citation : Kidpaddle2

                                                  [...] fais le test de ne retourner CallWindowProc() que si le message n'est pas WM_PAINT, pour voir ;)


                                                  Citation : kidpaddle2


                                                  Pour le SendMessage(), si tu as fait ce que je t'ai dit, je ne vois pas... poste les parties de code concernées, je verrai plus tard (si personne - y compris toi ^^ - ne trouve entre-temps).


                                                  Oui, je l'utilise comme ça:
                                                  SendMessage(hTabs, EM_GETLINE, 0, str);



                                                  N.B. Ah, oui aussi : Comment rendre le fond de ma checkbox (le texte) transparent, je dois passer par WM_CTLCOLORBTN ?


                                                  Merci
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    18 avril 2007 à 10:33:22

                                                    Citation : PianoPâriss

                                                    Comment veux tu que je fais un SetBkMode() sur un HDC qui n'existe pas ? :p
                                                    Puisque j'utilise GetDC(), donc, je n'utilise pas de HDC, tu vois ?


                                                    o_O J'ai rarement vu des dires aussi paradoxaux... bien sûr que si, GetDC() te permet de récupérer un HDC sur une fenêtre (ou un contrôle)...

                                                    Citation : PianoPâriss

                                                    Ok ok mais bon, je n'aime pas trop les WM_PAINT normalement.
                                                    Domage qu'on soit "obligé" ^^


                                                    Je ne vois pas comment tu peux passer outre en espérant réussir dans la partie GUI de l'API Windows... t'inuquiète pas, il y en a d'autres des messages dans ce genre, comme WM_ERASEBKGND ;)

                                                    Pour le coup du return 0, comme j'ai dit au post plus haut ça me rassure car ça veut dire que ma supposition était fausse (d'ailleurs avec du recul, encore heureux ^^ ).

                                                    En ce qui concerne le SendMessage(), je vais essayer dès maintenant chez moi...
                                                    Edit: Je confirme, ça marche parfaitement chez moi avec ce code :
                                                    #include <windows.h>

                                                    LRESULT CALLBACK proc (HWND, UINT, WPARAM, LPARAM);

                                                    HINSTANCE hInst;

                                                    int WINAPI WinMain (HINSTANCE hThisInstance,
                                                                         HINSTANCE hPrevInstance,
                                                                         LPSTR lpszArgument,
                                                                         int nCmdShow)
                                                    {
                                                        HWND hwnd;
                                                        MSG messages;
                                                        WNDCLASSEX wincl;

                                                        hInst = hThisInstance;

                                                        wincl.hInstance = hThisInstance;
                                                        wincl.lpszClassName = "Test";
                                                        wincl.lpfnWndProc = proc;
                                                        wincl.style = CS_DBLCLKS;
                                                        wincl.cbSize = sizeof (WNDCLASSEX);

                                                        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
                                                        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
                                                        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
                                                        wincl.lpszMenuName = NULL;
                                                        wincl.cbClsExtra = 0;
                                                        wincl.cbWndExtra = 0;
                                                        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

                                                        if (!RegisterClassEx (&wincl))
                                                            return 0;

                                                        hwnd = CreateWindowEx (
                                                               0,
                                                               "Test",
                                                               "testApp",
                                                               WS_OVERLAPPEDWINDOW,
                                                               CW_USEDEFAULT,
                                                               CW_USEDEFAULT,
                                                               544,
                                                               375,
                                                               HWND_DESKTOP,
                                                               NULL,
                                                               hThisInstance,
                                                               NULL
                                                               );

                                                        ShowWindow (hwnd, nCmdShow);

                                                        while (GetMessage (&messages, NULL, 0, 0))
                                                        {
                                                            TranslateMessage(&messages);
                                                            DispatchMessage(&messages);
                                                        }

                                                        return messages.wParam;
                                                    }

                                                    LRESULT CALLBACK proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                                                    {
                                                        static HWND hEdit = NULL;

                                                        switch (message)
                                                        {
                                                            case WM_CREATE:
                                                                hEdit = CreateWindow(
                                                                                        "EDIT",
                                                                                        "editTest",
                                                                                        WS_VISIBLE | WS_CHILD |
                                                                                        ES_MULTILINE | ES_WANTRETURN | ES_LEFT,
                                                                                        20,20,400,200,
                                                                                        hwnd,
                                                                                        (HMENU)0,
                                                                                        hInst,
                                                                                        (LPVOID)0
                                                                                    );
                                                                return 0;

                                                            case WM_LBUTTONDOWN:
                                                            {
                                                                char buffer[255] = "";
                                                                *((WORD*)buffer) = 255;

                                                                SendMessage(hEdit, EM_GETLINE, 0, (LPARAM)buffer);

                                                                MessageBox(hwnd, buffer, "test", MB_ICONINFORMATION);

                                                                return 0;
                                                            }

                                                            case WM_DESTROY:
                                                                PostQuitMessage (0);
                                                                break;
                                                            default:
                                                                return DefWindowProc (hwnd, message, wParam, lParam);
                                                        }

                                                        return 0;
                                                    }


                                                    N.B: Oui, c'est ça.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      18 avril 2007 à 14:49:25

                                                      Pour GetDC(), j'étais fatigué, je n'ai pas pensé à le récupérer sur une variable :honte: ^.^

                                                      Pour WM_PAINT, je ne dis pas passer "outre", mais je parlais pour le texte, je n'aime pas gérer du texte avec WM_PAINT c'est plus "simple" avec un HWND. :D (pour cacher, changer de police etc.)


                                                      Pour SendMessage(), ça ne fonctionne toujours pas mais je crois que c'est parceque comme la fonction se trouve dans un autre fichier, je n'utilise pas le "static", et ça fait foirer le truc. (j'ai déja eu ça) ^^

                                                      Et P.S. pour

                                                      Citation : PianoPâriss

                                                      N.B. Ah, oui aussi : Comment rendre le fond de ma checkbox (le texte) transparent, je dois passer par WM_CTLCOLORBTN ?

                                                      :p
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        18 avril 2007 à 14:55:58

                                                        Le texte est facilement gérable avec les DC, je l'ai montré dans mon tuto.

                                                        Mieux vaut savoir des alternatives aux contrôles de l'API Win32 puisque dès lors que l'on veut faire quelque chose d'un tant soit peu esthétique, c'est vite la galère... Par exemple, il faut préférer TextOut() aux contrôles STATIC quand le texte est placé sur une image, sinon on est bon pour un BitBlt() dans le WM_CTLCOLORSTATIC. (Tu verras plus rapidement que tu ne le penses l'impossibilité de dispense quant à WM_PAINT et les autres)

                                                        Sinon pour ton SendMessage() : je ne peux pas dire, je n'ai pas l'autre partie du code. Tout ce que je peux dire, c'est que ce que je t'ai donné marche ;)

                                                        P.S: J'ai déjà répondu 'oui' ^^
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          18 avril 2007 à 16:14:00

                                                          Ok, merci beaucoup ;)

                                                          Je sais très bien pour WM_PAINT j'ai déja fait des programmes tu sais ^^(faire un antivirus comme 1er programme avec l'API WIN32 serait du suicide ^^)

                                                          Pour SendMessage() j'ai essayé:
                                                          iT = (int) SendMessage(prop.hRapport, EM_GETLINECOUNT, 0, 0);
                                                          mais ça me renvoit "0" alors que sous MSDN ils disent:

                                                          Citation : MSDN

                                                          The return value will never be less than 1.

                                                          :-°
                                                          (je précise que mes 2 premières lignes sont "\n", ne sait on jamais....)
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            18 avril 2007 à 18:11:02

                                                            Oui je sais, j'ai eu l'occasion de te voir plusieurs fois sur le forum avec des projets différents de celui-ci ;) Et puis, pourquoi serait-ce du scuicide ? L'interface d'un antivirus n'est pas spécialement difficile, l'algorithme l'est. (d'ailleurs, je ne vois pas comment marche un antivirus donc c'est encore plus mystérieux pour moi)

                                                            Par contre pour le EM_GETLINECOUNT je ne vois pas, tout a l'air bon :o ... LRESULT est en fait un long (sous 32bits) ou un int32 (sous 64bits), donc normalement une conversion en integer devrait marcher... tu es sûr qu'il n'y a pas d'erreur possible dans ton code ?

                                                            Essaye de faire un if(SendMessage(prop.hRapport, EM_GETLINECOUNT, 0, 0)) MessageBox(/*...*/); histoire de voir -au cas où- si c'est la conversion qui ne marche pas. Sinon, essaye à tout hasard GetLastError().
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              19 avril 2007 à 15:20:36

                                                              Citation : kidpaddle2

                                                              Oui je sais, j'ai eu l'occasion de te voir plusieurs fois sur le forum avec des projets différents de celui-ci ;) Et puis, pourquoi serait-ce du scuicide ?


                                                              Car au début, dans mes 1ers projets avec l'api win, je ne codais pas proprement, et puis je ne connaissais pas les "trucs", je ne savais pas pourquoi éviter les globales, statics etc. ^^ et avec "l'habitude", on code mieux (même si l'api win sera toujours bordélique :p ).

                                                              Citation : kidpaddle2

                                                              L'interface d'un antivirus n'est pas spécialement difficile, l'algorithme l'est.

                                                              Euh, pour avoir une interface potable, c'est quand même pas facile. :o

                                                              Citation : kidpaddle2

                                                              (d'ailleurs, je ne vois pas comment marche un antivirus donc c'est encore plus mystérieux pour moi)


                                                              Ben, on va dire qu'il va se baser sur des échantillons connus qu'on va lui donner et avec des "empreintes", (puis parfois du MD5 etc.) on va pouvoir retrouver un fichier infecté ou qui contient des traces d'infection (chacun sa métode ^^). :)

                                                              Citation : kidpaddle2

                                                              Par contre pour le EM_GETLINECOUNT je ne vois pas, tout a l'air bon :o ... LRESULT est en fait un long (sous 32bits) ou un int32 (sous 64bits), donc normalement une conversion en integer devrait marcher... tu es sûr qu'il n'y a pas d'erreur possible dans ton code ?


                                                              Bah, c'est une bête petite fonction: (voila la partie concernée)
                                                              char str[256] = {0};
                                                              int iL = 0;
                                                              int iT = 0;
                                                              *((WORD*) str) = 256;

                                                              iT = (int) SendMessage(prop.hRapport,
                                                                                     EM_GETLINECOUNT,
                                                                                     (WPARAM) 0,
                                                                                     (LPARAM) 0);

                                                              while(iL < iT) {
                                                                  if(SendMessage(prop.hRapport, (UINT) EM_GETLINE, 2, (LPARAM) str))
                                                                  MessageBox(/* ... */);
                                                                  if(GetLastError() != 0L)
                                                                  MessageBox(/* ... */);
                                                                  /* ... */
                                                                  ++iL;
                                                              }



                                                              Citation : kidpaddle2

                                                              Essaye de faire un if(SendMessage(prop.hRapport, EM_GETLINECOUNT, 0, 0)) MessageBox(/*...*/); histoire de voir -au cas où- si c'est la conversion qui ne marche pas. Sinon, essaye à tout hasard GetLastError().


                                                              Alors, pas de problème avec le if(SendMessage()), et rien avec GetLastError() o_O ! (me renvoit 0L (= ERROR_SUCCESS)).
                                                              Je comprends vraiment pas oO !
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [API WIN32] Texte avec identificateur

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown