Modif d'info d'une fenètre avant sa création. [Résolu]

Signaler
Messages postés
37
Date d'inscription
vendredi 9 juillet 2004
Statut
Membre
Dernière intervention
18 octobre 2010
-
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
-
Bonjour,

je cherche a modifier l'apparence d'une fenêtre par exemple un bouton visible ou pas avant la création de la fenêtre.

pour que la fenêtre ai la bonne apparence dès sa création.

hdaniel

14 réponses

Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
c'est corrigé!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
Fais tes manips dans WM_CREATE ou WM_INITDIALOG

ciao...
BruNews, MVP VC++
Messages postés
37
Date d'inscription
vendredi 9 juillet 2004
Statut
Membre
Dernière intervention
18 octobre 2010

J'avais déja essayé avec WM_CREATE et ça ne va pas.

je fais apparaitre le bouton avec :
m_CtrlBut.ShowWindow(SW_SHOW);
et ça me pête un popup debug assertion failed
file winocc.cpp line 301

y a peut-être un autre moyen de rendre visible un bouton.

hdaniel
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
Moi j'utilise un BOOL:

Variable global: BOOL setVisible, ensuite lors de l'appel je fais:
case IDC_BOUTON1:
setVisible =TRUE;
return (int)DialogBox(hInst,MAKEINTRESOURCE(IDD_FENETRE),NULL,fenetreDlg); }

et dans fenetreDlg, je fais un truc genre:
if (setVisible) {
hCtrl = GetDlgItem(hWndconf, IDC_BOUTON_A_AFFICHER);
showWindow(hCtrl, SW_SHOW);
}

Voilà!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
Une prochaine fois serait cool d'indiquer 'MFC' dans la question.

ciao...
BruNews, MVP VC++
Messages postés
37
Date d'inscription
vendredi 9 juillet 2004
Statut
Membre
Dernière intervention
18 octobre 2010

Bon, j'ai du mal a comprendre (j'suis pas un c++seur de longue date)

le passage par un bool tout a fais ok,

(int)DialogBox(hInst,MAKEINTRESOURCE(IDD_FENETRE),NULL,fenetreDlg); }
je comprends pas.

malik7934, quand tu dis
et dans fenetreDlg, je fais un truc genre:

c'est dans le constructeur?
fenetreDlg::fenetreDlg(CWnd* pParent )
: CDialog(fenetreDlg::IDD, pParent)

hdaniel
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
en fait, je crois que j'ai mal compris ce que tu veux.

Ma méthode fait la chose suivante: tu es sur une fenêtre, il y a un bouton "ajouter une editbox" par exemple. En cliquant sur ce bouton, une editbox apparaît, mais en changeant de fenêtre.

Si tu veux rester au même endroit, ben y a une source sur ce site qui t'expliquera: c'est pour une progress bar, je sais plus sa référence alors la voilà:
#ifndef __PROGRESSBAR_H
#define __PROGRESSBAR_H

#include <windows.h>
#include <commctrl.h>

class ProgressBar
{
private:
HWND hBar;

public:
int MaxRan;
int MinRan;

BOOL Init(HWND hwndbar); //Initialise le controle
BOOL SetRange(int nMinRange,int nMaxRange); //Définis la position Minimale et Maximale
void Hide(BOOL bVisible); //Afiche ou Cache le controle
BOOL IsVisible(void); //Détermine si le controle est visible
int SetStep(int nStep); //Définis le pas
int SetPos(int nPos); //Définis la valeur du controle
int Increment(int nIncrement);//Incrémente de nIncrement la valeur du controle
int IncrementStep(void);//Incrémente d'un pas définis par SetStep la valeur du controle
};

BOOL ProgressBar::Init(HWND hwndbar) //Initialise le controle
{
hBar=hwndbar;

if (hBar==NULL)
    {
     return FALSE;
     }
return TRUE;
}

BOOL ProgressBar::SetRange(int nMinRange,int nMaxRange) //Définis la position Minimale et Maximale
{
if ((nMinRange<0) || (nMaxRange>65535))
    {
   return FALSE;
     }

if(SendMessage(hBar,PBM_SETRANGE,0,MAKELPARAM(nMinRange,nMaxRange))==0)
    {
     return FALSE;
     }

MinRan = nMinRange;
MaxRan = nMaxRange;

return TRUE;
}

int ProgressBar::SetStep(int nStep) //Définis le pas
{
int nOldStep;
nOldStep=SendMessage(hBar,PBM_SETSTEP,(WPARAM)nStep,0);
return nOldStep;
}

int ProgressBar::Increment(int nIncrement) //Incrémente de nIncrement la valeur du controle
{
int nOldPos;
nOldPos=SendMessage(hBar,PBM_DELTAPOS,(WPARAM)nIncrement,0);
return nOldPos;
}

int ProgressBar::IncrementStep(void) //Incrémente d'un pas définis par SetStep la valeur du controle
{
int nOldPos;
nOldPos=SendMessage(hBar,PBM_STEPIT,0,0);
return nOldPos;
}

int ProgressBar::SetPos(int nPos) //Définis la valeur du controle
{
int nOldPos;
nOldPos=SendMessage(hBar,PBM_SETPOS,(WPARAM)nPos,0);
return nOldPos;
}

void ProgressBar::Hide(BOOL bVisible) //Afiche ou Cache le controle
{
if (bVisible==TRUE)
    {
        ShowWindow(hBar,SW_SHOW);
     }
else
    {
        ShowWindow(hBar,SW_HIDE);
     }
}

BOOL ProgressBar::IsVisible(void) //Détermine si le controle est visible
{
return IsWindowVisible(hBar);
}
#endif


après, il te suffit de faire Bar1.Hide(false/true); (Bar1 est déclaré dans le cas présent "progressbar Bar1;"). T'as plus qu'à adapter!

Voilà! J'espère que c'est ce que tu voulais!

See you,Malik7934
Messages postés
37
Date d'inscription
vendredi 9 juillet 2004
Statut
Membre
Dernière intervention
18 octobre 2010

Je pense que mon problème est plus simple que ce que tu penses.

j'ai une fenêtre ou je collecte des informations.
à la fin de cette collecte, je crée une fenêtre dlgModifConf

dlgModifConf.DoModal()

dans la fenêtre dlgModifConf je veux imposer certains choix au début (en fonction des infos collectés avant).

notamment faire apparaître ou non un bouton.

donc avec un bool je peux sauver mon info tout a fais ok.
mais ou je met mon ShowWindow?

hdaniel
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
Ben alors je reviens sur ce que je disais:

Variable global:
BOOL setBoutonVisible; /* pour avoir ton fameux bouton*/
case TRAITEMENT: /* en supposant que tu as un bouton "Traitement des infos" qu'on clique lorsque différentes radio sont cochées par exemples*/
if(SendMessage(GetDlgItem(hWnd,IDC_RADIO),BM_GETCHECK,0,0) == BST_CHECKED){/* imaginons que IDC_RADIO implique une condition */
EndDialog(hWnd,0);/*je ferme la fenêtre courante*/
setBoutonVisible = TRUE; /*je dis que je veux afficher mon bouton en plus*/
return (int)DialogBox(hInst,MAKEINTRESOURCE(IDD_FENETRE2),NULL,fenetreDlg); }/*et ouvre une nouvelle fenêtre, identique à la précédente (un clône), mais qui a les spécificités demandées par IDC_RADIO en plus*/

et dans BOOL CALLBACK fenetre(...) (qui est la même fonction qu'avait appelé ton programme et o`on à coché le radio!), je fais
if (setVisible) {
hCtrl = GetDlgItem(hWnd, IDC_BOUTON_A_AFFICHER);
showWindow(hCtrl, SW_SHOW);
}

... on y est? Je sais pas si ma méthode est "propre" mais elle a l'avantage de fonctionner ;o)
Messages postés
37
Date d'inscription
vendredi 9 juillet 2004
Statut
Membre
Dernière intervention
18 octobre 2010

J'ai bien du mal avec ton style de programmation. je pense que tu est un cran au dessus.

moi je crée mes boites de dialogue avec editeur microsoft VC6 et je fais un DoModal
et je ne me sens pas capable de passer a cette programmation cela risque de me poser plein de problème. je suis pas a l'aise avec les handles de fenêtre etc...
hdaniel
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
T'en fais pas, on va y arriver! (j'espère ;o))

Sûr que je suis pas un cran au dessus! J'ai découvert le C y a pas 2 mois!!! Et tu peux demander à BruNews ce qu'il pense de mes connaissances ;o)

Reprenons... En mots:
Imaginons que tu as une fenêtre avec deux radios et un bouton EXECUTE. Le premier dit "afficher un bouton" et le second dit "ne pas afficher de boutons".

Je prépare la fenêtre qui va être appelée par EXECUTE en mettant, par exemple, le fameux bouton en invisible. Je mets aussi BOOL ShowMyButton comme variable globale

Bon, jusque là, rien de spécial. Ensuite je dis: lorsque je clique EXECUTE, si c'est le radio "avec bouton" qui est sélectionné, je mets mon boolean ShowMyButton à TRUE, si c'est le radio "sans bouton", je mets ShowMyButton = FALSE. Suite à ça, j'appelle la fenêtre dans BOOL CALLBACK lafenetre (...), ben il suffit d'avoir un bout de code du type if(ShowMyButton){rendre le bouton visible} else{ne rien faire}...

Voilà! Je crois pas être capable d'être plus clair! Sorry...

En code:

...
BOOL ShowMyButton;
...
case EXECUTE:if(SendMessage(GetDlgItem(hWnd,IDC_RADIO_AVEC),BM_GETCHECK,0,0) BST_CHECKED){ShowMyButton TRUE;}if(SendMessage(GetDlgItem(hWnd,IDC_RADIO_SANS),BM_GETCHECK,0,0) BST_CHECKED){ShowMyButton FALSE;}
EndDialog(hWnd,0);
return (int)DialogBox(hInst,MAKEINTRESOURCE(IDD_FENETRE2),NULL,fenetreDlg); }
...
BOOL CALLBACK fenetreDlg(...) (
if (ShowMyButton) {
hCtrl = GetDlgItem(hWnd, IDC_BOUTON_A_AFFICHER);
showWindow(hCtrl, SW_SHOW);}
...

T'as tout là! Pis si ça suffit pas, je te conseille de prendre du temps sur http://www.msdn.microsoft.com et d'étudier quelques sources sur ce site...

A+, Malik7934
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
hdaniel> les handle n'ont rien de mystique, faut faire comme malik7934 et s'y mettre. On peut creer ses dialog idem avec le resource editor en codant direct API.
MSDN + Petzold ira impec:
http://brunews.free.fr/brunews/download/CP5.zip
http://brunews.free.fr/brunews/download/CP5Sources.zip

ciao...
BruNews, MVP VC++
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
Voilà pour toi:

http://www.cppfrance.com/code.aspx?ID=26355

A+, Malik7934
Messages postés
37
Date d'inscription
vendredi 9 juillet 2004
Statut
Membre
Dernière intervention
18 octobre 2010

Je te remercie de tous les efforts que tu fais pour me mettre les points sur les i.

Par contre dans ta source, resource.h se trouve ou?

hdaniel