begin process at 2012 05 29 23:28:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

Libération des HBRUSH créé via CreateSolidBrush [API Win32]


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Libération des HBRUSH créé via CreateSolidBrush [API Win32]

dimanche 1 novembre 2009 à 15:01:21 | Libération des HBRUSH créé via CreateSolidBrush [API Win32]

stagiairecpp

Bonjour,

J'aurais une question, si vous voulez bien m'aider, qui porte sur les objets gdi créés via l'api windows CreateSolidBrush.
Pour info préliminaire (si ça change quelquechose mais je ne pense pas) j'ai choisi de réaliser ce projet en C (/TC).

Donc,
dans le très instructif exemple de racpp (merci :) sur la transparence et les couleurs des contrôles, racpp déclare et instancie ses HBRUSH dans le CALLBACK de sa fenêtre principale de la sorte :
Code C/C++ :
BOOL CALLBACK DialogProc(  HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam  )
{
	static HBRUSH hbDialog = CreateSolidBrush(RGB(200,175,100));
...

C'est très pratique, je connaissais l'utilisation du préfixe 'static' pour les méthodes en cpp mais pas pour les variables.
Après 2 ou 3 tests je pense avoir compris que ça permet de ne l'initialiser que lors du premier appel.
Bon, comme mon projet est en C je ne fais pas comme ça, je déclare les HBRUSH en global et je les initialise lorsque la fonction CALLBACK de ma fenêtre principale reçoit le message WM_INITDIALOG (elle ne reçoit pas le message WM_CREATE comme je passe par DialogBoxParam pour la créer).
Ca fonctionne très bien.

Mais,
voilà, je voudrais créer mes HBRUSH en fonction de certains paramètres dynamiques. Je fais ça via CreateSolidBrush :
Code C/C++ :
HBRUSH hBrush;
//...et plus loin...
hBrush= CreateSolidBrush(RGB(r,g,b));

Seulement lorsque le HBRUSH vient à changer et que j'en recrée un autre, je n'arrive pas à libérer le précédent.
- DeleteObject((HGDIOBJ)hBrush) -> renvoie systématiquement NULL
- DeleteObject(SelectObject(???,hBrush)) -> je ne sais pas quoi mettre à la place des '???' vu qu'il s'agit d'un controle en ressource, et avec sont handle ça ne fontionne pas non plus

Je me retrouve donc avec une dramatique fuite d'objets gdi qui fait rapidement péter la limite des 9999 et qui fait donc bugguer l'application.

L'un d'entre vous saurait'il comment faire svp ?
J'imagine que c'est du déjà vu mais je n'ai pas trouvé.

Merci d'avance.

@+
dimanche 1 novembre 2009 à 15:09:01 | Re : Libération des HBRUSH créé via CreateSolidBrush [API Win32]

stagiairecpp

Re,

J'ai oublié de préciser que j'ai également essayé via :
- DeleteObject(GetStockObject(hBrush)) -> Ne fonctionne pas non plus

@+
dimanche 1 novembre 2009 à 15:41:34 | Re : Libération des HBRUSH créé via CreateSolidBrush [API Win32]

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Tombe bien, le code de racpp est aussi en C...
Il n'y a généralement pas un iota de C++ dans ses codes, c'est idéal pour les débutants (et les autres) car rien n'est caché derrière qlq bibli que ce soit.

static HBRUSH hbEdit = ...
dans une fonction est une fantaisie du langage C, rien de plus. On déclarerait hbEdit en global en haut du module sans le mot 'static' que ça ne changerait absolument rien au binaire final, c'est d'ailleurs ce que le compilo fera quand il génèrera l'ASM final.
La différence, seulement pendant la phase de dev, ces params sont inaccessibles en dehors de la fonction qui les déclare.

Jette un oeil ici:
CHOIX COULEURS (WIN32, NON MFC)
http://www.cppfrance.com/code.aspx?id=10501
Tout ce qui t'intéresse est dans RgbTest.cpp

ciao...
BruNews, MVP VC++
dimanche 1 novembre 2009 à 16:33:47 | Re : Libération des HBRUSH créé via CreateSolidBrush [API Win32]

stagiairecpp

Re,

Pour le 'static', effectivement c'est ce que je fais, je déclare en haut du module et ça a l'avantage de rendre les brushs utilisables depuis n'importe quelle autre fonction du module.
Par contre je pense que la syntaxe est vraiment propre au cpp parce qu'en compilant en C (/TC) ça ne passe pas -> erreur: l'initialisateur n'est pas une constante...'. En changeant les options de compilations pour spécifier du code cpp (/TP) ça le tolère, plus de soucis à la compilation.

J'en profite pour te demander si ça ne cause pas de soucis de déclarer des variables en haut de module à l'extérieur de toutes fonctions, parce qu'un prof nous avait dit que c'était à proscrire sans d'avantages d'explications ?

En tous cas merci beaucoup, je m'en vais de ce pas regarder ta source. :)
Je reprendrai ce sujet si je rencontre une difficulté de compréhension (je dois t'avouer que desfois tes codes sont un peu obscurs pour moi...).

Merci.

@+
dimanche 1 novembre 2009 à 17:05:02 | Re : Libération des HBRUSH créé via CreateSolidBrush [API Win32]

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Il est vrai que racpp compile en mode C++ sinon ça ne passerait pas. Hormis cela tout est pru C.

Les profs récitent les tabous à la mode, il convient de ne pas les contrarier tant que tes notes dépendent d'eux, plus tard tu pourras en rire.

ciao...
BruNews, MVP VC++
dimanche 1 novembre 2009 à 17:30:47 | Re : Libération des HBRUSH créé via CreateSolidBrush [API Win32]

stagiairecpp

Re,

Merci pour la précision sur les déclarations globales. C'est tellement pratique dans certains cas (le handle de la fenêtre principale est un exemple parmi tant d'autres) que ça aurait été dommage de s'en priver.

Pour le reste j'ai bien regardé ton code source et...
Ben tu utilises simplement et efficacement un DeleteObject sur le HBRUSH (ma première idée) !
Donc j'ai décommenté mes lignes et ça fonctionne parfaitement . Je ne comprends pas, je devais avoir un petit pet quelque part ou une crotte dans les yeux tout à l'heure parce que j'avais éliminée cette solution.

Merci, sans toi j'aurais essayé un paquet d'autres choses avant de revenir à cette solution qui s'avère être la bonne.

@+


Cette discussion est classée dans : code, api, callback, hbrush, createsolidbrush


Répondre à ce message

Sujets en rapport avec ce message

Zipper un fichier en API [ par joh ] Bonours, Je suis entrain d'éssayer de développer un appli. qui me permettra apres séléction de fichier (par teeview mais sa marche niquel :)) de l Code sur API VFW32 [ par pirate75000 ] Quelqu'un aurait-il un bout de code sur API VFW32,C'est pour piloter un carte d'acquisition MIRO PCTV (Pinnacles)dans les mode suivants:Affichage du s Image sur bouton (API win32) [ par LordBob ] Bonjour a tous,voila j'essaie de mettre une image sur un bouton de mon dialog, je procede donc comme ceci:HANDLE hImage;...hImage = LoadImage(hInst, " Combiner APi et socket [ par Slown ] Bonjour. Je voulais savoir si c'etait possible de combiner un programme sur les sockets et un programme API. En gros, si je copie mon code a l'interie Traduire code MFC en API [ par victorcoasne ] Bonjour,J'ai besoin d'utiliser ce code : http://www.codeguru.com/Cpp/W-P/win32/tutorials/ar timer multimedia et points d'arret sous visual studio express [ par ludo894 ] Bonjour a vous tous, étant novice dans la programmation windows, j'aurais besoin d'éclaircissement de spécialistes que vous êtes ! Dans une appli, j API MSN. [ par trashaccount ] Bonjour à tous,Je fait appel à vous, afin d'obtenir plus amples informations sur l'utilisation de l'api msn.J'aimerais bien tenter de developper quelq [API][WIN32] Enregistrement de classe de fenêtre [ par Jeffray ] Bonjour,J'ai un problème pour enregistrer une classe de fenêtre.J'utilise GetClassInfoEx() pour extraire les infos de la classe EDIT créée par Windows HELP projet Canon SDK [ par Kcuftesends ] Bonjour, Je dois réaliser un projet utilisant le SDK de Canon pour piloter un appareil photo à partir d'un programme. Depuis quelques temps je suis bl [API windows] Redimmensionner une fenêtre [ par lucelabrute ] Bonjour, j'aimerais qu'aprés selection dans une combo box, la fenêtre s'agrandisse ou se reduise automatiquement, j'ai lu un peu et j'ai trouvé SetWin


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,214 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales