HELP avec classe static (SDK windows)

sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003 - 26 nov. 2003 à 22:53
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 28 nov. 2003 à 10:15
salut,

si je veux que le static présent dans ma fenêtre soit de la même couleur que cette dernière j'arrive pas a envoyer du texte dedans.

J'ai tout essayé, que ce soit un classe définie par mes soins ou prédéfinie (STATIC), rien à faire !!! Le texte ne se voit que si je laisse la couleur par défaut (beige pourri) et utilise la classe prédéfinie STATIC. Pourtant je fais bien mon setwindowtext + mon updatewindow après ???

HEEEEELP !!!

voici mon p'ti prg (dans cette version j'essaye avec ma propre classe static), merci d'avance !!!

ps : ça tourne sous devcpp ...

// 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

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

// 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 wcwin;
WNDCLASSEX wcsta;

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

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

// Enregistrement classe Static
wcsta.hInstance = FirstInstance;
wcsta.lpszClassName = "Static";
wcsta.lpfnWndProc = WinProc;
wcsta.style = CS_DBLCLKS;
wcsta.cbSize = sizeof(WNDCLASSEX);
wcsta.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcsta.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wcsta.hCursor = LoadCursor(NULL, IDC_ARROW);
wcsta.lpszMenuName = NULL;
wcsta.cbClsExtra = 0;
wcsta.cbWndExtra = 0;
wcsta.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
if (!RegisterClassEx(&wcsta))
{
MessageBox(NULL, "Erreur lors de l'initialisation de la classe Static.", "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,
300, 120, 170, 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;
}

// Instanciation 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;
}

// Instanciation static
HWND hstaSTA1 = CreateWindowEx(0, "static", "",
WS_VISIBLE|WS_CHILD,
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 sur les objets
SetWindowText(ghedbEDB1, "Taper ici le texte à crypter/décrypter de 5000 caractères maximum ...");
UpdateWindow(ghedbEDB1);
SetWindowText(ghedbEDB3, "entier.entier.entier ...");
UpdateWindow(ghedbEDB3);
SetWindowText(hbtnBTN1, "Crypter");
UpdateWindow(hbtnBTN1);
SetWindowText(hbtnBTN2, "Décrypter");
UpdateWindow(hbtnBTN2);
SetWindowText(hstaSTA1, " jerome.ferquel@free.fr ");
UpdateWindow(hstaSTA1);

// 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;

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,"entier.entier.entier ...") == 0)
{
MessageBox(ghwnd, "Il faut saisir une clé (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 clé (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 clé ç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;

}

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 nov. 2003 à 00:09
WNDCLASSEX wcwin;
WNDCLASSEX wcsta;
Inutile d'en declarer 2, 1 seule suffit pour enregistrer autant que tu veux. Suffit de modifier les membres de la structure avant chaque RegisterClass et seulement ceux qui ont besoin d'etre modifies.
Le test event clic button se fait sur wParam sans decomposition Hi et Lo car BN_CLICKED = 0.
Pour la modif des couleurs des controles va voir "choix de couleurs" dans mes sources, tout ce qu'il te faut est dedans. Tu dois gerer WM_CTLCOLORSTATIC dans ton cas.
BruNews, ciao...
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
27 nov. 2003 à 23:29
merci 1000x :-)))
tant que j'y suis je voudrais faire un petit compteur de lignes dans un projet. j'ai besoin de parcourir une arborescence de répertoires, ouvrir un certain type de fichier et y compter les lignes ... tu utiliserais quoi comme biblio toi ??? (C++ de préférence car faut que je m'y mette ;-)
+
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 nov. 2003 à 23:35
Tu veux parler de fichiers textes je pense pour qu'il y ait notion de lignes.
Comme je ne bosse QUE sur Windows je n'utilise rien d'autre que l'API win32:
CreateFile - ouverture
GetFileSize - pour allouer le buffer
ReadFile - 1 seul acces fichier
CloseHandle - fermeture
maintenant compter les lignes necessite 1 pointeur sur le buffer et basta.
BruNews, ciao...
0
sprintjeffC Messages postés 16 Date d'inscription vendredi 31 octobre 2003 Statut Membre Dernière intervention 3 décembre 2003
27 nov. 2003 à 23:57
effectivement comment n'y ai-je pas pensé je les utilise en vb ... merci. si t'as un bout de code pour utiliser s't'api je prends ... mais peut-être que le sdk est clair la dessus ...

sinon g regardé ton source pour mon pbm de couleur ...
je comprends rien de rien désolé :-///
même en regardant un peu dans le SDK windows ...
une telle difficulté pour colorier un pauvre label est vraiment décourageant ... vive VB !!! :-)))
comment ça se fait qu'on puisse pas faire ça en 3 lignes max et simplement ... c halluciant, on est pas en assembleur quand même ???

+
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 nov. 2003 à 10:15
Simplicite de codage et performance ne vont pas ensemble.
BruNews, ciao...
0
Rejoignez-nous