Colorier un static : HEeeeeeeelp !!!

Signaler
Messages postés
16
Date d'inscription
vendredi 31 octobre 2003
Statut
Membre
Dernière intervention
3 décembre 2003
-
Messages postés
235
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
4 février 2020
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Faut pas confondre VC++ et MFC.
A part cela ce qui t'interesse est dans ma source "CHOIX DE COULEURS".
BruNews, ciao...
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
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
Messages postés
16
Date d'inscription
vendredi 31 octobre 2003
Statut
Membre
Dernière intervention
3 décembre 2003

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
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
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)
Messages postés
16
Date d'inscription
vendredi 31 octobre 2003
Statut
Membre
Dernière intervention
3 décembre 2003

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;

}
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
En plus d'etre grand, il imprime bien Anacr0x.
BruNews, ciao...
Messages postés
16
Date d'inscription
vendredi 31 octobre 2003
Statut
Membre
Dernière intervention
3 décembre 2003

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
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
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 !
Messages postés
235
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
4 février 2020

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)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
235
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
4 février 2020

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)
Messages postés
235
Date d'inscription
dimanche 18 janvier 2009
Statut
Membre
Dernière intervention
4 février 2020

sur un ultime essai, ca marche ;)
en fait j ai voulu reflechir alors qu un simple c/c suffisait...
encore merci BruNews
++

tOKi127 :big)