As-tu essayé en créant la tooltip sans ballon et en l'ajoutant ensuite avec NIM_MODIFY ?
As-tu essayé en créant la tooltip sans ballon et en l'ajoutant ensuite avec NIM_MODIFY ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Tu veux dire que la modification engendrerait l'affichage du ballon ?
Vive l'embarqué.
C'est pas certain, mais ça ne coute rien d'essayer...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
salut,
j'interviens sur ce point :
faux et archi-faux ,la rumeur à la vie dure([edit] je précise, sans MFC puisque je ne le maîtrise pas du tout, et parce qu'on m'a dit que c'était amené à disparaître...)
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Sûrement une rumeur non-fondée, alors ^^Envoyé par farscape
Sinon, j'ai réfléchi à la structure de mon programme, et je rencontre un petit problème...
En fait, je compte faire une classe Button, PList, TC (Time Control : avec le seeker et l'affichage du temps), intégrés dans la classe Player. Seulement, j'ai pensé faire un module audio, qui contiendrait des méthodes de maniement de la musique (play, pause, load...) ainsi qu'une structure Music contenant les infos sur la musique en cours, stockée dans une stream FSOUND_STREAM dans cette même structure. MAIS j'aimerais utiliser ce module audio dans différents programmes, et j'ai donc pensé à lier le programme avec la bibliothèque contenant la définition de Audio, Music ainsi que la définition.
Voici le problème : comme je ne peux pas stocker ce module en tant que membre de Player (ce n'est pas logique) et que je dois y accéder par la classe PList et TC, j'aimerais faire comme suit :
Et donc : comment accéder à moduleAudio à partir de player ou de ses membres ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 int WINAPI WinMain (/*...*/) { Audio moduleAudio; Player player (hThisInstance); return player.run (); }
J'ai vu que pour une variable globale, il suffisait d'utiliser l'opérateur de résolution de portée suivi du nom de la variable. N'y a-t-il pas pareil ici ?
Merci d'avance.
Vive l'embarqué.
Mon conseil: Passe un pointeur vers moduleAudio dans le constructeur de player (et mémorise ledit pointeur dans une variable d'instance de la classe Player)
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Tu veux dire :Envoyé par Médinoc
Mais cela ne sert à rien ? J'aurais tout aussi bien pu le mettre directement en tant que membre privé. J'ai dû mal comprendre ... que veux tu dire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Audio audioModule; Player player (hThisInstance, &audioModule); //Avec : Player(HINSTANCE, Audio*); //Et : //... private: Audio *audioModule; };
Vive l'embarqué.
Sauf qu'avec ça, tu peux toujours faire évoluer en interface (enfin, il "n'y a pas" d'interfaces en C++, mais il y a des classes abstraites) générique, dont Audio hérite et qui peut être contrôlé par Player...
Et aussi, cela pourrait te permettre de contrôler l'Audio de plusieurs façons..
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Je ne comprends pas... est-ce vraiment ce type de code qu'il faut que j'utilise ? Ce n'est pas ce que je voulais, à vrai dire : les membres de Player n'auront pas accès à cette classe (que tu propose apparemment de rendre abstraite), et en plus je trouve bizarre qu'elle soit membre de Player...
Edit : Quoique... à ce moment là : de toute évidence, un pointeur sur Audio utilise beaucoup moins de mémoire qu'une instance Audio. Ce n'est qu'une adresse permettant de le manier. Combien de place utilise un ponteur en mémoire ?
Aucun moyen, donc, d'y avoir accès de l' "exérieur" ?
Vive l'embarqué.
Ben, avoir accès sans pointeur à un objet qui n'est pas dans la classe Player, c'est ce que trouve le plus sale.
Donc, tu as un objet extérieur, mais pour y accéder proprement, il faut que Player ait un pointeur vers cet objet (mais Audio reste un objet extérieur)...
PS: La contrainte comme quoi Audio doit être un objet extérieur, c'est celle que tu as définie toi-même:
Post-Edit: Un pointeur, ça prend pour ainsi dire rien (4 octets sur une architecture 32bits (la même taille qu'un int), 8 sur une architecture 64bits) comme place.je ne peux pas stocker ce module en tant que membre de Player (ce n'est pas logique)
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
D'accord. Merci
En fait, il ne me reste plus qu'un petit problème au niveau des boutons, et je pourrais m'attaquer au code, et dès que j'arriverais au problèmes de masques etc, je ferais un test avec un bouton bidon sur une fenêtre vide, pour m'entraîner.
Je pense donc, utiliser des pointeurs de fonction pour attribuer une action à un bouton cliqué : il aura donc une méthode connect() qui consistera à lui attribuer une fonction. Qu'en penses-tu ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Comment faire pour n'importe quelle fonction (type+paramètres) ? void Button::connect(void (*p_action)()) { _action = p_action; return; }
Vive l'embarqué.
Pour le traitement d'une action sur un bouton, tu peux faire ce que tu veux:
- Utiliser un pointeur de fonction (avec un typedef!),
- Utiliser une classe avec fonction virtuelle (un peu façon java),
- Envoyer un message WM_COMMAND à la fenêtre (ce que font les boutons normaux),
- etc.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
J'aimerais sincèrement utiliser des pointeurs de fonction, seulement je ne sais que faire pour la déclaration de connect : la fonction associée au bouton n'est pas obligatoirement de paramètres connus, et je ne sais pas comment faire pour "dire" "quels que soient ses paramètres (et son type), mémorise son adresse"...
Vive l'embarqué.
Si tu réfléchis un peu à la conception, tu verras que la fonction DOIT avoir des paramètres connus (ou au moins un, comme printf()), sinon tu ne pourras pas l'appeler...
Au pire, tu peux toujours lui passer un void* ou un INT_PTR...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Vu que je n'ai que deux types de paramètres, à savoir void (pour play/pause) et std::string (load), peut être que je puisse surcharger cette méthode ? Sans doute.
Merci de ton aide. Je vais m'occuper du code de la dll audio, et ensuite je m'affererais à la classe Button pour l'utiliser dans un test, en premier lieu.
Bref, je te tiens au courant
Merci encore Tu dois être la personne la plus patiente de france
Vive l'embarqué.
Tu sais, j'en connais beaucoup qui serais pris de fou-rire en lisant ça...Tu dois être la personne la plus patiente de france
À commencer par ma famille...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
on n'est jamais patient pour sa famille, c'est un dogme en tout cas merci encore, j'ai commencé le code de la bibliothèque statique.
Vive l'embarqué.
Alors finalement, que fais-tu ?
Une DLL, une bibliothèque statique, ou bien les deux ?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Pour le module audio, il vaut mieux que je fasse une bibliothèque statique pour pouvoir instancier l'objet normalement. Par contre, pour la bibliothèque d'affichage, j'utiliserais une dll, ainsi que pour les hooks qui seront peut être de la partie.
Vive l'embarqué.
Hem par contre... pour la bibliothèque statique, je viens de la compiler : j'obtiens donc le .a necessaire au compilo, mais il me faut forcément un .h à inclure... comment puis-je l'obtenir ? Puisqu'il peut y avoir dans les sources plusieurs headers (par exemple pour plusieurs classes), je ne peux pas utiliser celui des sources.
D'ailleurs, pour aider :
MusicManager.cpp :
MusicManager.h :
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 #include "MusicManager.h" void Music::refresh() { int fieldsCount, tagType, len; char *fieldName; void *fieldValue; string buffer[2] = ""; _length = FSOUND_Stream_GetLengthMs(_stream); if(!FSOUND_Stream_GetNumTagFields(_stream, &fieldsCount)) return; else if (fieldsCount == 0) return; for(int i = 0 ; i < fieldsCount ; i++) { FSOUND_Stream_GetTagField(_stream, i, &tagType, &fieldName, &fieldValue, &len); if(!strcmp(fieldName,"TITLE")) buffer[1] = (char*)fieldValue; else if(!strcmp(fieldName,"ARTIST")) buffer[0] = (char*)fieldValue; else continue; } _name = buffer[0] + " - " + buffer[1]; return; } MusicManager::MusicManager() { FSOUND_Init(44100, 32, 0); _music._stream = NULL; return; } MusicManager::~MusicManager() { FSOUND_Stream_Close(_music._stream); FSOUND_Close(); return; } void MusicManager::load(const string path) { _music._stream = FSOUND_Stream_Open(path.c_str(), 0, 0, 0); _music.refresh(); return; } bool MusicManager::isLoaded() { if(_music._stream == NULL) return false; else return true; } void MusicManager::play() { FSOUND_Stream_Play(MUSIC_CHANNEL, _music._stream); return; } void MusicManager::stop() { FSOUND_Stream_Stop(_music._stream); return; } bool MusicManager::isPlaying() { return FSOUND_IsPlaying(MUSIC_CHANNEL)?true:false; } void MusicManager::pause(bool flag) { FSOUND_SetPaused(MUSIC_CHANNEL, (flag)?TRUE:FALSE); return; } bool MusicManager::isPaused() { return FSOUND_GetPaused(MUSIC_CHANNEL)?true:false; } void MusicManager::setVolume(int volume) { FSOUND_SetVolume(MUSIC_CHANNEL, volume); return; } int MusicManager::getVolume() { return FSOUND_GetVolume(MUSIC_CHANNEL); } void MusicManager::setTime(int msTime) { FSOUND_Stream_SetTime(_music._stream, msTime); return; } int MusicManager::getTime() { return FSOUND_Stream_GetTime(_music._stream); } void MusicManager::reset() { _music._stream = NULL; _music._length = 0; _music._name = ""; return; } int MusicManager::getLength() { return _music._length; } string MusicManager::getName() { return _music._name; }
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 #ifndef H_MUSICMANAGER #define H_MUSICMANAGER #include <fmod/fmod.h> #include <string> #define MUSIC_CHANNEL 0 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif using namespace std; /** Container **/ struct Music { void refresh(); FSOUND_STREAM *_stream; string _name; int _length; }; /** Manager **/ class MusicManager { public: MusicManager(); ~MusicManager(); /* Basic actions */ void load(const string); bool isLoaded(); void play(); void stop(); bool isPlaying(); void pause(bool); bool isPaused(); void setVolume(int); int getVolume(); void setTime(int); int getTime(); void reset(); /* Informations on music */ int getLength(); string getName(); private: Music _music; }; #endif
Vive l'embarqué.
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