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 :

[C] récupérer le numéro de la ligne


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut [C] récupérer le numéro de la ligne
    bonjour,

    je suis entrain de faire un bloc note en api win 32 et j'ai un problème pour dire à quelle ligne et quelle position se trouve le curseur,


    si vous avez des fonctions, des idées.. je suis preneur


    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Bonjour,
    Tu devrais trouver ton bonheur avec le message EM_LINEFROMCHAR ...
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut
    oui, mais j'ai un problème pour utiliser la fonction;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       lResult = SendMessage(hwnd,EM_LINEFROMCHAR, wParam,(LPARAM) lParam);
    .

    et j'ai déclarer plutôt lresult avec un int.


    mais je n'ai rien qui se passe.

    voilà en entier:

    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
    #include <windows.h>
    
    HINSTANCE hinst;
    
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
                                                      LPSTR lpCmdLine, int nCmdShow)
    {
        HWND hwnd;
        MSG msg;
        WNDCLASS wc;
    
        hinst = hinstance;
    
        wc.style = 0 ;
        wc.lpfnWndProc = MainWndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hinstance;
        wc.hIcon = NULL;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = NULL;
        wc.lpszMenuName =  NULL;
        wc.lpszClassName = "MaWinClass";
    
        if(!RegisterClass(&wc)) return FALSE;
    
        hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW,
                                       CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
                                                       NULL, NULL, hinstance, NULL);
        if (!hwnd)  return FALSE;
    
        ShowWindow(hwnd, nCmdShow);
    
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    /******************************************************************************/
    
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        HWND hEdit;
        int lResult;
    
        switch (uMsg)
        {
            case WM_CREATE:
               hEdit =CreateWindow("edit", "Texte",
                  WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,
                                               10, 10, 200, 400, hwnd, NULL, hinst, NULL);
    
                lResult = SendMessage(hwnd,EM_LINEFROMCHAR, wParam,(LPARAM) lParam);
    
    
                return 0;
    
            case WM_SIZE:
                MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                return 0;
    
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
    
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    }

    donc voilà si vous pouvez m'aidez,


    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu codes au hasard, visiblement, non ?
    • hEdit n'est pas préservé d'un appel à l'autre, et ton EditBox n'a pas d'ID: Tu n'auras donc aucun moyen d'agir sur ton editbox par la suite.
    • Le SendMessage doit se faire sur l'EditBox
    • Et il ne se fait pas avec les WPARAM et LPARAM de la fenêtre : Il se fait avec ceux que TU veux lui passer. L'un d'eux devra sans doute être le résultat d'un message EM_GETSEL...
    • Et pour les trucs beaucoup moins importants:
      • Le style de code de ta WindowProc me déplait. Je suis plutôt un adepte du SESE (Single Entry, Single Exit) quand j'écris une WindowProc...
      • Et le code n'est pas TCHAR-compliant, non plus...
    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.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut
    sérieusement c'est la première fois que je suis en face de send message, je connais du tout pas la fonction, si y a pas un tutoriel qui l'explique ou ...

    je sais j'ai fait un peu au n'importe quoi :s ...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est le genre de choses qui devrait être à la base de tout tutoriel sur WinAPI:
    • On donne la formule magique qui affiche une fenête "Hello World"
    • On explique la formule pour qu'elle ne soit plus magique:
      • On explique ce qu'est une WNDCLASS
      • On explique le système de messages de Windows
      • On explique la façon dont les fenêtres se dessinent.

    SendMessage() utilisé pour une fenêtre ou contrôle dans le même thread, ça ne fait rien de plus compliqué qu'un appel de fonction: Tout simplement, ça appelle la WindowProc du contrôle avec les paramètres que tu veux.
    Et la WindowProc des contrôles EDIT sait traiter le message EM_GETSEL, et elle le traite de la façon écrite dans la doc...
    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.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut
    OK, et comment faire pour l'id de l'edit box ???

    après il resteras plus qu'à associer sendmsg avec id edit box.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    On lui passe l'ID à la création, dans le paramètre hMenu (il faut un cast).
    Seules les fenêtres avec le style WS_CHILD peuvent avoir un id, et seules les fenêtres sans le style WS_CHILD peuvent avoir un menu, c'est comme ça que la fonction CreateWindow() fait la différence.

    Généralement, on commence les ids à partir de 1000. Ne me demande pas pourquoi...
    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.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut
    donc ça me donne ça avec ws_child:

    et après avec ça, qu'est ce qu'on fait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          hEdit =CreateWindow("edit", "Texte",
                  WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,
                                               5, 5, 350, 250, hwnd, NULL, hinst, NULL);
    c'est quoi la param hMenu ?
    et comment transmettre l'ID dans l'edit box et dans le sendmsg...


    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    T'arrive-t-il de lire l'aide ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define IDC_MONEDIT 1000
     
    ...
     
    hEdit = CreateWindow(TEXT("edit"), TEXT("Texte"),
     WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,
     5, 5, 350, 250, hwnd, (HMENU)IDC_MONEDIT, NULL, NULL
     );
    Et si jamais à un moment tu as besoin du HWND de ton Edit, tu utilises la fonction GetDlgItem().
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut
    re c'est deja mieu compris,

    mais j'ai un problème dans la compilation:

    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
    #include <windows.h>
    #include<stdio.h>
    #define IDC_MONEDIT 1000
    
    HINSTANCE hinst;
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
                                                      LPSTR lpCmdLine, int nCmdShow)
    {
        HWND hwnd;
        MSG msg;
        WNDCLASS wc;
    
        hinst = hinstance;
    
        wc.style = 0 ;
        wc.lpfnWndProc = MainWndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hinstance;
        wc.hIcon = NULL;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = NULL;
        wc.lpszMenuName =  NULL;
        wc.lpszClassName = "MaWinClass";
    
        if(!RegisterClass(&wc)) return FALSE;
    
        hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW,
                                       CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
                                                       NULL, NULL, hinstance, NULL);
        if (!hwnd)  return FALSE;
    
        ShowWindow(hwnd, nCmdShow);
    
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    
    /******************************************************************************/
    
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        HWND hEdit;
        int lResult, lResult2;
    
        switch (uMsg)
        {
            case WM_CREATE:
               hEdit = CreateWindow(TEXT("edit"), TEXT("Texte"),
     WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,
     5, 5, 350, 250, hwnd, (HMENU)IDC_MONEDIT, NULL, NULL );
    
                lResult = SendMessage(hwnd,EM_LINEFROMCHAR,0,0);
    
    
    	sprintf(lResult2, "ligne %d",lResult);
            MessageBox(hwnd,lResult2,"Résultat", MB_OK);
    
    
                return 0;
    
            case WM_SIZE:
                MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                return 0;
    
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
    
            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    }
    je vois du tout pas l'erreur, peut tu me l'indiquer ?


    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu pouvais préciser quelles sont les erreurs de compil en question...
    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.

  13. #13
    Membre averti Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Points : 442
    Points
    442
    Par défaut
    Au début de la MainWndProc, tu déclares en int la variable lResult2 que tu utilises ensuite dans un sprintf !

    Il te faut une variable chaine de caractères.
    www.iristechnologies.eu
    Centre de formation à Paris et Toulouse

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 95
    Points : 35
    Points
    35
    Par défaut
    voilà c'est bon mais ça m'indique toujours la valeur 0:

    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
    LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        HWND hEdit;
        char lResult2[20];
        int lResult;
    
        switch (uMsg)
        {
            case WM_CREATE:
               hEdit = CreateWindow(TEXT("edit"), TEXT("Texte"),
     WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL,
     5, 5, 350, 250, hwnd, (HMENU)IDC_MONEDIT, NULL, NULL );
            return 0;
    
    
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {
    
                     case IDM_NEW:
    
                lResult = SendMessage(IDC_MONEDIT,EM_LINEFROMCHAR,0,0);
            sprintf(lResult2, "ligne %d",lResult);
            MessageBox(hwnd,lResult2,"Résultat", MB_OK);
    
            return 0;

    je comprends pas pourquoi il m'indique toujours 0 !!


    si vous voyez l'erreur...


    merci

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/05/2010, 20h30
  2. récupérer le numéro de la ligne courante d'un fichier txt en javascript
    Par developppez dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/06/2008, 18h29
  3. Réponses: 3
    Dernier message: 07/01/2008, 17h12
  4. Récupérer le numéro de la ligne sélectionnée dans une variable?
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/10/2007, 11h48
  5. [xml] Récupérer le numéro de la ligne d'erreur d'un fichier
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 7
    Dernier message: 20/03/2004, 19h09

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