Aide sur action d'un bouton dans une sous fenêtre

jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006 - 9 mars 2005 à 20:35
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006 - 12 mars 2005 à 14:57
J'ai programmé sur Dev C++ un bouton avec image dans une fenêtre fille de la fenêtre principal. Aussi je ne parviens plus à récupérer le message du bouton dans ma fenêtre principal puisque les message sont envoyer dans la fenêtre fille. Enfin c'est ce que j'ai cru comprendre puisque quand je change la fenêtre parent dans les caractèrestique du bouton en mettant la fenêtre principal le bouton déclanche bien l'action contenu dans "switch(LOWORD(wParam))".

Comment pourais-je donc envoyer le message dans la bonne fenêtre, sachant que si je mette le bouton dans la fenêtre principal (hwnd) il est plus difficile de gérer sa possition avec la fenêtre fille et donc sont apparission

Merci de votre aide.

JBM

_____________________________________
Le code :

/* Fenête principal */
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Red Castle - "Le Mystère des Ummites"", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
800, /* The programs width */
600, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);


/* Fenêtre */

Intro = CreateWindow("EDIT", "",
WS_CHILD | WS_VISIBLE,
0, 0, 800, 600,
hwnd, NULL, g_hInst, NULL);
ShowWindow (Intro, FALSE);

/* Boutton */
HBITMAP Img_Btn;
hBouton = CreateWindow (
"button",/* Builtin button class */
"",
BS_BITMAP | WS_CHILD | BS_PUSHBUTTON,
200, 430, 85, 87,
Intro ,/* Parent is this window. */
(HMENU) ID_BTNMEDIA1,
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
Img_Btn = LoadBitmap (g_hInst,"SOND") ;
SendMessage(hBouton, BM_SETIMAGE ,IMAGE_BITMAP ,(long)
Img_Btn);
ShowWindow (hBouton, FALSE);

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_COMMAND:
switch( wParam )
{
/* Menu */
case DOS_INTRO:
ShowWindow (Intro, TRUE);
ShowWindow (Contact, FALSE);
ShowWindow (hBouton, TRUE);
UpdateWindow(hBouton);
break;

case DOS_CONT:
ShowWindow (Intro, FALSE);
ShowWindow (Contact, TRUE);
break;

case QUITTER:
PostQuitMessage (0);
break;

}
switch(LOWORD(wParam))
{
/* Bouttons */
case ID_BTNMEDIA1:
ShellExecute(NULL, NULL, "magnetophone/ummovoice.wav", NULL, NULL, SW_SHOWNORMAL);
break;
}
break;
}
}_______________________________________

16 réponses

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
9 mars 2005 à 21:21
Crée une classe pour ta fenêtre fille avec une procédure différente de celle de ta fenêtre principale.

YOYO, @+.
YOYO
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
9 mars 2005 à 22:30
Merci pour ta réponce YOYO, mais je suis un véritable autodidacte au début de la programation c++.
J'ai donc un problème : Oui, créer une classe pour ma fenêtre fille, mais comment
Pour ma fenêtre principale c'est dev c++ qui le fait pour moi.
Après ta réponce je suis allé voir des sites. Je comprend qu'il faux que je reproduise quelque choses avec "
WNDCLASSEX wincl;" en donnent un autre nom et que je lui applique les instruction :
/* The Window structure */
wincl.hInstance = g_hInst;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

Mais
1 - est-ce possible sur une fenêtre CreateWindow( )
2 - dois-je prendre toute les caractéristique ou seulement :
mafenêtre.lpszClassName = szClassName;
mafenêtre.lpfnWndProc = WindowProcedure;

Et donc si cela fonctionne je n'aurais plus cas recréer une lecture des message de cette classe avec LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
}
}
c'est bien cela

Merci pour ton aide
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2005 à 00:01
Exact, 2 fenêtres différentes doivent se gérer dans des fonctions callback différentes.

ciao...
BruNews, MVP VC++
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
10 mars 2005 à 13:58
Ou je dois mettre QUOI et COMMENT

Ma fenêtre (intro) fille est une CreateWindow("edit"). Ou puis-je lui donner le nom de la classe

Pour créer la classe la consernant, dois-je écrire :
mafenêtre.lpszClassName = szClassName;
mafenêtre.lpfnWndProc = WindowProcedure;
dans WinMain, ainsi que :

(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
}
}

Ou puis-je uttiliser une même classe pour plusieur fenêtre pour ne gérer qu'un seule groupe de message

Si vous avez un livre à me conseiller
Je cherche un livre qui me permetre de répondre à de la programation en API Windows
Je ne trouvé dans les magasin que des livre qui dévelope la programmation c++ sur DOS et auccun sur Windows.

Merci.
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
10 mars 2005 à 14:14
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
10 mars 2005 à 14:14
Je peux pas m'occuper de ça pour l'instant, mais ce soir je te donne un exemple.

YOYO, @+.
YOYO
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
10 mars 2005 à 17:40
Si j'ai bien compris tu veux utiliser un edit sur une fenêtre.
Si c'est bien ça, t'as juste à créer ta fenêtre comme tu l'as déjà fait, donc là pas de pb.
Par contre quand tu crées ton edit, le nom de classe est défini par défaut c'est "edit" et rien d'autre. Tu dois également donner en argument (le 9ème) à CreateWindow, le HWND de la fenêtre où tu veux qu'il se trouve.
Pour ton code ça sera donc hwnd tout simplement.

J'espère que c'est ce que tu voulais.
Dans tous les cas tiens-moi au courant.

P.S.: Moi aussi je suis sous Dev-C++ 4.9.9.2

YOYO, @+.
YOYO
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
11 mars 2005 à 19:15
Reprenons :
J'ai une fenêtre principal (créé avec CreateWindowEx) dans laquelle j'ai créer plusieur editbox (crée avec CreateWindow) que je veux faire apparêtre l'une après l'autre via un menu dans ma fenêtre principal. Dans mon editbox j'ai intégré un bouton (crée avec CreateWindow).
Ne serait-il pas possible pour simpliffier le problème de renvoyer le message du bouton de l'éditbox dans la fenêtre principal en uttilisant le principe parent/enfant comme on le ferait pour du texte en Javascript
Cela m'éviterait de devoir écouter les message de chacune de mes fenêtre et me permettré de ne pas répéter les actions dans un autre CALLBACK que celui dejà uttilisé par la fenêtre principal

Merci de votre aide.
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
11 mars 2005 à 19:36
Oui ben c'est la méthode qui est juste au-dessus de ton message

YOYO, @+.
YOYO
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
11 mars 2005 à 22:21
Intro = CreateWindow("EDIT", "",
WS_CHILD | WS_VISIBLE,
0, 0, 800, 600,
hwnd, NULL, g_hInst, NULL);

/* Boutton */
HBITMAP Img_Btn;
hBouton = CreateWindow (
"button",/* Builtin button class */
"",
BS_BITMAP | WS_CHILD | BS_PUSHBUTTON,
200, 430, 85, 87,
Intro ,/* Parent is this window. */
(HMENU) ID_BTNMEDIA1, (9ème argument)
((LPCREATESTRUCT) lParam)->hInstance,
NULL
);
Img_Btn = LoadBitmap (g_hInst,"SOND") ;
SendMessage(hBouton, BM_SETIMAGE ,IMAGE_BITMAP ,(long) Img_Btn);

Désolé, je ne comprend pas bien votre réponce. J'ai mis le bouton dans l'editbox INTRO. C'est dans cette fenêtre que je voudrez qu'ils ce trouve. Malheureusement les messages envoyé par les boutons de l'éditbox INTRO sont envoyé dans l'éditbox en question, plus dans la fenêtre principal. Or c'est sur la fenêtre principal que j'ai mis une écoute des messages tel que je l'ai apris depuis que je progamme.
Vous me dit que c'est dans le 9ème argument que je doit mettre la fenêtre, mais le 9ème argument c'est "(HMENU) ID_BTNMEDIA1", d'ID qui créer le lien pour déclencher l'action rataché. Que dois-je faire alors
Faut t-il absolument que je créer une écoute des message de chaque fenêtre

Merci de votre passience.
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 mars 2005 à 08:35
Pas le 9ème pardon, mais le 8ème.
T'es obligé de mettre tes booutons dans l'edit ?
Parce qu'il suffirait de les placer dans la fenêtre principale et ça irait tout seul.
T'aurais plus qu'à régler leur position afin d'imiter ce que tu as actuellement graphiquement.

YOYO, @+.
YOYO
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
12 mars 2005 à 13:28
Ok ! Je vois. Je met mon bouton dans la fenêtre principal en moddifiant son focus pour qu'il ce trouve devant l'édit. Ainsi, ni vu, ni connu !
Je vais esseyer. Merci beaucoup.

JBM
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
12 mars 2005 à 13:52
Non, ok ! Mieux ! J'allais me perdre dans les hitoires de focus.

Mais en faite en créant mon bouton avant mes editbox et en jouant sur le rafréchisement des fenêtre je suis bon.

Merci encore.

JBM
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
12 mars 2005 à 14:47
Un nouveau problème ce pose

Quand je click sur mes bouton je déclanche un son ou une vidéo par la fonction :
ShellExecute(NULL, NULL, "video/terre1934.mpg", NULL, NULL, SW_SHOWNORMAL);

ce qui marche très bien !
Mais windows média souvrant part dessus j'ai un problème de réfréchisement qui ce pose.

J'ai plassé UpdateWindow(hwnd); juste après ShowWindow (hwnd, nFunsterStil);

cela rafréchi très bien ma fenêtre principal et je ne pert rien de mon édit, mais mes bouton disparessent ! Que puis-je faire

JBM
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 mars 2005 à 14:51
Essaye des bidouilles du genre cache puis fais réapparaitre tes boutons.
Ou alors agrandi ta fenêtre principale de 1 et réduit la de 1 aussitôt.

YOYO, @+.
YOYO
0
jbmartinez Messages postés 33 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 10 juillet 2006
12 mars 2005 à 14:57
Juste avant d'avoir votre réponce j'ai trouvé vraiment part assard.

J'envoie cette écoute de message :

case WM_SETFOCUS:
UpdateWindow(hwnd);
break;

Merci beaucoup
0
Rejoignez-nous