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 ?
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 ?
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.
Je viens de tester, et je ne comprends pas: Chez moi, ça marche pour les static et pas pour les sliders...
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).
Peut être qu'en créant la trackbar avec CreateWindow() en récupérant son handle et en faisant ShowWindow ?
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é...
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 ...
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
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" {} ??)
Non, extern "C" permet d'utiliser des fonctions C++ depuis le C : Ce n'est pas de la traduction, mais de l'interfaçage.
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 ...)
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 ?)?
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 ...
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 ?? Alors qu'est ce que le langage 1036 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ID_NUMBER1 RCData mahin
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 !
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 */
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 ..
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 :
(l'indentation n'est pas de moi rassurez vous)
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; }
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); //... }
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 ?
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 ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager