Probleme affichage d'une string dans boite de dialogue

Résolu
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Bonjour,

pour situer un peu mon probleme je vais vous donner le contexte:
je travaille sous visual studio 2008, j'ai commencer un projet MFC en precisant boite de dialogue etc...
il m'a donc pondu 2 fichiers cpp:
MonApp.cpp et MonAppDlg.cpp

BOOL MonAppApp::InitInstance()
{
    // InitCommonControlsEx() est requis sur Windows XP si le manifeste de l'application
    // spécifie l'utilisation de ComCtl32.dll version 6 ou ultérieure pour activer les
    // styles visuels.  Dans le cas contraire, la création de fenêtres échouera.
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // À définir pour inclure toutes les classes de contrôles communs à utiliser
    // dans votre application.
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();

    AfxEnableControlContainer();

    // Initialisation standard
    // Si vous n'utilisez pas ces fonctionnalités et que vous souhaitez réduire la taille
    // de votre exécutable final, vous devez supprimer ci-dessous
    // les routines d'initialisation spécifiques dont vous n'avez pas besoin.
    // Changez la clé de Registre sous laquelle nos paramètres sont enregistrés
    // TODO : modifiez cette chaîne avec des informations appropriées,
    // telles que le nom de votre société ou organisation
    SetRegistryKey(_T("CMI Thermline Services"));

   MonAppDlg dlg;
    m_pMainWnd = &dlg;

    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO : placez ici le code définissant le comportement lorsque la boîte de dialogue est
        //  fermée avec OK
    }
 et pour le deuxieme :

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Données de boîte de dialogue
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // Prise en charge de DDX/DDV

// Implémentation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// boîte de dialogue CONOFFSoftDlg

CONOFFSoftDlg::CONOFFSoftDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CONOFFSoftDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CONOFFSoftDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   DDX_Control(pDX, IDC_LIST2, mListBox);
}

BEGIN_MESSAGE_MAP(CONOFFSoftDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
   ON_BN_CLICKED(IDOK, &CONOFFSoftDlg::OnBnClickedOk)
   ON_BN_CLICKED(IDOK2, &CONOFFSoftDlg::OnBnClickedOk2)
   ON_BN_CLICKED(IDOK3, &CONOFFSoftDlg::OnBnClickedOk3)
END_MESSAGE_MAP()

// gestionnaires de messages pour CONOFFSoftDlg

BOOL CONOFFSoftDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Ajouter l'élément de menu "À propos de..." au menu Système.

    // IDM_ABOUTBOX doit se trouver dans la plage des commandes système.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Définir l'icône de cette boîte de dialogue. L'infrastructure effectue cela automatiquement
    //  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    SetIcon(m_hIcon, TRUE);            // Définir une grande icône
    SetIcon(m_hIcon, FALSE);        // Définir une petite icône

    // TODO : ajoutez ici une initialisation supplémentaire

    return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
}

void CONOFFSoftDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// Si vous ajoutez un bouton Réduire à votre boîte de dialogue, vous devez utiliser le code ci-dessous
//  pour dessiner l'icône. Pour les applications MFC utilisant le modèle Document/Vue,
//  cela est fait automatiquement par l'infrastructure.

void CONOFFSoftDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // contexte de périphérique pour la peinture

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Centrer l'icône dans le rectangle client
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Dessiner l'icône
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

bref, du classique je pense.
donc sur ma boite de dialogue j'ai ajouté une listbox dans laquelle je fais apparaitre différents message suivant ce qu'il se passe dans mon application.
 void AddMsg(char * Msg) ; //MonAppDlg.h en public.
void MonAppDlg::AddMsg(char * buffer) 
{
   // TODO: Add your control notification handler code here
    mListBox.AddString(CString(buffer));
}
ca marche" sans soucis.

par contre dans mon application une autre classe est instanciée et lorsque je fais appel a la fonction  AddMsg a partir d'une autre classe
il me plante au niveau de Addstring....
voila comment je procede:

CONOFFSoftDlg *dlg2;

et dlg2->AddMsg("toto");
ca compile tres bien mais il plante lors de l'execution.

je n'arrive pas a percevoir d'ou vient mon erreur, je ne suis pas un pro de C++.
quelqu'un peut il m'aider sur la comprehension de tout ca, SVP?
merci.

 

10 réponses

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
C'est bon j'ai trouvé une solution assez simple: en fait a partir d'initdialog je fais ceci:
 m_Calcul.SetMessageWindow( & mListBox);

void Calcul::SetMessageWindow(CListBox* pMsgCtrl)
{
    m_pMsgCtrl = pMsgCtrl;
}

et a partir de ce pointeur déclaré dans la classe calcul , je peux faire des Addstring!

En tout cas merci pour tout bruno!
 
Messages postés
15213
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2022
101
Hello,
dlg2 n'est pas allouée, donc tu accèdes à une fonction d'un objet qui n'existe pas --> plantage.
CONOFFSoftDlg *dlg2 = new CONOFFSoftDlg();  // après, y'a ptet des paramètres à mettre
dlg2->AddMsg("toto");

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
salut,

je viens de tester et des le debut du prog avant mme l'ouverture de la boite de dial. il plante (assertion failed)...

_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetResourceHandle

()

{ ASSERT
(afxCurrentResourceHandle
!= NULL
);dans afxwin1.inl.

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
j'ai essayer différents trucs,
de déclarer en externe : MonAppDlg dlg;
    m_pMainWnd = &dlg;
qui est dans InitInstance mais ca marche pas non plus...
hormis mettre toutes mes fonctions dans une seule et meme classe je ne vois pas comment faire et c'est dommage de faire un taf de barbare pour ça...

 
Messages postés
15213
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2022
101
Euh...là, je suis perdu.
Tu essaies de faire quoi exactement?
Comment as-tu ajouter ta listbox?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
ma listbox est ajouté via le toolbox , puis j'ai fait click droit dessus "ajout de variable"
la j'ai mis CListBox mListBox

;suite a quoi depuis ma classe AppDlg.cpp je fais des appels a ma fonction d'ajout de message dans ma listbox et ca passe mais si je veux en faire a partir d'une autre classe il me jette: pourtant je declare un pointeur comme tu l'as conseiller
puis je l'alloue(c'est vrai j'avais oublier)
ensuite j'appel ma fonction "dlg2->AddMsg("toto");
la il rentre dedans mais au moment de faire mListBox
.AddString(...)

il plante, comme si la listbox n'eistait pas ou je ne sais quoi...

 
Messages postés
15213
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2022
101
Si je comprends bien, ta listbox est dans ta fenêtre principale et tu veux y accéder à partir d'une autre fenêtre, c'est ça?
Ce qui est généralement fait, c'est de mettre un pointeur de dialog dans la fenêtre secondaire et dans le constructeur, ajouter un paramètre de type pointeur de dialog. Quand tu feras appel à ce constructeur, tu lui passeras le pointeur sur la fenetre courante.
Dans l'exemple ci-dessous, quand je clique sur OK, j'ai la AboutBox qui apparait et qui affiche un message dans la listbox de sa fenêtre mère

// testMFCDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testMFC.h"
#include "testMFCDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();
    CAboutDlg(CDialog * pParent);

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
   
}

CAboutDlg::CAboutDlg(CDialog *pParent) : CDialog(CAboutDlg::IDD)
{
    ((CtestMFCDlg *)pParent)->AddMsg("coucou about");
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// CtestMFCDlg dialog

CtestMFCDlg::CtestMFCDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CtestMFCDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CtestMFCDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, mListBox);
}

BEGIN_MESSAGE_MAP(CtestMFCDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDOK, &CtestMFCDlg::OnBnClickedOk)
END_MESSAGE_MAP()

// CtestMFCDlg message handlers

void CtestMFCDlg::AddMsg(char * buffer)
{
    mListBox.AddString(CString(buffer));
}

BOOL CtestMFCDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
    AddMsg("coucou");

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CtestMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CtestMFCDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CtestMFCDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CtestMFCDlg::OnBnClickedOk()
{
    CAboutDlg dlg(this);
    dlg.DoModal();

    // TODO: Add your control notification handler code here
    OnOK();
}

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
salut,

en fait je n'ai qu'une seule fenêtre et ma listbox est donc dans cette fenêtre principale, par contre j'ai un programme de calcul qui tourne en fond et c'est ça mon autre classe.
je voudrais que suivant les résultats du calcul, afficher différent message dans la fenêtre principale.
lorsque j'appele ma fonction AddMsg a partir de ma classe "calcul" , ca plante, comme si les handle sur la listbox et sur la fenetre étaient "faussés" (en debug il dit : impossible d'évaluer l'expression)

 
Messages postés
15213
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
21 janvier 2022
101
Ah oui mais là, c'est totalement autre chose: c'est de la communication entre applications...
Je vois 2 solutions:
- dans ton programme "calcul", tu arrives à récupérer la fenêtre avec ta listbox au moyen de la fonction FindWindow() (j'ai un exemple dans mes sources, pour récupérer la fenêtre d'Internet Explorer)
- ou bien tu regardes du côté de la fonction SendMessage() pour envoyer un message à l'autre application

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
meme si c'est a l'interieur d'un meme programme, c'est considéré comme une communication entre application?
Je pensais pas...
je vais voir demain matin la fonction sendmessage...
je te tiens au jus.
merci.