[ad_1]
Bonjour! Besoin d’aide – j’ai un projet MS VC++ 6 ; donc j’essaie juste d’ajouter le contrôle EDIT à celui de ma fenêtre modale (IDC_EDIT1), variable m_Edit1 (CEdit) et même après cela, il est impossible d’ouvrir une telle fenêtre. L’application est tombée en panne avec l’erreur “Violation d’accès” – NTDLL.DLL (0xC0000005). Si je supprime cette variable via Class Wizard, tout va à nouveau bien. Et j’ai trouvé ce problème dans chaque fenêtre, même dans le formulaire principal. Qu’est-ce que ça veut dire? Merci pour le soutien.
Ce que j’ai essayé :
En tête de fichier:
// Dialog Data //{{AFX_DATA(CNotebooksDlg) enum { IDD = IDD_NOTEBOOKS_DIALOG }; CEdit m_Edit1; CComboBox m_ComboSerial; CComboBox m_ComboDeviceType; CSortListCtrl m_ctrlListHistory;
fichier cpp :
//{{AFX_DATA_MAP(CNotebooksDlg) DDX_Control(pDX, IDC_EDIT1, m_Edit1); DDX_Control(pDX, IDC_COMBO_SERIAL_NUMBER, m_ComboSerial); DDX_Control(pDX, IDC_COMBO_DEVICE_TYPE, m_ComboDeviceType); DDX_Control(pDX, IDC_LIST_HISTORY, m_ctrlListHistory);
Solution 1
Tu dois appeler m_Edit.create( style, rect, parent, ID)
avant de pouvoir utiliser l’objet CEdit.
Solution 2
Il existe trois étapes pour faire fonctionner un contrôle dans une boîte de dialogue avec un programme MFC. Vous en avez fait deux et omettre la troisième entraînera le comportement que vous avez observé. La troisième étape consiste à ajouter un contrôle d’édition à votre IDD_NOTEBOOKS_DIALOG
avec l’identifiant IDC_EDIT1
dans le fichier de ressources. Cela se fait généralement avec l’éditeur de ressources, mais cela peut être fait manuellement si vous préférez.
FWIW, je travaille avec MFC depuis très, très longtemps et j’ai finalement pris l’habitude de ne jamais mettre de déclarations de classe de dialogue dans les fichiers d’en-tête parce que c’est tout simplement inutile. Avec l’interface appropriée, rien d’autre n’a besoin de connaître les détails de l’implémentation d’un dialogue, à l’exception du dialogue lui-même. La clé est l’interface. Une interface typique que j’écrirais voudrait quelque chose comme ceci :
bool OpenNotebookDlg( CWnd * pparent, NotebookData & data );
L’implémentation de cette fonction se ferait avec le code de la boîte de dialogue et initialiserait les contrôles avec les données puis, si OK
est cliqué, il extrait les données de la boîte de dialogue et renvoie vrai. Habituellement, j’aurais un Edit
méthode dans le NotebookData
la classe et son implémentation appelleraient la fonction affichée. J’ai trouvé que c’était une pratique très propre et facile à utiliser. Le seul inconvénient est que le code de dialogue doit connaître les données qu’il affiche, mais je considère que c’est un compromis juste et approprié.
[ad_2]
コメント