2010-10-25 3 views
0

J'ai un projet MS Visual C++ 2005 où j'essaie d'avoir une boîte de dialogue principale avec une section consacrée à l'affichage des boîtes de dialogue de sous-formulaire sélectionnables. Chaque sous-formulaire aura la même taille mais aura une disposition différente. La sélection est effectuée à l'aide d'un contrôle de zone de liste déroulante. Je cherchai sur la meilleure façon de mettre en œuvre cette fonctionnalité et je suis tombé sur cette classe que quelqu'un a développé en 1999 pour le traitement des boîtes de dialogue de l'enfant dans une boîte de dialogue principale:Passage de données entre sous-formulaires de type CDialog

http://www.codeproject.com/KB/dialog/childdlg.aspx

Avec la modification supplémentaire:

http://www.codeproject.com/KB/dialog/childdlg.aspx?msg=1287#xx1287xx

Le code fonctionne assez bien pour sélectionner et afficher les différents sous-formulaires, mais je ne semble pas capable de transmettre des données d'un sous-formulaire à un autre. Plus précisément, chaque sous-formulaire comprend plusieurs contrôles d'édition. Je voudrais que l'utilisateur puisse entrer une valeur dans un contrôle d'édition sur le sous-formulaire n ° 1 et que cette valeur soit répercutée dans un contrôle d'édition ou un contrôle de texte statique sur le sous-formulaire n ° 2. J'ai essayé d'implémenter ceci en utilisant une fonction membre de la classe de dialogue de sous-formulaire (appelée CSubFormType et une sous-classe de CDialog) qui s'exécuterait en supprimant le focus au contrôle d'édition d'entrée de données (Box1a).

CSubFormType vide :: OnEnKillfocusBox1a() {

p2WndControl = (CWnd*)(GetDlgItem(IDC_Box1a)); //Get pointer to the control dialog box for data entry 

//Inserted here some specific code used to place data entered into IDC_Box1a into extern wchar_t outstr[32] 

SetDlgItemText (IDC_Box1b, outstr); //Echo data entered in IDC_Box1a to IDC_Box1b on same Subform #1 


SetDlgItemText (IDC_Box2, outstr);//Echo data entered in IDC_Box1a to IDC_Box2 on different subform, Subform #2 

}

La carte de message pour appeler CSubFormType signifie OnEnKillfocusBox1a est directement:

ON_EN_KILLFOCUS (IDC_Box1a, & CSubFormType :: OnEnKillfocusBox1a)

Ou indirectement par:

ON_BN_CLICKED (IDOK, & CSubFormType :: OnBnClickedOk) // CSubFormType :: OnBnClickedOk appelle ensuite OnEnKillfocusBox1a

Les problèmes que je rencontrais me sont:

1) ON_BN_CLICKED (IDOK, & CSubFormType :: OnBnClickedOk) ne le fait pas être appelé en appuyant sur la touche Entrée après avoir tapé des données dans Box1a. Au lieu de cela, la fonction membre OnBnClickedOk de la boîte de dialogue principale est appelée à la place. 2) Lorsque CSubFormType :: OnEnKillfocusBox1a est exécuté (par un clic de souris ailleurs), il peut renvoyer la valeur entrée dans Box1a à Box1b sur le même sous-formulaire # 1 mais ne renvoie pas la valeur à Box2 sur le sous-formulaire # 2 .

Toute indication sur ce que je dois faire pour résoudre ces problèmes ou une meilleure approche pour mettre en œuvre la même fonctionnalité générale serait grandement appréciée.

boîte Combo sélection fonction de membre de boîte de dialogue principale utilisée:

vide CMain :: OnCbnSelchange() { sélection d'int;

selection = ((CComboBox*)GetDlgItem(IDC_Select))->GetCurSel(); 

switch(selection) 
{ 
    case 0: // Select Subform 1 
     //Do nothing 
     break; 

    case 1: // Select Subform 2 
     SetDlgItemText (IDC_Box2, outstr); //Set Box2 text on Subform #2 
     break; 
} 

m_SubForms.ShowSubForm(selection); 

}

Répondre

0

Synchronisez toutes les formes lorsque la sélection principale de combobox est modifiée. Vous essayez de le faire immédiatement lorsque le texte de la zone de texte est modifié, mais ce n'est pas nécessaire car un seul formulaire est visible.

+0

Merci pour le commentaire. J'ai ajouté le code que j'utilise pour la sélection de la zone de liste déroulante à la fin de mon message original. Y at-il quelque chose de spécial qui doit être fait pour synchroniser toutes les formes? – Mike

+0

Je ne sais pas, c'est vos besoins. –

Questions connexes