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 :

MAKELPARAM et GetParent (WIN32 API et C)


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut MAKELPARAM et GetParent (WIN32 API et C)
    Bonjour,
    J'ai deux petits problèmes :
    1 - Comment utiliser MAKELPARAM (avec un HWND et un pointeur sur le premier element d'une liste chainée).
    Voila ce que je fais et qui ne fonctionne pas :
    - Dans la procedure de la fenetre principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case IDM_PLAYLIST:
                        {
                        HWND hDial =  CreateDialogParam(hInst, "playlist" , hwnd, (DLGPROC)Dlgplaylist,MAKELPARAM(listeFile,hwnd));
                        ShowWindow (hDial, SW_NORMAL);
                        }
                        break;
    - Dans le callBack de la fenetre "playlist" :
    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
    BOOL APIENTRY Dlgplaylist(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        static llist listeFichier = NULL;
        static HWND hwndP = NULL;
    
    	switch (uMsg)
        {
    		case WM_INITDIALOG:
            {
                listeFichier = (llist)LOWORD(lParam);
                llist listFile = listeFichier;
                hwndP = (HWND)HIWORD(lParam);
                char *nomMusique = NULL;
                if (listFile == NULL) return TRUE;
                HWND listBox = GetDlgItem(hdlg,IDL_PLAYLIST);
                while (listFile != NULL)
                {
                    nomMusique = strrchr (listFile->titre,'\\')+1;
                    SendMessage(listBox,LB_ADDSTRING,0,(LPARAM)nomMusique);
                    listFile = listFile->nxtElement;
                }
                return TRUE;
            }
    Et la structure de llist (même si je pense que ca sert a rien ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Structure de definition de liste chainee
    typedef struct element
    {
        char    titre[MAX_PATH];
        struct  element *nxtElement;
    } element;
    typedef element* llist;
    Voila donc quand je fais cela, ca compile bien (mais j'ai 4 warnings deux quand à la la ligne hDial = CreateDialogParam... et un par ligne de recuperation des HIWORD et LOWORD de lParam)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    main.cpp: In function `LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)':
    main.cpp:253: warning: cast from pointer to integer of different size
    main.cpp:253: warning: cast from pointer to integer of different size
    main.cpp: In function `BOOL Dlgplaylist(HWND__*, UINT, WPARAM, LPARAM)':
    main.cpp:398: warning: cast to pointer from integer of different size
    main.cpp:401: warning: cast to pointer from integer of different size
    et quand j'execute le programme j'ai un "plantage" (message windows XP qui dit que le programme doit se terminer) à la ligne :
    nomMusique = strrchr (listFile->titre,'\\')+1;



    2 - Comment récuperer le HWND de la fenetre depuis laquelle est utiliser la fonction createDialogParam. (ou plutot le handle passer en parametre de cette fonction : CreateDialogParam(hInst, "playlist" , hwnd, (DLGPROC)Dlgplaylist,MAKELPARAM(listeFile,hwnd))
    Nota : le template de playlist :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /****Boite de Dialogue playlist*****/
    playlist DIALOGEX 50, 50, 150, 60
    			 STYLE WS_BORDER | WS_CAPTION | WS_SYSMENU
              CAPTION "PlayList"
              FONT 9, "Comic Sans MS"
    
              BEGIN
                   //CONTROL "",-1,"STATIC",SS_ETCHEDFRAME,      2,  2, 181, 86
                   CONTROL "", IDL_PLAYLIST, "LISTBOX", WS_CHILD | WS_VISIBLE | LBS_STANDARD , 5, 5, 140, 50
                   //ICON 18,   -1,                             147, 4, 32, 32
                   //PUSHBUTTON "Effacer", IDB_OK, 15, 40, 120, 12
              END
    Comme vous pouvez le voir la fenetre "playlist" n'as pas le STYLE WS_CHILD donc GetParent ne fonctionne pas.

    Merci de votre aide.
    A+

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    1. Je pense que tu ne définis pas correctement l'identifiant de ta ressource dialogue: en général on les définit numériquement (par ex #define IDD_PLAYLIST 109), puis on utilise la macro MAKEINTRESOURCE pour passer cet id numérique à toutes les fonctions de l'API qui réclament un nom de template.

    2. Le style WS_CHILD n'a pas de rapport avec la fonction GetParent() : si le dialogue et sa fenêtre mère sont correctement chainés au moment de la création du premier, GetParent() doit fonctionner.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Salut,
    merci de ta réponse mais malheureusement ca ne change rien
    J'ai ajouté un #define IDD_PLAYLIST 750 comme tu me l'a conseiller mais le resultat est le même.

    A mon avis j'utilise mal la macro MAKELPARAM mais je ne vois pas pourquoi.

    Pour GetParent(), si j'ajoute le flag WS_CHILD au style de la boite de dialogue IDD_PLAYLIST ca fonctionne mais la boite de dialogue est "inclue" dans la fenetre principale ce qui ne me convient pas.

    Donc mes questions sont les même que celle du premier poste.
    Et j'en rajoute une : Comment utiliser les constantes predefini (enfin je pense qu'elle le sont mais je sais pas dans quelle fichier?) VK_MEDIA_PLAY_PAUSE ou encore VK_MEDIA_STOP.
    Voila merci de vos efforts (je sais que le code est long et pas vraiment commenté ).
    Au passage si autre chose vous choque dans mon code n'hesiter je suis preneur des critiques (enfin pas trop qd même )
    Voici le code complet.
    main.cpp
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    #include <windows.h>
    #include <commctrl.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <FMOD/fmod.h>
    
    #include "linkedlist.h"
    #include "function.h"
    #include "ressource.h"
    
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    BOOL APIENTRY Dlgplaylist(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nFunsterStil)
    {
        HWND hwnd;              /* Fenetre Principal */
        char szClassName[ ] = "MaClass";
        MSG messages;            /* Message envoye a l'appli */
        WNDCLASSEX clWin;        /* Classe de la fenetre principale */
    
    
        HBRUSH monBrush = CreateSolidBrush(RGB(150,175,255));
    
        //Construction de la classe de la fenetre
        clWin.hInstance = hThisInstance;
        clWin.lpszClassName = szClassName;
        clWin.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        clWin.style = 0;                 /* Catch double-clicks */
        clWin.cbSize = sizeof (WNDCLASSEX);
        clWin.hIcon = LoadIcon(hThisInstance, MAKEINTRESOURCE(ICONE_SYSTRAY));//LoadIcon(hInst,MAKEINTRESOURCE(ICON_FPRINCIPAL));    //charge l'icône
        clWin.hIconSm = LoadIcon(hThisInstance, MAKEINTRESOURCE(ICONE_SYSTRAY));//LoadIcon(hInst,MAKEINTRESOURCE(ICON_FPRINCIPAL));
        clWin.hCursor = LoadCursor (NULL, IDC_ARROW);
        clWin.lpszMenuName = "MENUPRINC";                 /* No menu */
        clWin.cbClsExtra = 0;                      /* No extra bytes after the window class */
        clWin.cbWndExtra = 0;                      /* structure or the window instance */
        clWin.hbrBackground = (HBRUSH)monBrush;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&clWin))
            return FALSE;
    
        //Création de la fenetre
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Lecteur Audio",       /* Title Text */
               WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               370,                 /* The programs width */
               150,                 /* 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 */
               );
    
        /* Affichage de la fenetre */
        ShowWindow (hwnd, nFunsterStil);
    
        //Initialisation de FMOD
        if (!FSOUND_Init(44100, 32, 0))
        {
            SetDlgItemText(hwnd,IDE_MUSICNAME,"Erreur lors l'initialisation de FMOD");
        }
    
        /* 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);
        }
        //Suppression du brush
        DeleteObject(monBrush);
        //Fermeture de FMOD
        FSOUND_Close();
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        static FSOUND_STREAM *musique = NULL;
        static HWND slideBar;
        static HWND verticalBar;
        static unsigned int totalTime =0;
        static int stopMAJ = 0;
        static llist listeFile = NULL;
        static int numPiste = 0;
        static HINSTANCE hInst;
        static int play = 1;
        static HBRUSH monBrush;
        static int a=0;
        static HMENU sysTrayMenu;
    
        switch(msg)
        {
            case WM_CREATE:
            {
    
                CREATESTRUCT *createParam = (CREATESTRUCT *)lParam;
                hInst = createParam->hInstance;
                HFONT NewFont;
                LOGFONT lf;
                HWND tmp = NULL;
    
                ZeroMemory(&lf, sizeof(LOGFONT));
                lstrcpy(lf.lfFaceName,"Comic Sans MS");
                lf.lfHeight = 20;
                lf.lfItalic = TRUE;
                lf.lfWeight = 500;
    
                NewFont = CreateFontIndirect(&lf);
    
                tmp = CreateWindow("edit","attente",
                            WS_CHILD | WS_VISIBLE |ES_AUTOHSCROLL | ES_READONLY | ES_CENTER,10,10,330,20,hwnd,
                            (HMENU) IDE_MUSICNAME, hInst, NULL);
                SendMessage(tmp,WM_SETFONT,(UINT)NewFont,TRUE);
                verticalBar = CreateWindow(TRACKBAR_CLASS,"",
                            WS_CHILD | WS_VISIBLE | TBS_NOTICKS | TBS_VERT ,345,10,20,70,hwnd,
                            (HMENU) IDSB_VOLUME, hInst, NULL);
                SendMessage(verticalBar, TBM_SETRANGE, TRUE, MAKELONG(0,255));
                SendMessage(verticalBar,TBM_SETPOS,TRUE,125);
                FSOUND_SetVolume(MUSIQUE_FOND, 125); //Le volume (0-255)
                slideBar = CreateWindow(TRACKBAR_CLASS,"",
                            WS_CHILD | WS_VISIBLE | TBS_NOTICKS,10,40,330,25,hwnd,
                            (HMENU) IDSB_TIME, hInst, NULL);
                /*slideBar = CreateWindowEx(0,PROGRESS_CLASS,"",
                            WS_CHILD | WS_VISIBLE | PBS_SMOOTH
                            ,10,40,330,10,hwnd,
                            (HMENU) IDSB_TIME, hInst, NULL);*/
                SendMessage(slideBar,PBM_SETBARCOLOR,0,RGB(150,175,255));
                tmp = CreateWindow("edit","",
                            WS_CHILD | WS_VISIBLE | ES_READONLY | ES_LEFT,10,80,150,20,hwnd,
                            (HMENU) IDE_STATUS, hInst, NULL);
                SendMessage(tmp,WM_SETFONT,(UINT)NewFont,TRUE);
                tmp = CreateWindow("edit","",
                            WS_CHILD | WS_VISIBLE | ES_READONLY | ES_RIGHT,200,80,140,20,hwnd,
                            (HMENU) IDE_TIME, hInst, NULL);
                SendMessage(tmp,WM_SETFONT,(UINT)NewFont,TRUE);
                SetTimer (hwnd,ID_TIMER,1000,NULL);
                monBrush = CreateSolidBrush(RGB(150,175,255));
                sysTrayMenu = GetSubMenu(LoadMenu(hInst, "MENUSYSTRAY"),0);
            }
                break;
            case WM_COMMAND:
                switch (LOWORD(wParam))
                {
                    case IDM_QUITTER:
                        SendMessage(hwnd,WM_DESTROY,0,0);
                        break;
                    case IDM_APROPOS:
                        a++;
                        break;
                    case IDM_OUVRIR:
                    {
                        OPENFILENAME ofn;
                        char szFile[MAX_PATH*5]={0};
    
                        ZeroMemory(&ofn, sizeof(OPENFILENAME));
    
                        ofn.lStructSize = sizeof(OPENFILENAME);
                        ofn.hwndOwner = hwnd;
                        ofn.lpstrFile = szFile;
                        ofn.nMaxFile = MAX_PATH*5;
                        ofn.nFilterIndex = 2;
                        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_EXPLORER ;
                        ofn.lpstrTitle = "Ouvrir...";
                        ofn.lpstrFilter =
                            "Tous les fichiers (*.*)\0*.*\0Musique\0*.mp3;*.wmv;*.wma;*.ogg\00";
                        if (GetOpenFileName(&ofn)==TRUE)
                        {
                            listeFile = GetSelection(szFile,listeFile);
                            if (musique != NULL) break;
                            if (LoadMusicByID(listeFile,hwnd,0,&musique) == SUCCESS)
                            {
                                numPiste = 0;
                                totalTime = FSOUND_Stream_GetLengthMs(musique)/1000;
                                SendMessage(slideBar, TBM_SETRANGE, TRUE, MAKELONG(0,totalTime));
                              /*  SendMessage(slideBar, PBM_SETRANGE, 0,
                                                    MAKELPARAM(0, totalTime));
                                SendMessage(slideBar, PBM_SETSTEP, (WPARAM) 1, 0);
                              */
                                SetDlgItemText(hwnd,IDE_STATUS,"Stop");
                            }
                        }
                        play = 0;
                    }
                        break;
                    case IDM_PLAY:
                        if (FSOUND_GetPaused(MUSIQUE_FOND)) // Si la chanson est en pause
                                FSOUND_SetPaused(MUSIQUE_FOND, 0); // On enlève la pause
                        else FSOUND_Stream_Play(MUSIQUE_FOND,musique);
                        SetDlgItemText(hwnd,IDE_STATUS,"Play");
                        //Reglage du volume
                        SendMessage(hwnd,WM_VSCROLL,0,(LPARAM)verticalBar);
                        play = 1;
                        break;
                    case IDM_STOP:
                        FSOUND_Stream_Stop(musique);
                        SetDlgItemText(hwnd,IDE_STATUS,"Stop");
                        FSOUND_SetPaused(MUSIQUE_FOND, 0); // On enlève la pause
                        play = 0;
                        break;
                    case IDM_NEXT:
                        if (LoadMusicByID(listeFile,hwnd,numPiste+1,&musique) == SUCCESS)
                        {
                            numPiste++;
                            totalTime = FSOUND_Stream_GetLengthMs(musique)/1000;
                            SendMessage(slideBar, TBM_SETRANGE, TRUE, MAKELONG(0,totalTime));
                            FSOUND_Stream_Play(MUSIQUE_FOND,musique);
                            SetDlgItemText(hwnd,IDE_STATUS,"Play");
                            //Reglage du volume
                            SendMessage(hwnd,WM_VSCROLL,0,(LPARAM)verticalBar);
                        }
                        break;
                    case IDM_BACK:
                        if (LoadMusicByID(listeFile,hwnd,numPiste-1,&musique) == SUCCESS)
                        {
                            numPiste--;
                            totalTime = FSOUND_Stream_GetLengthMs(musique)/1000;
                            SendMessage(slideBar, TBM_SETRANGE, TRUE, MAKELONG(0,totalTime));
                            FSOUND_Stream_Play(MUSIQUE_FOND,musique);
                            SetDlgItemText(hwnd,IDE_STATUS,"Play");
                            //Reglage du volume
                            SendMessage(hwnd,WM_VSCROLL,0,(LPARAM)verticalBar);
                        }
                        break;
                    case IDM_PAUSE:
                        if (FSOUND_GetPaused(MUSIQUE_FOND)) // Si la chanson est en pause
                        {
                            FSOUND_SetPaused(MUSIQUE_FOND, 0); // On enlève la pause
                            SetDlgItemText(hwnd,IDE_STATUS,"Play");
                        }
                        else // Sinon, elle est en cours de lecture
                        {
                            FSOUND_SetPaused(MUSIQUE_FOND, 1); // On met en pause
                            SetDlgItemText(hwnd,IDE_STATUS,"Pause");
                        }
                        break;
                    case IDM_PLAYLIST:
                        {
                        //HWND hDial =  CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_PLAYLIST) , hwnd, (DLGPROC)Dlgplaylist,(LPARAM)listeFile);
                        HWND hDial =  CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_PLAYLIST)  , hwnd, (DLGPROC)Dlgplaylist,MAKELPARAM(listeFile,hwnd));
                        ShowWindow (hDial, SW_NORMAL);
                        }
                        break;
                    case IDM_CLEARPL:
                        listeFile = effacerListe(listeFile);
                        break;
                }
                break;
            case WM_KEYDOWN:
                switch (wParam)
                {
                    case 179 : //VK_MEDIA_PLAY_PAUSE
                        SendMessage(hwnd,WM_COMMAND,WPARAM(IDM_PLAY),0);
                        break;
                    case 178: //VK_MEDIA_STOP
                        SendMessage(hwnd,WM_COMMAND,WPARAM(IDM_STOP),0);
                        break;
                    case 177: //VK_MEDIA_PREV_TRACK
                        SendMessage(hwnd,WM_COMMAND,WPARAM(IDM_BACK),0);
                        break;
                    case 176: //VK_MEDIA_NEXT_TRACK
                        SendMessage(hwnd,WM_COMMAND,WPARAM(IDM_NEXT),0);
                        break;
                }
                break;
            case WM_HSCROLL:
                if ((HWND)lParam == slideBar)
                {
                    if (LOWORD(wParam)==TB_THUMBTRACK) stopMAJ = 1;
                    if (LOWORD(wParam)==TB_THUMBPOSITION)
                    {
                        unsigned int position = SendMessage(slideBar,TBM_GETPOS,0,0);
                        FSOUND_Stream_SetTime(musique,position*1000);
                        stopMAJ = 0;
                    }
                }
                break;
            case WM_VSCROLL:
                if ((HWND)lParam == verticalBar)
                {
                    //if (LOWORD(wParam)==TB_THUMBTRACK)
                    //{
                        char tvolume[256];
                        unsigned int volume = SendMessage(verticalBar,TBM_GETPOS,0,0);
                        FSOUND_SetVolume(MUSIQUE_FOND, volume);
                        sprintf(tvolume,"%d",volume);
                        SetDlgItemText(hwnd,IDE_STATUS,tvolume);
                    //}
                }
                break;
            case WM_CTLCOLORSTATIC:
                {
                //On récupère un DC dessus...
                HDC textDC = (HDC)wParam;
                SetTextColor(textDC,RGB(200,0,125));
                //Qui permet de nous donner la main sur le texte à rendre transparent
                SetBkMode(textDC, TRANSPARENT);
                //Et finalement on retourne une brosse pour colorer son fond. (la même
                //que la fenêtre principale)
                return (LRESULT)monBrush;
                }
                break;
            case WM_TIMER:
                if (musique != NULL)
                {
                    unsigned int tempsEcoule = FSOUND_Stream_GetTime(musique)/1000;
                    if (!stopMAJ) SendMessage(slideBar,TBM_SETPOS,TRUE,tempsEcoule);//SendMessage(slideBar, PBM_SETPOS, tempsEcoule, 0); //
                    char temps[256] = {'\0'};
                    sprintf (temps,"%02d:%02d / %02d:%02d",tempsEcoule/60,tempsEcoule%60,totalTime/60,totalTime%60);
                    SetDlgItemText(hwnd,IDE_TIME,temps);
                    char titre[256] = {'\0'};
                    GetDlgItemText(hwnd,IDE_MUSICNAME,titre,255);
                    titre[strlen(titre)-4] = '\0';
                    ModifSysTray(hwnd, titre, temps);
                    if ((!FSOUND_IsPlaying(MUSIQUE_FOND)) && (play)) SendMessage(hwnd,WM_COMMAND,WPARAM(IDM_NEXT),0);
                }
                break;
            case WM_DESTROY:
                if (musique != NULL) FSOUND_Stream_Close(musique);
                SetSysTray(hInst, hwnd, false, "");
                KillTimer(hwnd,ID_TIMER);
                DeleteObject(monBrush);
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            case WM_USER+10:
                if (LoadMusicByID(listeFile,hwnd,(int)lParam,&musique) == SUCCESS)
                {
                    numPiste = (int)lParam;
                    totalTime = FSOUND_Stream_GetLengthMs(musique)/1000;
                    SendMessage(slideBar, TBM_SETRANGE, TRUE, MAKELONG(0,totalTime));
                    FSOUND_Stream_Play(MUSIQUE_FOND,musique);
                    SetDlgItemText(hwnd,IDE_STATUS,"Play");
                    play = 1;
                    //Reglage du volume
                    SendMessage(hwnd,WM_VSCROLL,0,(LPARAM)verticalBar);
                }
                break;
            case WM_SYSCOMMAND:
                if(wParam == SC_CLOSE)
                {
                    SetSysTray(hInst, hwnd, true, "Lecteur Audio");
                    ShowWindow(hwnd, SW_HIDE);
                }
                else return DefWindowProc (hwnd, msg, wParam, lParam);
                break;
            case MY_TRAY_MESSAGE:
                switch(lParam)
                {
                    case WM_LBUTTONDBLCLK:
                        SetSysTray(hInst, hwnd, false, "");
                        ShowWindow(hwnd, SW_RESTORE);
                        break;
                    case WM_MBUTTONDOWN:
                        SetSysTray(hInst, hwnd, false, "");
                        ShowWindow(hwnd, SW_RESTORE);
                        break;
                    case WM_RBUTTONDOWN:
                    case WM_CONTEXTMENU:
                    {
                        POINT pt;
                        GetCursorPos(&pt);    //récupère la postion du curseur
                        SetForegroundWindow(hwnd);
                        TrackPopupMenuEx(sysTrayMenu, 0, pt.x, pt.y, hwnd, NULL);    //Affiche le menu systray
                        break;
                    }
                }
                break;
            default:
                return DefWindowProc (hwnd, msg, wParam, lParam);
                break;
        }
        return 0;
    }
    
    /******************** Boite de dialogue playlist ***************************/
    BOOL APIENTRY Dlgplaylist(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        static llist listeFichier = NULL;
        static HWND hwndP = NULL;
    
    	switch (uMsg)
        {
    		case WM_INITDIALOG:
            {
                listeFichier = (llist)LOWORD(lParam);
                //listeFichier = (llist)lParam;
                llist listFile = listeFichier;
                hwndP = (HWND)HIWORD(lParam);
                char *nomMusique = NULL;
                if (listFile == NULL) return TRUE;
                HWND listBox = GetDlgItem(hdlg,IDL_PLAYLIST);
                while (listFile != NULL)
                {
                    nomMusique = strrchr (listFile->titre,'\\')+1;
                    SendMessage(listBox,LB_ADDSTRING,0,(LPARAM)nomMusique);
                    listFile = listFile->nxtElement;
                }
                return TRUE;
            }
    		case WM_COMMAND:
                if(LOWORD(wParam)==IDL_PLAYLIST && HIWORD(wParam)==LBN_DBLCLK)
                {
                    HWND listBox = GetDlgItem(hdlg,IDL_PLAYLIST);
                    element *nouveau = NULL;
                    char titre[256] = {'\0'};
                    char txtRch[256] = {'\0'};
    
                    int index = SendMessage(listBox,LB_GETCURSEL,0,0);
                    SendMessage(listBox,LB_GETTEXT,index,(LPARAM)titre);
                    sprintf(txtRch,"%s%s","\\",titre);
                    int indice = rechercherElement(listeFichier, txtRch);
                    nouveau = element_i(listeFichier, indice);
                    if (indice < 0) return TRUE;
                    //HWND hParent = FindWindow("MaClass","Lecteur Audio");
                    HWND hParent = GetParent(hdlg);
                    if (hParent != NULL)
                        SendMessage (hParent,WM_USER+10,0,LPARAM(indice));
                    else
                        MessageBox(hdlg,
                        (LPCTSTR)"Problème de récupération du handle de la fenetre parent",
                        (LPCTSTR)"titre",
                        MB_OK | MB_ICONWARNING);
                    //SendMessage(hwnd,IDE_MUSICNAME,0,(LPARAM)nomMusique);
                    return TRUE;
                }
                if(LOWORD(wParam)==IDCANCEL)
                {
                    EndDialog(hdlg,0);
                }
                return TRUE;
            default:
                return FALSE;
        }
    }
    function.cpp
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    #define _WIN32_IE 0x0600
    #include <windows.h>
    #include <commctrl.h>
    #include <stdio.h>
    
    #include <FMOD/fmod.h>
    
    #include "linkedlist.h"
    #include "function.h"
    #include "ressource.h"
    
    llist GetSelection(char liste[], llist listFichier)
    {
        char charActuel = 0;
        char charSuivant = 0;
        long numChar = 0;
        long nbrePiste = 0;
        char repertoire[MAX_PATH] = {'\0'};
        char chaine[MAX_PATH] = {'\0'};
        char *chaineTmp = NULL;
    
        //Nettoyage de la liste de fichier
        //listFichier = effacerListe(listFichier);
    
        //Recherche du nombre de fichier selectionner
        do
        {
            charActuel = liste[numChar];
            charSuivant = liste[numChar+1];
            numChar++;
            if (charActuel == '\0')
            {
                nbrePiste++;
            }
        } while ((charActuel != '\0') || (charSuivant != 0));
    
        //Ajout des elements dans la liste
        if (nbrePiste == 1)
        {
            listFichier = ajouterEnFin(listFichier, liste);
        }
        else if (nbrePiste > 1)
        {
            nbrePiste--;
            strcpy(repertoire,liste);
            if (repertoire[strlen(repertoire)-1] != '\\') repertoire[strlen(repertoire)] = '\\';
            for (int i = 0; i < nbrePiste; i++)
            {
                memcpy(chaine,"0",sizeof(chaine));
                chaineTmp = strchr(liste,'\0')+1;
                strcpy(chaine,repertoire);
                strcat(chaine,chaineTmp);
                listFichier = ajouterEnFin(listFichier, chaine);
                liste = chaineTmp;
            }
        }
        return listFichier;
    }
    
    int LoadMusicByID(llist liste, HWND fenetre, int ID,FSOUND_STREAM **musique)
    {
        element *nouveau;
        char *nomMusique = NULL;
        if (ID < 0)
        {
            return ERROR;
        }
        nouveau = element_i(liste, ID);
        if (nouveau == NULL)
        {
            return ERROR;
        }
        nomMusique = strrchr (nouveau->titre,'\\')+1;
        SetDlgItemText(fenetre,IDE_MUSICNAME,nomMusique);
    
        if (*musique != NULL) FSOUND_Stream_Close(*musique);
        *musique = FSOUND_Stream_Open(nouveau->titre, FSOUND_MPEGACCURATE , 0, 0);
        if (*musique == NULL)
        {
            SetDlgItemText(fenetre,IDE_MUSICNAME,"Impossible d'ouvrir la musique");
            return ERROR;
        }
        return SUCCESS;
    }
    
    /*********************** Mettre l'icône dans le systray ***********************/
    void SetSysTray(HINSTANCE hinst, HWND handle, BOOL yesno, char infoBulle[])
    {
       NOTIFYICONDATA TrayIcon;
       TrayIcon.cbSize = sizeof(NOTIFYICONDATA);
       TrayIcon.hWnd = handle;   //handle de la fenêtre à mettre en systray
       TrayIcon.uID = 0;
       TrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
       TrayIcon.uCallbackMessage = MY_TRAY_MESSAGE;
       TrayIcon.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(ICONE_SYSTRAY));//LoadIcon(hinst, (LPCTSTR)5);   //icône qui s'affichera dans la systray
       TrayIcon.dwInfoFlags = NIIF_INFO | NIIF_NOSOUND;
       TrayIcon.uTimeout = 1000;
       strcpy(TrayIcon.szInfo, "Par David VINET");
       strcpy(TrayIcon.szInfoTitle, infoBulle);
       strcpy(TrayIcon.szTip, infoBulle);           //infobulle de la systray
       if(yesno)
       {
          //systray=true;
          Shell_NotifyIcon(NIM_ADD, &TrayIcon);
       }
       else
       {
          //systray=false;
          Shell_NotifyIcon(NIM_DELETE, &TrayIcon);
       }
    }
    
    /********************** Modifier l'info Bulle su SysTray **********************/
    void ModifSysTray(HWND handle, char infoBulle[], char infoBulle2[])
    {
        char info[256] = {'\0'};
        sprintf(info,"%s\n%s",infoBulle,infoBulle2);
        //Mise a jour de l'infoBulle du SysTray
        NOTIFYICONDATA TrayIcon;
        TrayIcon.cbSize = sizeof(NOTIFYICONDATA);
        TrayIcon.hWnd = handle;   //handle de la fenêtre à mettre en systray
        TrayIcon.uID = 0;
        TrayIcon.uFlags = NIF_TIP;
        strcpy(TrayIcon.szTip, info);
        Shell_NotifyIcon(NIM_MODIFY, &TrayIcon);
    }
    function.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef H_FUNCTION
    #define H_FUNCTION
    
    #define ERROR 0
    #define SUCCESS 1
    llist GetSelection(char liste[], llist listFichier);
    int LoadMusicByID(llist liste, HWND fenetre, int ID,FSOUND_STREAM **musique);
    void SetSysTray(HINSTANCE hinst, HWND handle, BOOL YesNo, char infoBulle[]);
    void ModifSysTray(HWND handle, char infoBulle[], char infoBulle2[]);
    #endif
    linkedlist.h
    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
    #ifndef H_LINKEDLIST
    #define H_LINKEDLIST
    
    //Structure de definition de liste chainee
    typedef struct element
    {
        char    titre[MAX_PATH];
        struct  element *nxtElement;
    } element;
    typedef element* llist;
    
    llist ajouterEnTete(llist liste, char valeur[]);
    llist ajouterEnFin(llist liste, char valeur[]);
    int estVide(llist liste);
    llist supprimerElementEnTete(llist liste);
    llist supprimerElementEnFin(llist liste);
    llist element_i(llist liste, int indice);
    int nombreElements(llist liste);
    llist effacerListe(llist liste);
    int rechercherElement(llist liste, char texte[]);
    llist getLastAdress(llist liste);
    
    #endif
    ressource.rc
    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
    #include <windows.h>
    #include "ressource.h"
    
    //ICON_EXE ICON Icone\\tour.ico
    
    CREATEPROCESS_MANIFEST_RESOURCE_ID  RT_MANIFEST manifest.xml
    ICONE_SYSTRAY ICON ico\\ipod_black.ico
    //ICON_FPRINCIPAL ICON Icone\\ecran.ico
    
    MENUPRINC MENU
    BEGIN
         POPUP "Fichier"
               BEGIN
                    MENUITEM "&Ouvrir", IDM_OUVRIR
                    MENUITEM SEPARATOR
                    MENUITEM "&Quitter", IDM_QUITTER
               END
        POPUP "Musique"
                BEGIN
                    MENUITEM "&Lecture", IDM_PLAY
                    MENUITEM "&Pause", IDM_PAUSE
                    MENUITEM "&Stop", IDM_STOP
                    MENUITEM SEPARATOR
                    MENUITEM "&Suivante", IDM_NEXT
                    MENUITEM "&Précédente", IDM_BACK
                END
        POPUP "PlayList"
                BEGIN
                    MENUITEM "&Afficher", IDM_PLAYLIST
                    MENUITEM "&Effacer", IDM_CLEARPL
                END
        MENUITEM "&A propos ...", IDM_APROPOS
    END
    
    MENUSYSTRAY MENU
    BEGIN
         POPUP "Systray"
               BEGIN
            //        MENUITEM "&Restaurer", IDS_RESTORE
                    POPUP "PlayList"
                        BEGIN
                            MENUITEM "&Afficher", IDM_PLAYLIST
                            MENUITEM "&Effacer", IDM_CLEARPL
                        END
                    MENUITEM SEPARATOR
                    MENUITEM "&Suivante", IDM_NEXT
                    MENUITEM "&Précédente", IDM_BACK
                    MENUITEM SEPARATOR
                    MENUITEM "&Lecture", IDM_PLAY
                    MENUITEM "&Pause", IDM_PAUSE
                    MENUITEM "&Stop", IDM_STOP
                    MENUITEM SEPARATOR
                    MENUITEM SEPARATOR
                    MENUITEM "&Ouvrir", IDM_OUVRIR
                    MENUITEM "&Quitter", IDM_QUITTER
               END
    END
    
    /****Boite de Dialogue playlist*****/
    IDD_PLAYLIST DIALOGEX 50, 50, 150, 60
    			 STYLE WS_BORDER | WS_CAPTION | WS_SYSMENU |WS_CHILD
              CAPTION "PlayList"
              FONT 9, "Comic Sans MS"
    
              BEGIN
                   //CONTROL "",-1,"STATIC",SS_ETCHEDFRAME,      2,  2, 181, 86
                   CONTROL "", IDL_PLAYLIST, "LISTBOX", WS_CHILD | WS_VISIBLE | LBS_STANDARD , 5, 5, 140, 50
                   //ICON 18,   -1,                             147, 4, 32, 32
                   //PUSHBUTTON "Effacer", IDB_OK, 15, 40, 120, 12
              END
    A ba non y'a pas le code colmplet car ca ne passe pas (trop de lignes) dans j'ai retirer le ressource.h (mais j'ai bien mis dans celui ci tout les define necessaire) et le linkedlist.cpp car celui ci ne me pose a priori aucun problème.

    Encore Merci.
    A+

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    1. Ton utilisation de MAKELPARAM() est en effet un peu hasardeuse : si tu es en Win32, tu essaies de faire rentrer 48 bits dans 32 (LPARAM est un long en Win32). Si tu veux passer plusieurs paramètres à ta boite de dialogue, fais une structure et passe un pointeur dessus.

    2. Le style WS_CHILD n'a pas de rapport avec la fonction GetParent(), je persiste et signe ! Si ça ne marche pas, c'est certainement pour une autre raison; au hasard, as-tu bien mis le style WS_POPUP ?

    3. Les constantes VK_MEDIA_XXX sont en principe déjà incluses, mais elles sont probablement skippées par le préprocesseur du fait d'une mauvaise directive. Pour accéder à ces événements, il faut cibler au minimum les plate-formes Windows ME/2000 (avec un #define _WIN32_WINNT 0x0500 avant d'inclure "windows.h"). Mais après ça ton programme ne fonctionnera évidemment plus sous les OS antérieurs (Windows 95/98/NT) ... à moins de prévoir une procédure alternative pour ces derniers.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    ReSalut,
    merci beaucoup mon problème est maintenant resolu et compris (enfin en partie ).

    Pour les touche du clavier VK_MEDIA... c'est OK (et je pense que je ne me ferais plus avoir dès que je verrais une limite de compatibilité dans la doc MSDN, je rechercherais le define qu'il faut faire).

    Pour la fonction GetParent c'est OK aussi et la vraiment merci car j'avais chercher pendant pas mal de temps.

    Par contre pour le MAKELPARAM ba j'ai pas compris?
    Peux tu m'expliquer un peu stp. Dans quelle cas ca marche et pourquoi?
    Je crois savoir que si je fais MAKELPARAM(HWND,int) ca marche?
    ce qui reviens a dire MAKELPARAM(long,int)? enfin je crois.
    Enfin si tu peux m'en dire un peux plus stp.

    Encore merci
    A+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    C'est tout simple : MAKELPARAM() concatène 2 shorts en 1 long (sous win32).

    Donc si tu lui passes un pointeur (= 32 bits sous win32) et un handle de fenêtre (= 32 bits sous NT/W2K/XP, = 16 bits sous W95/98/ME), tes données vont forcément être tronquées puisque passant de 48/64 bits à seulement 32 ; elles seront donc invalides à l'extraction.

    Donc je le répète, si tu souhaites passer 2 paramètres (ou plus) de plus de 16 bits à ta boite de dialogue, mets les dans une structure et passe le pointeur sur cette structure par LPARAM.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Ok encore merci et A+

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

Discussions similaires

  1. [Win32 API] Ecran noir
    Par Fabllot dans le forum Windows
    Réponses: 4
    Dernier message: 26/03/2007, 18h33
  2. Problème de compilation avec dev-c++ pour WIN32 API
    Par ValyGator dans le forum Dev-C++
    Réponses: 2
    Dernier message: 08/01/2007, 14h53
  3. Réponses: 5
    Dernier message: 14/04/2006, 23h05
  4. Réponses: 2
    Dernier message: 15/03/2006, 10h13
  5. [win32]API d'analyse du fichier Host ?
    Par Laurent Dardenne dans le forum Développement
    Réponses: 2
    Dernier message: 02/11/2005, 21h20

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