begin process at 2012 05 30 01:39:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

Probleme affichage d'une string dans boite de dialogue


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme affichage d'une string dans boite de dialogue

lundi 2 février 2009 à 10:42:20 | Probleme affichage d'une string dans boite de dialogue

LaTatadu91

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.



 

lundi 2 février 2009 à 12:02:35 | Re : Probleme affichage d'une string dans boite de dialogue

buno

Administrateur CodeS-SourceS
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...
lundi 2 février 2009 à 13:12:18 | Re : Probleme affichage d'une string dans boite de dialogue

LaTatadu91

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.



 

lundi 2 février 2009 à 15:34:25 | Re : Probleme affichage d'une string dans boite de dialogue

LaTatadu91

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...


 

lundi 2 février 2009 à 15:47:22 | Re : Probleme affichage d'une string dans boite de dialogue

buno

Administrateur CodeS-SourceS
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...
lundi 2 février 2009 à 16:15:20 | Re : Probleme affichage d'une string dans boite de dialogue

LaTatadu91

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...

 

lundi 2 février 2009 à 16:58:55 | Re : Probleme affichage d'une string dans boite de dialogue

buno

Administrateur CodeS-SourceS
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...
lundi 2 février 2009 à 18:05:38 | Re : Probleme affichage d'une string dans boite de dialogue

LaTatadu91


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)

 

lundi 2 février 2009 à 21:24:01 | Re : Probleme affichage d'une string dans boite de dialogue

buno

Administrateur CodeS-SourceS
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...
lundi 2 février 2009 à 21:49:40 | Re : Probleme affichage d'une string dans boite de dialogue

LaTatadu91

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.

 


1 2

Cette discussion est classée dans : cdialog, dialogue, aboutbox, caboutdlg, conoffsoftdlg


Répondre à ce message

Sujets en rapport avec ce message

SOS CDialog [ par GUERRIER_ABSOLU ] Bonjour. Je ne connais pas MFC; Et j'essaie d'en apprendre les rudiments pour implanter en C++ (Visual studio 6) une petite partie d'un travail dont l Affichage CDialog dans un autre thread [ par sanouk ] Bonjour,Je veux afficher une boite de dialogue dans un thread secondaire. J'utilise pour cela CWinThread qui créé ma boite de dialogue.Dans ma classe Affichage et interaction dynamique dans une boîte de dialogue de valeurs dans une boucle while ou do...while [ par Karcynotron ] Bonjour à tous!Voilà j' essayes de porter un programme que j'ai réalisé sous DOS en C et qui lui fonctionne trés bien qui gère des moteurs pas à pas a boite de dialogue [ par fathiamine ] Bonsoir a tt la communauté je veux cree une boite de dialogue non modale bon j ai commancer comme suivant : J ai cree un view 'SDI' ou je vais clique dialogue de progression Borland C++ [ par parabole ] Bonjour , Sous Borland C++ , Je souhaiterai faire un dialogue simple de progression . Il s'ouvre pendant une autre tache en fond . J'utilise actuelle affichage CDialog dans plusieurs thread [ par manyyy67 ] Bonjour, je suis débutant en mfc voila j'ai un problème j'ai une boite de Dialog CInformationDlg qui est crée dans un thread d'un gros programme profe dialogue USB [ par marcus112 ] Bonjour à tous, comment est-ce que je peux à partir d'une commande (un appuie bouton ou une variable qui passe à 1), faire transférer un fichier (don Catcher l'ouverture d'une boite de dialogue modale [ par MikeM ] Bonjour à tous, Est-il possible dans une application MFC de type SDI/MDI d'être notifié de l'ouverture d'une boite de dialogue modale (bloquante) ? Controler le bouton "OK" dans un dialogue [ par jimmplan ] Bonjour,   Cela fait déjà deux jours que je cherche Sélection multiple de fichiers et répertoires dans boîtes de dialogue communes [ par julienbj ] Bonjour,Je cherche à sélectionner un ensemble de dossiers et fichiers à partir d'une boîte de dialogue commune.Pour l'instant je peux soit sélectionne


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales