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

Signaler
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006
-
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006
-
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

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

YOYO, @+.
YOYO
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Exact, 2 fenêtres différentes doivent se gérer dans des fonctions callback différentes.

ciao...
BruNews, MVP VC++
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Je peux pas m'occuper de ça pour l'instant, mais ce soir je te donne un exemple.

YOYO, @+.
YOYO
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Oui ben c'est la méthode qui est juste au-dessus de ton message

YOYO, @+.
YOYO
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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.
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
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
Messages postés
33
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
10 juillet 2006

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