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. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    J'ai toujours pas testé sur des sliders.

    Mais dis-moi, tu n'as pas encore commencé à t'amuser avec les régions, au moins ?

  2. #22
    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
    Non pas encore. J'ai seulement adapté ce code. (un problème à la fois )Comme je le dis, c'est bizarre ... les sliders disparaissent des fois au réaffichage, et à chaque timer (qui doit faire avancer le curseur) le curseur dessine au fur et à mesure le slider ... En gros il y a un problème de raffraichissement des sliders au passage au "premier plan". Si ça peut aider, ces sliders sont créés en ressource.

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Je viens de tester, et je ne comprends pas: Chez moi, ça marche pour les static et pas pour les sliders...

  4. #24
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Bon, il semblerait que les sliders n'apprécient pas qu'on les efface soi-même, puisqu'apparemment, ils de dessinent d'abord et utilisent je ne sais-quoi pour effacer autour d'eux ensuite avec la brush qu'on retourne.

    La solution que j'envisage est une solution qui PEUT marcher, mais je n'en suis même pas sûr : Il faut retourner une brush créée avec CreatePatternBrush() et le bitmap de fond.
    (Je n'ai pas trouvé de solution pour les forcer à se redessiner après effacement).

  5. #25
    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
    Peut être qu'en créant la trackbar avec CreateWindow() en récupérant son handle et en faisant ShowWindow ?

  6. #26
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Je ne pense pas : Le bug semble être dans la conception de la trackbar elle-même (qui se dessine avant de s'effacer).

    En fait, le scénario doit être un peu comme suit:
    1°) Elle se dessine
    2°) Elle envoie WM_CTLCOLORSTATIC
    3°) Elle se clippe
    4°) Elle s'efface (après s'être clippée, donc)

    Et comme elle ne se redessine plus après et que je n'ai pas trouvé le moyen de la faire se dessiner sans s'effacer ensuite...

    En fait, si le 3 et le 2 étaient inversés, ça marcherait. ça marcherait aussi si le 1 et le 2 étaient inversés. Mais là, le 2 est pile au mauvais moment...


    Tu peux peut-être espérer arriver à l'empêcher de s'effacer après dessin en traitant en profondeur le message WM_NOTIFY avec la notification NM_CUSTOMDRAW, mais moi-même j'ai abandonné, trouvant ça trop compliqué...

  7. #27
    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
    Là je suis largué je ne vois pas du tout comment je pourrais faire ... le pire c'est que ça arrive souvent, mais pas tout le temps ! C'est vraiment n'importe quoi ...

  8. #28
    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
    Je ne sais pas exactement comment faire pour ajouter la ressource sous VC++ (faut voir dans l'aide), moi je faisais ca sous Delphi en utilisant ResHacker par exemple pour modifier le fichier de ressource.
    Tu peux regarder ce tuto a la partie IV, ca ne t'aidera pas beaucoup mais c'est pour que tu vois le principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://pagesperso.laposte.net/holyview/coding/tutos/Tutorial_Delphi-ressource.rar

  9. #29
    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
    Conçernant les régions, j'avais trouvé ceci :
    http://www.codeproject.com/gdi/rgncreator.asp

    Mais le problème est qu'il s'agit d'un code C++ et le mien n'est qu'en C. (je suis en train d'apprendre et de pratiquer le C++) Y aurait il moyen de le "traduire" du C++ en C ? (peut etre extern "C" {} ??)

  10. #30
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Non, extern "C" permet d'utiliser des fonctions C++ depuis le C : Ce n'est pas de la traduction, mais de l'interfaçage.

  11. #31
    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
    Oui je connais ce programme kidpaddle2.
    C'est en gros la même chose. Il te génère un fichier à mettre en ressource ... (a part que moi je n'utilise pas une classe, juste 2 ou 3 APIs ...)

  12. #32
    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
    Justement. En lisant le "mode d'emploi" du fichier RGN généré, je ne comprends pas à partir du numéro 7 il me semble ... N'y aurait il pas moyen de traduire ce qu'il a fait du C++ au C ? Parce qe avoir le RGN en ressource c'est bien ... mais je fais quoi ensuite (le code ?)?

  13. #33
    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
    1) Regarde les sources de son programme, ce n'est pas bien long
    2) Je t'ai déja dis que dans mon prog, si tu cliques sur About, tu as un bout de code qui te donne les APIs a utiliser
    3) pas trop dur quand meme ...

  14. #34
    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
    En fait je n'aurais pas de problème à traduire ton code delphi en C... mais je ne connais pas la ligne ressource correspondante. Je réitère donc : Quelle est la ligne de ressource pour inclure ton fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID_NUMBER1 RCData mahin
    ? Alors qu'est ce que le langage 1036 ?

  15. #35
    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
    Je ne comprends pas ton problème
    1) Tu ajoutes la ressource en lui donnant le nom que tu veux, par exemple REGION.
    2) Tu utilises FindResource() pour aller rechercher ta ressource.

    Si tu n'y arrive pas, cherche de la doc sur l'ajout et l'utilisation d'une ressource.

    PS : tu me parle de 1036 mais ca correspond normallement au langage (je n'en sais pas bcp +, je ne me suis jamais posé la question ). MAIS ce n'est p-e pas important donc ne t'en préocupe pas !

  16. #36
    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
    Justement. Est ce que j'ajoute le fichier en ressource en utilisant la syntaxe ci dessous. (je sais parfaitement que je peux mettre le nom que je veux (= identifiant) ! Mais le type de la ressource ... c'est quoi ? RCData c'est ça ?
    Alors je devrais mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <NOM ou ID> RCData /* correspondant au type */ machin /* chemin du fichier */
    ?

  17. #37
    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
    Je ne sais pas, je n'ecris pas les ressources a la main, a chaque fois que j'avais besoin j'utilisais un logiciel externe ou alors l'IDE de visual (je crois) ...
    D'autres personnes le savent p-e ..

  18. #38
    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
    Bon je vais plutôt faire une fenêtre rectangulaire avec des bords ronds... pour le moment. Conçernant le slider, en utilisant un bitmap que j'ai fais avec paint dot net, il me faudrait faire un fillrect noir. (car sur fond noir ...) Est ce que les trainées reviendront ?

    PS : Savez vous comment colorer une listbox ? parce que blanc avec le bitmap ci dessous ... ça le fait pas vraiment.

    [EDIT] J'ai trouvé une fonction qui a l'air de marhcer chez pas mal de gens... mais elle ne marche pas chez moi. Le problème est expliqué dans un topic un peu plus haut.

    La voici :
    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
    HRGN BmpToRgn (HBITMAP hBmp, COLORREF cTransparentColor)
    {
     #define ALLOC_UNIT 100
    
        int y, x;
         HRGN hRgn = NULL;
        if (!hBmp) return 0; // si bitmap invalide retourne
         BITMAP bm;
        GetObject(hBmp, sizeof(bm), &bm); // met les infos d'en tete du bitmap dans bm
        UINT siz=bm.bmWidth*bm.bmHeight*4; // enregistre la taille des donnes de l'image
         char *lpBmpBits=(char*)LocalAlloc(LMEM_FIXED,siz); // fait de la place pour les bits du bitmap
        GetBitmapBits(hBmp,siz,lpBmpBits); // obtient les bits de l'image dans l'espace qu'on a reservé
        bm.bmBits=lpBmpBits; // complete la strucutre bm avec les bits
         while (bm.bmWidthBytes % 4) bm.bmWidthBytes++; // bmWidthBytes doit être divisible par 4
    
         DWORD maxRects = ALLOC_UNIT;
       HANDLE hData = GlobalAlloc(GMEM_MOVEABLE, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects));
       RGNDATA *pData = (RGNDATA *)GlobalLock(hData);
         pData->rdh.dwSize = sizeof(RGNDATAHEADER);
         pData->rdh.iType = RDH_RECTANGLES;
        pData->rdh.nCount = pData->rdh.nRgnSize = 0;
         SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
    
        BYTE *p32 = (BYTE *)bm.bmBits;
        for (y = 0; y < bm.bmHeight; y++) // parcourt toutes les lignes de l'image, de haut en bas
        {
             for (x = 0; x < bm.bmWidth; x++) // parcourt tous les pixels de la ligne, de gauche à droite
            {
                // Recherche une suite continue de pixels non transparents
                 int x0 = x;
                LONG *p = (LONG *)(p32 + 4*x);
                while (x < bm.bmWidth)
                  {
                     if ((unsigned)*p==cTransparentColor)
                       break; // ce pixel est transparent
                    p++;
                    x++;
                }
                if (x > x0)
                {
                   // ajoute les pixels (de (x0, y) à (x, y+1)) à la region en tant que rectangle
                    if (pData->rdh.nCount >= maxRects)
                    {
                       GlobalUnlock(hData);
                        maxRects += ALLOC_UNIT;
                      hData = GlobalReAlloc(hData, sizeof(RGNDATAHEADER) +
                             (sizeof(RECT) * maxRects), GMEM_MOVEABLE);
                       pData = (RGNDATA *)GlobalLock(hData);
                    }
                    RECT *pr = (RECT *)&pData->Buffer;
                    SetRect(&pr[pData->rdh.nCount], x0, y, x, y+1);
                    if (x0 < pData->rdh.rcBound.left)
                       pData->rdh.rcBound.left = x0;
                     if (y < pData->rdh.rcBound.top)
                         pData->rdh.rcBound.top = y;
                  if (x > pData->rdh.rcBound.right)
                      pData->rdh.rcBound.right = x;
                    if (y+1 > pData->rdh.rcBound.bottom)
                        pData->rdh.rcBound.bottom = y+1;
                     pData->rdh.nCount++;
    
                    // Il parait que sous Windows 98, ExtCreateRegion() ne marche pas s'il y a trop de rectangles
                     // Pas de panique: on construit la region en deux fois
                   if (pData->rdh.nCount == 2000)
                    {
                         HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData);
                        if (hRgn)
                        {
                         CombineRgn(hRgn, hRgn, h, RGN_OR);
                           DeleteObject(h);
                        }
                        else
                            hRgn = h;
                        pData->rdh.nCount = 0;
                         SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
                    }
                }
             }
            // On passe à la ligne suivante
            p32 += bm.bmWidthBytes;
        }
      // On cree la region
        // (et, s'il y avait plus de 2000 rectangles, on la combine avec celle créee precedemment)
        HRGN h = ExtCreateRegion(NULL, sizeof(RGNDATAHEADER) + (sizeof(RECT) * maxRects), pData);
         if (hRgn)
        {
            CombineRgn(hRgn, hRgn, h, RGN_OR);
             DeleteObject(h);
         }
         else hRgn = h;
         LocalFree((HLOCAL)lpBmpBits);
         return hRgn;
    }
    (l'indentation n'est pas de moi rassurez vous)

    avec une utilisation comme celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //point d'entrée de la dialogProc
    static HBITMAP hBmp;
    static HRGN region;
    static COLORREF transparencyColor = RGB(155,155,155);
    //...
    case WM_INITDIALOG:
          {
              hBmp = (HBITMAP)LoadImage(hinst, "img1", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
              region = BmpToRgn(hBmp, transparencyColor);
    
              SetWindowRgn(hDlg, region, TRUE);
    //...
          }

  19. #39
    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
    A défaut de pouvoir mettre une image en arriere plan du slider, je me suis débrouillé pour qu'il soit sur fond noir. Maintenant cela marche. Merci de votre aide, et puis si vous trouvez une solution pour qu'il y ait une image derriere (donc pas une couleur unie) faites le moi savoir.
    Pourriez vous par contre m'aider pour les régions ?

  20. #40
    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
    Dernieres nouvelles : J'ai enfin réussi à utiliser une fonction BmpToRgn !!!
    Maintenant cela marche comme vous pouvez le constater sur la photo ci jointe. Mais j'ai plus que besoin de sliders transparents ... Et donc plus que besoin d'aide ! Pourriez vous m'aider ?

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