LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
2 févr. 2009 à 10:42
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 2013
-
3 févr. 2009 à 10:10
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
// 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
}
// 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
// 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;
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.
A voir également:
Probleme affichage d'une string dans boite de dialogue
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 2 févr. 2009 à 12:02
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...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 2 févr. 2009 à 15:34
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 2 févr. 2009 à 16:15
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...
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 2 févr. 2009 à 16:58
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
// 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
}
// 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
// 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);
}
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 2 févr. 2009 à 18:05
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)
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 2 févr. 2009 à 21:24
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...
LaTatadu91
Messages postés968Date d'inscriptionjeudi 20 mai 2004StatutMembreDernière intervention26 avril 20131 2 févr. 2009 à 21:49
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.