Colorier un static : HEeeeeeeelp !!!

sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003 - 1 déc. 2003 à 23:22
toki127 Messages postés 241 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 31 mai 2021 - 9 juil. 2004 à 11:03
salut @ tous

je me mets a la programmation windows en C/C++ (pas VC++ merci ... quitte à faire du microsoft je préfère VB ;-). Je démarrai pas mal et tout et tout et puis : catastrophe je me heurte à un truc infaisable : attention vous allez rire :

j'arrive pas à colorier un static !!!! :-///

(le truc qui se fait en 2 nano-secondes en vb bravo la productivité ;-)

qqn saura-t-il m'aider ??????????
help !!!!

voici un tout petit bout de code, je voudrais que la couleur de fond du static soit de la même que celle de la fenêtre !!! C pas la mere à boire quand même :-)))

merci 1000x d'avance

sprintjeffc désespéré (à 2 doigts de se remettre au Dr logo ;-)

#include <windows.h> // include pour programmation windows

#define ID_STATIC_1 1 // ID static

HWND ghwnd; // déclaration handle de la fenêtre

// Gestion des évènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);

// La main avec windows.h
int WINAPI WinMain(HINSTANCE FirstInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

MSG msg;
WNDCLASSEX wc;

// --------------------------------------------------------------------------------

// Enregistrement classe Window
wc.hInstance = FirstInstance; // instance
wc.lpszClassName = "Window"; // nom de la classe
wc.lpfnWndProc = WinProc; // adresse de la procédure
wc.style = CS_DBLCLKS; // style
wc.cbSize = sizeof(WNDCLASSEX); // taille
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // grande icone
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // petite icone
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // curseur
wc.lpszMenuName = NULL; // menu
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); // couleur de fond
if (!RegisterClassEx(&wc))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe Window.", "Erreur", MB_OK);
return 0;
}

// --------------------------------------------------------------------------------

// Création de la fenêtre
ghwnd = CreateWindowEx(0, "Window", "Crypteur/décrypteur XOR",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 530, 260,
HWND_DESKTOP, NULL, FirstInstance, NULL);
if (ghwnd == NULL)
{
MessageBox(NULL, "Erreur lors de la création d'une fenêtre.", "Erreur", MB_OK);
return 0;
}

// Création du static (avec classe prédéfinie)
HWND hstaSTA1 = CreateWindow( "STATIC", "Texte statique",
WS_CHILD | WS_VISIBLE | SS_LEFT,
362, 200, 155, 18,
ghwnd,
(HMENU)ID_STATIC_1,
FirstInstance, NULL );
if (hstaSTA1 == NULL)
{
MessageBox(ghwnd, "Erreur lors de la création d'un static.", "Erreur", MB_OK);
return 0;
}

// --------------------------------------------------------------------------------

// Envoit du texte
SetWindowText(hstaSTA1, " jerome.ferquel@free.fr ");
UpdateWindow(hstaSTA1);

// Affichage de la fenêtre
ShowWindow(ghwnd, SW_SHOW);
UpdateWindow(ghwnd);

// --------------------------------------------------------------------------------

// Boucle qui permet au programme de tourner sans arrêt et de guetter les
// évènement pour les envoyer à la procédure qui les gère (ci dessous)
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;

}

// Evènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

char chRretour;

switch (msg)
{

// Fermeture du programme
case WM_DESTROY:

// Ferme le programme
PostQuitMessage(0);
break;

// Fermeture de la fenêtre via le menu système ou la croix(X) noir
case WM_CLOSE:

// Décharge la fenêtre
DestroyWindow(hwnd);
break;

case WM_CTLCOLORSTATIC :
//MessageBox(ghwnd, "coucou", "Debug", MB_OK);
//Je l'aisse cette entrée car qqn sur le forum m'a dit que ça se passait ici ...
break;

default:

return DefWindowProc(hwnd, msg, wParam, lParam);
break;

}

return 0;

}

13 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 déc. 2003 à 23:45
Faut pas confondre VC++ et MFC.
A part cela ce qui t'interesse est dans ma source "CHOIX DE COULEURS".
BruNews, ciao...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
2 déc. 2003 à 10:57
tu as 2 possibilité pour avoir une couleur uniforme :
1/ Tu met au tt début un static vide qui couvre tte la surface de l'appli (c plus de la bidouille qu'autre chose mais ça marche)
2/ Tu rajoute dans ton switch :
case WM_CTLCOLORSTATIC:
SetBkMode((HDC) wParam, TRANSPARENT);
return (BOOL)(HBRUSH)(COLOR_WINDOW);

voila, jsuis plus très sur mais ca devrait marcher
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
2 déc. 2003 à 22:45
merci brunews mais ton source choix des couleurs est absolument inexploitable, tout juste bon à décourager un débutant. la 1er qualité d'un code c d'etre bien commenté ...

anacr0x : ça marche po ... :-///

pour le coup du static grand comme la fenêtre y a qd même un pbm si l'utilisateur agrandit la fenêtre !

merci qd même

sprinjeff
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 déc. 2003 à 15:53
bizar ke ca marche pas, j'ai vérifié, et moi je mettais :

// ca au tt début
HBRUSH hBrush=(HBRUSH)(COLOR_WINDOW);

// pi la création de la classe
WNDCLASSEX wc;
wc.hInstance = MainInstance;
// etc etc...
wc.hbrBackground = hBrush; // la jmet la meme couleur que pour les static

// pi ds le switch
case WM_CTLCOLORSTATIC:
SetBkMode((HDC) wParam, TRANSPARENT);
return (BOOL) hBrush;

Et ca devrait marcher...

Enfin, pour le static, soit tu bloque le redimensionement, soit tu prévoit un static assez grand (+ de 1024x768 koi)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
3 déc. 2003 à 21:56
TU ES GRAND CA MARCHE !!! (faut donner toutes les instructions je vais pas les trouver tout seul ;-) En fait j'ai utilisé la fonction getstockobject pour balancer le même gris dans la fenêtre et les static !!!

merci 100Ox

Kdo => voici le code de mon petit crypteur quasi achevé grâce à toi :

// To do :
// - icône dans fenêtre
// - voir remarques brunews

// Rappel normes de nommage des variables
// Dsl je suis VB-iste à la base ;-)
// - 'g' si variable niveau global, 'm' si niveau module, rien si local
// - sur 3 caratères : rappel type variable
// - sur n caracteres : non de la variable
// Ex : mhwndMaFenetre = handle pour window niveau module MaFenetre
// Si nommage utilisé une seule fois le préfixe suffit (ex : mhwnd)
// Tableaux : gtoi = global table of integers

#include <windows.h> // include pour programmation windows
#include <string.h> // pour strcpy, ...
#include <stdlib.h> // pour atoi, ...

#define ID_EDITBOX_1 1 // ID editbox
#define ID_EDITBOX_2 2
#define ID_EDITBOX_3 3
#define ID_BUTTON_1 1 // ID boutons
#define ID_BUTTON_2 2
#define ID_STATIC_1 1 // ID static
#define ID_STATIC_2 2

HWND ghwnd; // déclaration handle fenêtre
HWND ghedbEDB1; // déclaration handle editbox
HWND ghedbEDB2;
HWND ghedbEDB3;

// Astuce pour colorier les static
HBRUSH hbr =(HBRUSH)GetStockObject(LTGRAY_BRUSH);

// Gestion des évènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
// Fonction de cryptage, décryptage
char fCrypte (char chCryptage);

// La main avec windows.h
int WINAPI WinMain(HINSTANCE FirstInstance, HINSTANCE PrevInstance, LPSTR CmdLine, int CmdShow)
{

MSG msg;
WNDCLASSEX wc;

// --------------------------------------------------------------------------------

// Enregistrement classe Window
wc.hInstance = FirstInstance; // instance
wc.lpszClassName = "Window"; // nom de la classe
wc.lpfnWndProc = WinProc; // adresse de la procédure
wc.style = CS_DBLCLKS; // style
wc.cbSize = sizeof(WNDCLASSEX); // taille
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // grande icone
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // petite icone
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // curseur
wc.lpszMenuName = NULL; // menu
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = hbr; // couleur de fond
if (!RegisterClassEx(&wc))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe Window.", "Erreur", MB_OK);
return 0;
}

// --------------------------------------------------------------------------------

// Création de la fenêtre
ghwnd = CreateWindowEx(0, "Window", "Crypteur/décrypteur XOR",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 530, 260,
HWND_DESKTOP, NULL, FirstInstance, NULL);
if (ghwnd == NULL)
{
MessageBox(NULL, "Erreur lors de la création d'une fenêtre.", "Erreur", MB_OK);
return 0;
}

// Création des editbox (avec classe prédéfinie)
ghedbEDB1 = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL,
10, 10, 500, 25,
ghwnd, (HMENU)ID_EDITBOX_1, FirstInstance, NULL);
ghedbEDB2 = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL,
10, 50, 500, 25,
ghwnd, (HMENU)ID_EDITBOX_2, FirstInstance, NULL);
ghedbEDB3 = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "EDIT", "",
WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL,
340, 120, 130, 25,
ghwnd, (HMENU)ID_EDITBOX_3, FirstInstance, NULL); if (ghedbEDB1 NULL && ghedbEDB2 NULL && ghedbEDB3 == NULL)
{
MessageBox(ghwnd, "Erreur lors de la création d'une editbox.", "Erreur", MB_OK);
return 0;
}

// Création des boutons (avec classe prédéfinie)
HWND hbtnBTN1 = CreateWindowEx(0, "BUTTON", "",
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_NOTIFY|BS_TEXT,
40, 120, 100, 50,
ghwnd, (HMENU)ID_BUTTON_1, FirstInstance, NULL);
HWND hbtnBTN2 = CreateWindowEx(0, "BUTTON", "",
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_NOTIFY|BS_TEXT,
160, 120, 100, 50,
ghwnd, (HMENU)ID_BUTTON_2, FirstInstance, NULL); if (hbtnBTN1 NULL && hbtnBTN2 NULL)
{
MessageBox(ghwnd, "Erreur lors de la création d'un bouton.", "Erreur", MB_OK);
return 0;
}

// Création des static (avec classe prédéfinie)
HWND hstaSTA1 = CreateWindow("STATIC", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
290, 120, 50, 18,
ghwnd,
(HMENU)ID_STATIC_1,
FirstInstance, NULL );
HWND hstaSTA2 = CreateWindow("STATIC", "",
WS_CHILD | WS_VISIBLE | SS_LEFT,
358, 200, 150, 18,
ghwnd,
(HMENU)ID_STATIC_1,
FirstInstance, NULL ); if (hstaSTA1 NULL || hstaSTA2 NULL)
{
MessageBox(ghwnd, "Erreur lors de la création d'un static.", "Erreur", MB_OK);
return 0;
}

// --------------------------------------------------------------------------------

// Envoi de texte sur les objets
SetWindowText(ghedbEDB1, "Taper ici le texte à crypter/décrypter de 5000 caractères maximum ...");
UpdateWindow(ghedbEDB1);
SetWindowText(ghedbEDB3, "int.int.int ...");
UpdateWindow(ghedbEDB3);
SetWindowText(hbtnBTN1, "Crypter");
UpdateWindow(hbtnBTN1);
SetWindowText(hbtnBTN2, "Décrypter");
UpdateWindow(hbtnBTN2);
SetWindowText(hstaSTA1, " Clef : ");
UpdateWindow(hstaSTA1);
SetWindowText(hstaSTA2, " jerome.ferquel@free.fr ");
UpdateWindow(hstaSTA2);

// Affichage de la fenêtre
ShowWindow(ghwnd, SW_SHOW);
UpdateWindow(ghwnd);

// Met le focus sur l'editbox 1
SetFocus(ghedbEDB1);

// --------------------------------------------------------------------------------

// Boucle qui permet au programme de tourner sans arrêt et de guetter les
// évènement pour les envoyer à la procédure qui les gère (ci dessous)
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;

}

// Evènements sur la fenêtre
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

char chRretour;

switch (msg)
{

// Fermeture du programme
case WM_DESTROY:

// Ferme le programme
PostQuitMessage(0);
break;

// Fermeture de la fenêtre via le menu système ou la croix(X) noir
case WM_CLOSE:

// Décharge la fenêtre
DestroyWindow(hwnd);
break;

// Réception des évènements sur les objets
case WM_COMMAND:

// editbox if (LOWORD(wParam) ID_EDITBOX_1 || LOWORD(wParam) ID_EDITBOX_2 )
{
switch (HIWORD(wParam))
{

case EN_ERRSPACE:

MessageBox(ghwnd, "Mémoire insuffisante sur la station !!!", "Erreur", MB_OK);
break;

case EN_MAXTEXT:

MessageBox(ghwnd, "Le nombre maximum de caractères dans une editbox a été atteint !!!", "Erreur", MB_OK);
break;

case EN_CHANGE:
//MessageBox(ghwnd, "Le contenu d'une editbox à changé.", "EN_CHANGE", MB_OK);
break;

default:

break;

}

}

// Bouton Crypter
// Vérifie que c'est bien le bouton et vérifie qu'on à cliqué dessus if ((LOWORD(wParam) ID_BUTTON_1) && (HIWORD(wParam) BN_CLICKED))
{
if(fCrypte(1) != 1)
{
MessageBox(ghwnd, "Zut ... le cryptage a planté ???", "Crytpage", MB_OK);
}
break;
}

// Bouton Décrypter
// Vérifie que c'est bien le bouton et vérifie qu'on à cliqué dessus if ((LOWORD(wParam) ID_BUTTON_2) && (HIWORD(wParam) BN_CLICKED))
{
if(fCrypte(2) != 1)
{
MessageBox(ghwnd, "Zut ... le décryptage a planté ???", "Décrytpage", MB_OK);
}
}

break;

case WM_CTLCOLORSTATIC :
// Coloration des static
SetBkMode((HDC) wParam, TRANSPARENT);
return (BOOL) hbr;
break;

default:

return DefWindowProc(hwnd, msg, wParam, lParam);
break;

}

return 0;

}

char fCrypte (char chCryptage)
{

int i, iLongueur, iIndiceMax, iNbEltClef;
int toiClef[50];
char sIn[5000] = " ";
char sOut[5000] = " ";
char sClef[500] = " ";
char sTmpClef[500] = " ";
char *sTmp1;

// Récupère la chaine à crypter
GetWindowText(ghedbEDB1, sIn, 5000);
// Récupère la clé de cryptage
GetWindowText(ghedbEDB3, sTmpClef, 500);

// Contrôles
if (strcmp(sTmpClef,"int.int.int ...") == 0)
{
MessageBox(ghwnd, "Il faut saisir une clef (ex : 2.456.8.7.78) ...", "M'enfin ???", MB_OK|MB_ICONINFORMATION);
return 1;
}
if (strlen(sTmpClef) >= 500)
{
MessageBox(ghwnd, "500 caractères max dans la clef (séparateur compris) ... tronquée au delà !!!", "Warning ...", MB_OK|MB_ICONINFORMATION);
}

// Chargement clé
// On la charge à l'envers car strrchr analyse en commençant par la fin
strcpy(sClef, ".");
strcat(sClef, sTmpClef);
iNbEltClef = 0;
while (*sClef != 0 && iNbEltClef <= 50)
{ sTmp1 strrchr(sClef, 46); // 46 code ascii décimal de '.'
sTmp1 = sTmp1+1;
toiClef[iNbEltClef] = atoi(sTmp1);
sTmp1 = sTmp1-1;
*sTmp1 = 0;
iNbEltClef++;
}
if (iNbEltClef > 50)
{
MessageBox(ghwnd, "50 eléments dans la clef ça me semblait pourtant suffisant !!!", "Overflow ...", MB_OK|MB_ICONINFORMATION);
return 0;
}

// Applique le XOR avec la clé
iLongueur = strlen(sIn);
iIndiceMax = iLongueur - 1;
for(i=0; i<iLongueur; i++)
{
if (chCryptage == 1)
{
sOut[i]= sIn[iIndiceMax-i] ^ toiClef[i%iNbEltClef];
}
else // =2, décryptage
{
sOut[iIndiceMax-i]= sIn[i] ^ toiClef[i%iNbEltClef];
}
}

// Met le résultat dans l'editbox 2
SetWindowText(ghedbEDB2, sOut);
UpdateWindow(ghedbEDB2);

return 1;

}
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 déc. 2003 à 22:08
Effectivement, je suis grand !! 1m92 quand même (^_^)
bon d'accord c nul ce jeux de mot... (g honte)

Petite rectification sur ton code, au lieu de :if ((LOWORD(wParam) ID_BUTTON_2) && (HIWORD(wParam) BN_CLICKED))

met :
if(wParam==ID_BUTTON_2)
ca suffit (c'est d'ailleur BruNews qui m'avais montré ça)

et comme tu en as beaucoup, tu peut meme remettre un switch pour wParam, ca sera encore plus simple
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 déc. 2003 à 22:19
En plus d'etre grand, il imprime bien Anacr0x.
BruNews, ciao...
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
3 déc. 2003 à 22:32
mais oui toi aussi tu es grand brunews ;-))) tu me l'avais donné la manip et j'avais bien l'intention de l'appliquer !!!

pour une fois qu'en C/C++ & API windows on peut remplacer une instruction de 30 caractère par une autre de 10, quel bonheur ;-)

en + ce soir g reussi à coller une icône dans ma fenêtre c vraiment un grand soir !!! merci les gars arf ...

+
Sprintjeff
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
3 déc. 2003 à 22:34
Merci BruNews, c pas tt les jours qu'on a le droit a un petit compliment de ta part, ca me fait plaisir :big)

Mais en même temps, heureusement que jme souvient de ce que j'apprend en prog, ca serait inquiétant sinon, je risquerait de régrésser !
0
toki127 Messages postés 241 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 31 mai 2021
9 juil. 2004 à 10:15
Bonjour!
Alors même en ayant cette source complète sous les yeux, impossible d avoir mon fond de static transparent... je suis désespéré!
si j ai bien compris les pts importants :

HBRUSH hbr =(HBRUSH)GetStockObject(LTGRAY_BRUSH);
...
switch (msg)
{
...
case WM_CTLCOLORSTATIC :
// Coloration des static
SetBkMode((HDC) wParam, TRANSPARENT);
return (BOOL) hbr;
break;
...

C est bien tout ce qu il faut faire non ??
Merci de vos réponses :)

tOKi127 :big)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 juil. 2004 à 10:49
Il ne sera pas transparent si tu mets un brush LTGRAY_BRUSH, faut reflechir a ce qu'on fait.
Regarde ma source de texte sur image par static transparent.

ciao...
BruNews, Admin CS, MVP Visual C++
0
toki127 Messages postés 241 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 31 mai 2021
9 juil. 2004 à 11:00
lol j ai essayé deja plein de trucs différents qui me parraissait logique :)
je l ai sous les yeux ta source de texte sur image... et je vois pas pkoi j y arrive pas :(
tant pis je v rester avec mon static coloré ca donne un style lol
merci qd meme

tOKi127 :big)
0
toki127 Messages postés 241 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 31 mai 2021
9 juil. 2004 à 11:03
sur un ultime essai, ca marche ;)
en fait j ai voulu reflechir alors qu un simple c/c suffisait...
encore merci BruNews
++

tOKi127 :big)
0
Rejoignez-nous