Méthode OnSize

Signaler
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005
-
Messages postés
17
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
14 mai 2007
-
Bonjour à tous,


Je viens de créer une application fenêtré en MFC.
J'ai ajouté un bouton nommé : IDC_BUTTON.
J'ai ajouté la méthode OnSize pour repositionner le bouton lorsque la fenêtre est redimensionnée.

J'obtiens donc ce code :


void CtestDlg::OnSize(UINT nType, int cx, int cy)


{


CDialog::OnSize(nType, cx, cy);


// TODO : ajoutez ici le code de votre gestionnaire de messages


CButton* btn = (CButton*)GetDlgItem(IDC_BUTTON);


btn->MoveWindow(0, 0, 100, 100, FALSE);


delete btn;


}


A la compilation je n'ai aucune erreur mais lorsque j'exécute mon programme j'ai ce message :
Exception non gérée à 0x7c239cca (mfc71d.dll) dans test.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
S'avez vous comment régler ce problème ?

Merci d'avance,

BIG_BOSS

11 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
delete btn; n'a rien a faire ici

En plus court:

void CtestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
GetDlgItem(IDC_BUTTON)->MoveWindow(0, 0, 100, 100, FALSE);
}
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Merci de t'as réponse mais mon application plante toujours.
De plus visual studio me dirige dans un fichier nommé : winocc.cpp à la fonction
void CWnd::MoveWindow(
int x,
int y,
int nWidth,
int nHeight, BOOL bRepaint)

à ce moment visual studio me mets une petite flêche jaune (sur la gauche) sur la première ligne de la fonction qui
void CWnd::MoveWindow(
int x,
int y,
int nWidth,
int nHeight, BOOL bRepaint)


{


ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); // Ici la flêche qui se trouve sur la gauche



if (m_pCtrlSite == NULL)


::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);



else


m_pCtrlSite->MoveWindow(x, y, nWidth, nHeight);


}

Une idée ?

BIG_BOSS
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Voilà 5heures que je sèche...
Je ne trouve toujours pas le problème, je craque...

Quelqu'un aurait-il une idée ?
Merci

BIG_BOSS
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Que retourne GetDlgItem(IDC_BUTTON)?
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Comment puis-je connaitre ce que me retourne GetDlgItem(IDC_BUTTON) ?
Peux tu me donner un exemple stp ?

Merci à toi,

BIG_BOSS
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Avec le debugger, tu mets un point d'arrêt juste après
CWnd* pWnd = GetDlgItem(IDC_BUTTON); et tu regardes la valeur de pWnd
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Ok merci,
Alors quand je pointe mon curseur sur la variable pWnd il s'affiche dans une info bulle pWnd = 0x00000000 {CWnd pWnd=???}
Et dans la petite fenêtre il est écrit : Erreur : impossible d'évaluer l'expression

De quoi sa peut venir d'après toi ?

BIG_BOSS
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Un petit problème c'est sur. Dans ton dialogue, il n'y a aucun controle qui a l'ID IDC_BUTTON
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Pourtant...
Dans mon dialog IDD_TEST_DIALOG j'ai mis un bouton avec ID IDC_BUTTON.
De plus dans mes ressources il y est.
Mon fichier ressource contient ceci :


//{{NO_DEPENDENCIES}}


// Microsoft Visual C++ generated include file.


// Used by test.rc


//


#define IDD_TEST_DIALOG 102


#define IDR_MAINFRAME 128


#define IDR_MENU1 129


#define IDD_ABOUT_DIALOG 130


#define IDC_BUTTON 1000


#define IDC_EDIT1 1001


#define IDC_EDIT2 1002


#define IDC_NAME 1003


#define IDC_OLD 1004


#define ID_PICTURE 1007


#define ID_AIDE_APROPOS 32772


#define ID_EXIT 32773


#define ID_ABOUT 32774


// Next default values for new objects


//


#ifdef APSTUDIO_INVOKED


#ifndef APSTUDIO_READONLY_SYMBOLS


#define _APS_NEXT_RESOURCE_VALUE 133


#define _APS_NEXT_COMMAND_VALUE 32775


#define _APS_NEXT_CONTROL_VALUE 1008


#define _APS_NEXT_SYMED_VALUE 101


#endif


#endif

D'où mon imcomprehension.
Si tu veux je peux te passer les sources car c'est juste un projet pour m'entrainer à repositionner les contrôles.
Merci,

BIG_BOSS
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005

Bon j'ai fini par trouvé !
En fait GetDlgItem essaye d'accéder au bouton avant OnInitDialog().

Il suffit juste de se débrouiller pour que GetDlgItem ne s'éxecute qu'après.

Et encore merci de ton aide vecchio56 !!!

BIG_BOSS
Messages postés
17
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
14 mai 2007

Bonjour,
Comment as tu fait alors ? J'ai le meme problème, mais commment faire pour qu'il s'execute avant ?
Merci