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 :

[winAPI] Comment utiliser les régions? (image en background de controles-sliders etc-


Sujet :

Windows

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut [winAPI] Comment rendre transparente la zone entourant les sliders ?
    Bonjour,

    Cela fait déjà 3 fois que je poste avec le même sujet et je commence à désespérer ... J'ai une fenêtre avec des sliders dedans. Or à j'obtiens des rectangles blancs autour de ceux ci... Comment le rendre transparent ?
    (même quand il change de position)

    Merci d'avance.

    P.S J'ai déjà été voir sur Code-project sans succès ...
    Vive l'embarqué.

  2. #2
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Mais quand je veux mettre une image en background, j'obtiens des rectangles blancs autour des textes (LTEXT), boutons et surtout les sliders
    Est-ce que cela peut t'aider ?
    http://bob.developpez.com/tutapiwin/article_31.php
    .: La cosse : il n'y a que ça de vrai :.

  3. #3
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Comment ne l'ais je pas vu plus dans ce tutorial ?
    Merci beaucoup, cela va beaucoup m'aider ... mais conçernant les sliders et boutons ??? Comment cela se passe t il pour empêcher qu'ils comprennent une zone opaque autour d'eux ?

    (Tiens et pendant que j'y suis ... comment fait t on pour obtenir la valeur hexadécimale d'une couleur ?)

    Merci d'avance.
    Vive l'embarqué.

  4. #4
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Up

    Pour vous faire une idée voici un screenshot...
    Vive l'embarqué.

  5. #5
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    euh ... apparemment tu utilises un thème pour Windows.

    Les boutons ont une forme rectangulaire, dans tous les cas.
    Or, tes boutons ont une apparence MAC OS arrondie.
    Le seul moyen que je vois serait de définir des régions pour tes boutons.
    Par contre, quand tu changera de thème ca posera surement des problèmes au point de vue esthétique ...

    Ou sinon, tu définis tes propres controles ...
    .: La cosse : il n'y a que ça de vrai :.

  6. #6
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Les boutons ne sont pas un problème ... Je peux faire un bitmap et tester les coordonnées de la souris.
    Ce qui pose problème, ce sont les sliders ! Comment faire ? Et puis d'accord définir des régions mais comment ?
    Vive l'embarqué.

  7. #7
    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
    Je pense que tu peux essayer de faire comme pour les static en fait: Voir si le slider envoie un message de type WM_CTLCOLOR* (sans doute WM_CTLCOLORSTATIC), intercepter le message en question, et quand tu le reçois, dessiner toi-même l'arrière-plan du contrôle (un simple BitBlt() de ton bitmap) et retourner la NULL_BRUSH...

    Si le slider n'envoie pas de WM_CTLCOLOR*, là, je ne sais pas trop comment faire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

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

  8. #8
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Aurais tu un exemple de code le montrant ?
    Vive l'embarqué.

  9. #9
    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
    Je viens de tester avec Spy++, les sliders (trackbar control) envoient à la fenêtre parent le message WM_CTLCOLORSTATIC.

    Par contre, je n'ai pas de code sous la main.
    Alors, pour être sûr que ça marche et éviter de s'attaquer à un truc trop gros d'un coup, on va procéder en plusieurs étapes:

    1°) Traite le message en retournant simplement une brush (exemple : GetSysColorBrush(COLOR_WINDOW) devrait forcer un arrière-plan blanc (avec le thème par défaut) au lieu de gris/beige.

    2°) Retourne GetSysColorBrush(NULL_BRUSH) à la place: Normalement, le contrôle ne s'efface plus.

    3°) Fait quelque chose (un FillRect() de la couleur que tu veux, ou un truc plus compliqué mais néanmoins simple) avant de retourner la NULL_BRUSH. Normalement, l'effet est visible.

    4°) Remplace le "quelque chose" par un BitBlt() de ton image d'arrière-plan de fenêtre.
    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.

  10. #10
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Qu'entends tu par "il ne s'efface plus" ?
    Déjà, en utilisant le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case WM_CTLCOLORSTATIC:
                GetSysColorBrush(COLOR_WINDOW);
                break;
    Comme tu l'avais prévu, la couleur est alors blanche. En utilisant NULL_BRUSH en paramètre, on obtient la même chose. Mais quand la musique est jouée, donc que le slider avance à chaque WM_TIMER, le slider laisse derriere lui une trace bleue provenant du curseur. Donc de là le premier problème.
    Puis, le BitBlt... que fais je conçernant celui ci ? il me faudrait vraiment un exemple ... Une âme charitable pourrait donc me fournir ce "quelque chose" ?

    Screens au démarrage/playing. ->
    Vive l'embarqué.

  11. #11
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    .: La cosse : il n'y a que ça de vrai :.

  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
    Le second screenshot, c'est bien pour le cas N°2 ?
    Si oui, c'est ce que je voulais dire par "il ne s'efface plus" : Je m'attendais à ce qu'il laisse une trace, mais je ne savais pas comment ce serait...

    Pour le 3e cas, normalement, tu auras la même chose qu'au 1, mais avec (par exemple) un rectangle de la couleur que tu auras choisie (au lieu du blanc).

    Pour le 4e cas, ton image, c'est un bitmap dans un DC, non?
    Dans ce cas, ce que tu dois faire, c'est:
    1°) Retrouver les coordonnées du slider par rapport au bitmap (ou par rapport à la zone client de ta fenêtre, car on peut supposer que le bitmap est aligné par le coin supérieur gauche de ladite zone client)
    2°) Faire un BitBlt() de la portion du bitmap qui va bien.

    J'ai retrouvé un morceau de code qui fait ça:
    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
    case WM_CTLCOLORSTATIC:
    	{
    	HDC hdc = reinterpret_cast< HDC >(wParam);
    	HWND hStatic = reinterpret_cast< HWND >(lParam);
    
    	SetBkMode(hdc, TRANSPARENT); //Pour le texte
    	RECT r, rClient;
    
    	//Retrouver les coordonnées du contrôle dans la fenêtre
    	GetClientRect(hStatic, &rClient);
    	GetWindowRect(hStatic, &r);
    	MapWindowPoints(HWND_DESKTOP, hWnd, reinterpret_cast< LPPOINT >(&r), 2);
    
    	//Copier la portion du bitmap dans le contrôle:
    	BitBlt(hdc, 0, 0, rClient.right, rClient.bottom, hDCMemoire, r.left, r.top, SRCCOPY);
    	HBRUSH hBrush = GetStockBrush(NULL_BRUSH);
    	lrRetour = reinterpret_cast< LRESULT >(hBrush);
    	}
    	break;
    Variables non-déclarées ici:
    • hWnd, wParam, lParam et lrRetour : Les paramètres et la valeur de retour de ma WindowProc
    • hDCMemoire : Handle du DC dans lequel se trouve mon bitmap d'arrière-plan (mémorisé entre les appels : on peut le faire avec une variable globale/static ou avec les Window Bytes, les Window Properties, etc.)

    Note: GetStockBrush() est une macro définie dans windowx.h : Elle fait simplement ((HBRUSH)(GetStockObject(x)))

    PS: Ce code-là fait la même action pour tous les contrôles de la fenêtre qui envoient WM_CTLCOLORSTATIC. Si tu veux le faire pour un contrôle particulier (mais vu les screenshots, c'est pour tous), il te suffit de comparer le hStatic...
    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 régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Merci beaucoup pour ce code.

    Je viens de l'appliquer, avec un affichage d'image à partir de contexte de périphérique (car mon image était un static en ressource [C'est e fait une boite de dialogue]) et je me heurte à plusieurs problèmes :

    -> Je ne peux pas charger une image en ressource avec loadImage... obligé de le faire à partir d'un fihier contenu dans le dossier.
    -> J'ai pas mal de "undeclared...", "syntax error.." en compilant le code suivant :

    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
    case WM_CTLCOLORSTATIC:
            {
            HDC hdc = reinterpret_cast< HDC >(wParam);
            HWND hStatic = reinterpret_cast< HWND >(lParam);
    
            SetBkMode(hdc, TRANSPARENT); //Pour le texte
            RECT r, rClient;
    
            //Retrouver les coordonnées du contrôle dans la fenêtre
            GetClientRect(hStatic, &rClient);
            GetWindowRect(hStatic, &r);
            MapWindowPoints(HWND_DESKTOP, hWnd, reinterpret_cast< LPPOINT >(&r), 2);
    
            //Copier la portion du bitmap dans le contrôle:
            BitBlt(hdc, 0, 0, rClient.right, rClient.bottom, hDCMemoire, r.left, r.top, SRCCOPY);
            HBRUSH hBrush = GetStockBrush(NULL_BRUSH);
            lrRetour = reinterpret_cast< LRESULT >(hBrush);
            }
            break;
    
          case WM_PAINT :
                {
                  HBITMAP hBmp;
                  HDC hdc;
                  PAINTSTRUCT ps;
    
                  hBmp=LoadImage(NULL,"equalizer.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
                  hdc = BeginPaint(hDlg, &ps);
    
                  DrawState(hdc,NULL,NULL,(long)hBmp,NULL,10,10,0,0,DST_BITMAP);
    
                  EndPaint(hDlg, &ps);
    
                  DeleteObject(hBmp);
    
                  return 0;
                }
     case WM_PAINT :
                {
                  HBITMAP hBmp;
                  HDC hdc;
                  PAINTSTRUCT ps;
    
                  hBmp=LoadImage(NULL,"equalizer.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
                  hdc = BeginPaint(hDlg, &ps);
    
                  DrawState(hdc,NULL,NULL,(long)hBmp,NULL,10,10,0,0,DST_BITMAP);
    
                  EndPaint(hDlg, &ps);
    
                  DeleteObject(hBmp);
    
                  return 0;
                }
    Ces erreurs sont surtout axées autour de reinterpret_cast. A noter que je travaille en C, et non en C++. Viendrait elles de cela ? (oui je sais il faudrait peut être que je m'y mette... mais je ne trouve pas de bons tutoriaux)

    D'ailleurs, je n'ai pas de valeur de retour de ma widow process puisque c'est une boite de dialogue : le winmain et la boite de dialogue observent le code suivant (juste histoire de montrer l'architecture globale) :

    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
    #include <windows.h>
    #include <commctrl.h>
    #include <time.h>
    #include "header1.h"
    
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
                                                    LPSTR lpCmdLine, int nCmdShow)
    // winMAIN
    {
        FSOUND_Init(44100, 32, 0);
        FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
        FSOUND_SetDriver(0);
        srand(time(NULL));
    
        DialogBox(hinstance, "Dialog5", NULL, (DLGPROC)Dialog5Proc);
    }
    /******************************************************************************/
    
    BOOL APIENTRY Dialog5Proc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        static HANDLES handles;
        static MUSICDATA data = {0, 0, "", "", 255, 0, 0, 0, "", "", ""};
        static FSOUND_STREAM *music = NULL;
    
        static int curs = 0, i;
    
        switch (uMsg)
        {
          case WM_INITDIALOG:
    
                initDialog(hDlg, &handles, &data);
                break;
    
          case WM_HSCROLL:
    
                ifScrolling(hDlg, &handles, &data, music);
                break;
    
          case WM_TIMER:
                everyTimer(hDlg, &handles, &data, music);
                break;
    
         case WM_CTLCOLORSTATIC:
            {
            HDC hdc = reinterpret_cast< HDC >(wParam);
            HWND hStatic = reinterpret_cast< HWND >(lParam);
    
            SetBkMode(hdc, TRANSPARENT); //Pour le texte
            RECT r, rClient;
    
            //Retrouver les coordonnées du contrôle dans la fenêtre
            GetClientRect(hStatic, &rClient);
            GetWindowRect(hStatic, &r);
            MapWindowPoints(HWND_DESKTOP, hWnd, reinterpret_cast< LPPOINT >(&r), 2);
    
            //Copier la portion du bitmap dans le contrôle:
            BitBlt(hdc, 0, 0, rClient.right, rClient.bottom, hDCMemoire, r.left, r.top, SRCCOPY);
            HBRUSH hBrush = GetStockBrush(NULL_BRUSH);
            lrRetour = reinterpret_cast< LRESULT >(hBrush);
            }
            break;
    
          case WM_PAINT :
                {
                  HBITMAP hBmp;
                  HDC hdc;
                  PAINTSTRUCT ps;
    
                  hBmp=LoadImage(NULL,"equalizer.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
                  hdc = BeginPaint(hDlg, &ps);
    
                  DrawState(hdc,NULL,NULL,(long)hBmp,NULL,10,10,0,0,DST_BITMAP);
    
                  EndPaint(hDlg, &ps);
    
                  DeleteObject(hBmp);
    
                  return 0;
                }
          case WM_COMMAND:
          switch(LOWORD(wParam))
          {
              case IDCANCEL:
                quit(hDlg);
                break;
    
              case ID_BROWSE:
              {
                OPENFILENAME ofn;
                CHAR szFile[5000]={0};
    
                ZeroMemory(&ofn, sizeof(OPENFILENAME));
                ofn.lStructSize = sizeof(OPENFILENAME);
                ofn.hwndOwner = hDlg;
                ofn.lpstrFile = szFile;
                ofn.nMaxFile = 2998;
                ofn.lpstrFilter = "Mpeg layer 3\0*.mp3\0";
                ofn.nFilterIndex = 1;
                ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_EXPLORER;
    
                if (GetOpenFileName(&ofn)==TRUE)
                {
                        loadSongs(&data, szFile, handles.hList);
                        EnableWindow(GetDlgItem(hDlg, ID_TBTIME), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_PLAY), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_NEXT), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_PREVIOUS), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_STOP), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_SAVE_P), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_CLEAR), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_MODE), TRUE);
    
                }
                break;
              }
    
              case ID_STOP:
                FSOUND_StopSound(0);
                SetDlgItemInt(hDlg, ID_TELAPSEDTIME, 0, FALSE);
                EnableWindow(GetDlgItem(hDlg, ID_TBTIME), FALSE);
                EnableWindow(GetDlgItem(hDlg, ID_TELAPSEDTIME), FALSE);
                break;
    
              case ID_CLEAR:
                clearPlaylist(&data, handles.hList);
                SetDlgItemInt(hDlg, ID_TELAPSEDTIME, 0, FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_TELAPSEDTIME), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_TBTIME), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_PLAY), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_NEXT), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_PREVIOUS), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_STOP), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_SAVE_P), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_CLEAR), FALSE);
                        EnableWindow(GetDlgItem(hDlg, ID_MODE), FALSE);
                break;
              case ID_SAVE_P:
                {
                    if(data.numberItems != 0)
                    {
                        OPENFILENAME ofn2;
                        CHAR szFile2[1000]= "";
    
                        ZeroMemory(&ofn2, sizeof(OPENFILENAME));
                        ofn2.lStructSize = sizeof(OPENFILENAME);
                        ofn2.hwndOwner = hDlg;
                        ofn2.lpstrFile = szFile2;
                        ofn2.nMaxFile = 1000;
                        ofn2.lpstrFilter = "Mp3 Playlist\0*.m3P\0";
                        ofn2.nFilterIndex = 1;
                        ofn2.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
    
                        if(GetSaveFileName(&ofn2)==TRUE)
                        {
                            strcat(szFile2, ".m3P");
    
                            if(savePlaylist(&data, szFile2)==EXIT_SUCCESS)
                                MessageBox(0, "Playlist successfully saved.", "Saved.", MB_OK);
                        }
                    }
                    else
                    MessageBox(0, "No songs loaded.", "Nothing to save", MB_OK | MB_ICONWARNING);
    
                break;
                }
              case ID_OPEN_P:
              {
                  OPENFILENAME ofn;
                  CHAR szFile[1000]= "";
    
                  ZeroMemory(&ofn, sizeof(OPENFILENAME));
                  ofn.lStructSize = sizeof(OPENFILENAME);
                  ofn.hwndOwner = hDlg;
                  ofn.lpstrFile = szFile;
                  ofn.nMaxFile = 1000;
                  ofn.lpstrFilter = "Mp3 Playlist\0*.m3P\0";
                  ofn.nFilterIndex = 1;
                  ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
                  if(GetOpenFileName(&ofn)==TRUE)
                  {
                       if(openPlaylist(&data, szFile, handles.hList, hDlg)==EXIT_SUCCESS)
                       {
                            MessageBox(0, "Playlist successfully opened.", "Opened", MB_OK);
                        EnableWindow(GetDlgItem(hDlg, ID_TBTIME), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_PLAY), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_NEXT), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_PREVIOUS), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_STOP), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_SAVE_P), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_CLEAR), TRUE);
                        EnableWindow(GetDlgItem(hDlg, ID_MODE), TRUE);
                        }
                  }
              }
              break;
    
              case ID_PLAY:
              {
                  EnableWindow(GetDlgItem(hDlg, ID_TELAPSEDTIME), TRUE);
                  EnableWindow(GetDlgItem(hDlg, ID_TBTIME), TRUE);
                curs = SendDlgItemMessage(hDlg, ID_LBPATH, LB_GETCURSEL, 0, 0);
                music = FSOUND_Stream_Open(data.path[curs+1], 0, 0, 0);
                data.elapsedT = 0;
                FSOUND_Stream_Play(0, music);
                FSOUND_SetVolume(0, data.vol);
                data.playing = curs+1;
                data.totalT = (FSOUND_Stream_GetLengthMs(music))/1000;
                SendMessage(handles.hTimeTB, TBM_SETRANGE,FALSE, MAKELONG(0, data.totalT));
                break;
              }
    
               case ID_NEXT:
                {
                    data.mode = SendDlgItemMessage(hDlg, ID_MODE, CB_GETCURSEL, 0, 0);
    
                    if(data.mode == 1)
                    {
                        data.playing += 1;
                        data.playing = (rand() % (data.numberItems - 0 + 1)) + 0;
                    }
                        EnableWindow(GetDlgItem(hDlg, ID_PREVIOUS), TRUE);
    
                         if(data.playing != data.numberItems)
                         {
                            EnableWindow(GetDlgItem(hDlg, ID_NEXT), TRUE);
                            FSOUND_StopSound(0);
                            music = FSOUND_Stream_Open(data.path[data.playing+1], 0, 0, 0);
                            data.elapsedT = 0;
                            FSOUND_Stream_Play(0, music);
                            FSOUND_SetVolume(0, data.vol);
                            data.playing++;
                            data.totalT = (FSOUND_Stream_GetLengthMs(music))/1000;
                            SendMessage(handles.hList, LB_SETCURSEL, data.playing-1, 0);
                            SendMessage(handles.hTimeTB, TBM_SETRANGE,FALSE, MAKELONG(0, data.totalT));
                         }
                         else
                            EnableWindow(GetDlgItem(hDlg, ID_NEXT), FALSE);
                     break;
                }
    
                case ID_PREVIOUS:
                {
                    data.mode = SendDlgItemMessage(hDlg, ID_MODE, CB_GETCURSEL, 0, 0);
    
                    if(data.mode == 1)
                    {
                        data.playing -= 1;
                        data.playing = (rand() % (data.numberItems - 0 + 1)) + 0;
                    }
                        EnableWindow(GetDlgItem(hDlg, ID_NEXT), TRUE);
    
                         if(data.playing != 1)
                         {
                             EnableWindow(GetDlgItem(hDlg, ID_PREVIOUS), TRUE);
                            FSOUND_StopSound(0);
                            music = FSOUND_Stream_Open(data.path[data.playing-1], 0, 0, 0);
                            data.elapsedT = 0;
                            FSOUND_Stream_Play(0, music);
                            FSOUND_SetVolume(0,data.vol);
                            data.playing--;
                            data.totalT = (FSOUND_Stream_GetLengthMs(music))/1000;
                            SendMessage(handles.hList, LB_SETCURSEL, data.playing-1, 0);
                            SendMessage(handles.hTimeTB, TBM_SETRANGE,FALSE, MAKELONG(0, data.totalT));
                         }
                         else
                            EnableWindow(GetDlgItem(hDlg, ID_PREVIOUS), FALSE);
                    break;
                }
          }
          break;
    
          default:
             return FALSE;
        }
    }
    Vive l'embarqué.

  14. #14
    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
    oui, les opérateurs de cast sont des opérateurs C++
    Traduction rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xxxxxx_cast<type>(valeur)
    doit être remplacé par Note pour le retour:
    Citation Envoyé par MSDN
    If a dialog box procedure handles this message, it should cast the desired return value to a BOOL (note: la DialogProc() retourne un INT_PTR maintenant, plus un BOOL) and return the value directly. If the dialog box procedure returns FALSE, then default message handling is performed. The DWL_MSGRESULT value set by the SetWindowLong function is ignored.
    (Au passage, le modifieur recommandé pour la dialogproc est CALLBACK au lieu d'APIENTRY, mais c'est la même chose)

    PS: Evite de faire le LoadImage() à chaque fois: charge le bitmap une fois pour toutes.
    DrawState() n'a pas assez d'infos pour copier une PORTION de bitmap comme le fait BitBlt(). Tu vas donc devoir travailler avec BitBlt(), pour cela il te faut un Memory DC (qu'on obtient avec CreateCompatibleDC()).

    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
    //Au début (dans le WM_CREATE par exemple)
    HDC hdc = (obtenir un DC d'une manière ou d'une autre)
    HDC hMemoryDC = CreateCompatibleDC(hdc);
    HBITMAP hBitmap = LoadImage(....);
    HBITMAP hOldBitmap = SelectObject(hMemoryDC, hBitmap);
    
    //(mémoriser hMemoryDC et hOldBitmap)
    
    
    //...
    
    //A la fin (dans le WM_DESTROY par exemple)
    HBITMAP hDeleteBitmap = SelectObject(hMemoryDC, hOldBitmap);
    DeleteDC(hMemoryDC);
    DeleteObject(hDeleteBitmap);
    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.

  15. #15
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Merci encore pour ce code. Je viens de compiler le code adapté et j'obtiens ceci :
    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
    case WM_INITDIALOG:
            {
                HDC hdc = GetDC(hDlg);
                //hMemoryDC étant une variable statique de ma dialogProc
                hMemoryDC = CreateCompatibleDC(hdc);
                HBITMAP hBitmap = LoadImage(hinst, "img1", IMAGE_BITMAP, 0, 0,     LR_DEFAULTSIZE);
                HBITMAP hOldBitmap = SelectObject(hMemoryDC, hBitmap);
    
                initDialog(hDlg, &handles, &data);
                break;
            }
    //...
    case WM_CTLCOLORSTATIC:
            {
            HDC hdc = (HDC)(wParam);
            HWND hStatic = (HWND)(lParam);
    
            SetBkMode(hdc, TRANSPARENT); //Pour le texte
            RECT r, rClient;
    
            GetClientRect(hStatic, &rClient);
            GetWindowRect(hStatic, &r);
            MapWindowPoints(HWND_DESKTOP, hDlg, (LPPOINT)(&r), 2);
    
            BitBlt(hdc, 0, 0, rClient.right, rClient.bottom, hMemoryDC, r.left, r.top, SRCCOPY);
            HBRUSH hBrush = GetStockBrush(NULL_BRUSH);
            lrRetour = (LRESULT)(hBrush);
            }
            break;
    Seulement, lrRetour est bien évidemment non déclaré. Je rencontre alors un problème : Ma windowProc est en fait un callback de boite de dialogue. Que fais-je alors pour ce lrRetour ?

    P.S: Pour un peu plus tard, j'aurais besoin d'une fonction permettant de créer une région à partir d'un bitmap et d'une couleur de "transparence"... (donc à ignorer) Quelqu'un saurait il comment faire ?

    Pour idée :
    Vive l'embarqué.

  16. #16
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    J'avais fait ca il y a quelques temps, si ca peut t'aider ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://pagesperso.laposte.net/holyview/coding/mes_progs/Generateur_regions.rar
    .: La cosse : il n'y a que ça de vrai :.

  17. #17
    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
    Pour les régions : Peut-être à coups de BeginPath() (je ne sais plus si ça fait une région ou non) et de TransparentBlt() (ou des méthodes dont l'aide parle pour le contourner)

    Pour le lrRetour.
    Bon, on est d'accord, ta boîte de dialogue retourne un BOOL ou un INT_PTR (sous Win32, c'est la même chose, c'est sous Win64 que ça commence à coincer).
    En partant du principe du INT_PTR (autant prendre directement les bonnes habitudes), deux (voire trois) écoles s'affrontent pour le switch :
    Code Multi-return : 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
    INT_PTR CALLBACK DialogProc(blablabla)
    {
    	switch(message) {
    	case WM_INITDIALOG:
    		DoSomething();
    		return TRUE;
    	case WM_COMMAND:
    		DoSomething();
    		return TRUE;
    	case WM_PAINT:
    		DrawThis();
    		return TRUE;
    //Ici, il faut rajouter le case et le terminer par un return avec cast
    	case WM_CTLCOLORSTATIC:
    		{
    		//blabla
    		return (INT_PTR)(hBrush);
    		}
    	default:
    		return FALSE;
    	}
    }
    Code avec deux return : 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
    INT_PTR CALLBACK DialogProc(blablabla)
    {
    	switch(message) {
    	case WM_INITDIALOG:
    		DoSomething();
    		break;
    	case WM_COMMAND:
    		DoSomething();
    		break;
    	case WM_PAINT:
    		DrawThis();
    		break;
    //Ici, pas le choix:
    //il faut rajouter le case et le terminer aussi par un return avec cast		
    	case WM_CTLCOLORSTATIC:
    		{
    		//blabla
    		return (INT_PTR)(hBrush);
    		}
    	default:
    		return FALSE;
    	}
    	return TRUE;
    }
    Code Avec un seul return et une variable : 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
    INT_PTR CALLBACK DialogProc(blablabla)
    {
    //Ici, une variable pour le retour.
    //Je l'appelle toujours bRetour,
    //car elle est toujours utilisée presque partour comme un BOOL
    	INT_PTR bRetour = TRUE;
    
    	switch(message) {
    	case WM_INITDIALOG:
    		DoSomething();
    		break;
    	case WM_COMMAND:
    		DoSomething();
    		break;
    	case WM_PAINT:
    		DrawThis();
    		break;
    //Ici, il faut rajouter le case et le terminer par un cast sur bRetour
    	case WM_CTLCOLORSTATIC:
    		{
    		//blabla
    		bRetour = (INT_PTR)(hBrush);
    		}
    	default:
    		bRetour = FALSE;
    	}
    	return bRetour;
    }
    Mon code étant tout le temps basé sur le troisième cas, lrRetour est à remplacer par bRetour pour une boite de dialogue.
    Si tu n'utilises pas de variable pour le code de retour de ta fonction, tu fais directement un return avec un cast, comme indiquer dans MSDN.
    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.

  18. #18
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Comment suis je censé le sauvegarder ? (pas de type) et comment l'utiliser dans mon code ?
    Vive l'embarqué.

  19. #19
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Tu cliques sur About Y'a un exemple de code en Delphi mais c'est pareil ou presque en C++ (demande au pire si tu n'arrives pas a convertir le code en C++ ...)

    Il faut que tu ajoutes le fichier créé aux ressources de ton projet (en gros la région sera définie une fois pour toute et tu n'auras qu'a la charger, pratique pour la facilité d'utilisation et la vitesse d'exécution)
    .: La cosse : il n'y a que ça de vrai :.

  20. #20
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    MIRACLE ça marche ! Merci medinoc, les sliders n'ont plus de zones blanches !

    [EDIT] Ah bin non ... en réaffichant la dialogBox (par exemple quand elle a perdu le focus et qu'elle le reprend), les sliders disparaissent !

    Basnifo -> Si je comprends bien en ressource je devrais mettre REGION /* <- identifiant */ RCData /* type */ machin /* chemin */mais qu'est ce que le langage 1036 ?
    Vive l'embarqué.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/03/2009, 12h23
  2. Réponses: 4
    Dernier message: 13/12/2004, 20h37
  3. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47

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