Button im Dialog reagiert nicht
-
Hallo alle zusammen,
ich habe in Visual Studio 2010 mit C++ ein von CFormView abgeleitetes Programm in dem über einen Menüeintrag ein Dialog (von CDialog abgeleitet) aufgerufen wird. Den Dialog zeige ich mit DoModal() an und den Button im Dialog rufe ich über das OnBnClicked-Ereignis auf, doch kommt mein Programm nie in der entsprechenden Funktion an.// MsbmView.h: Schnittstelle der Klasse CMsbmView #pragma once #include "resource.h" #include "Dlg_NewExperiment.h" class CMsbmCntrItem; class CMsbmView : public CFormView { protected: // Nur aus Serialisierung erstellen CMsbmView(); DECLARE_DYNCREATE(CMsbmView) public: enum{ IDD = IDD_MSBM_FORM }; public: CMsbmDoc* GetDocument() const; CMsbmCntrItem* m_pSelection; CNewExperiment* m_pNewExp; public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung virtual void OnInitialUpdate(); // Erster Aufruf nach Erstellung virtual BOOL IsSelected(const CObject* pDocItem) const;// Container-Unterstützung public: virtual ~CMsbmView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: afx_msg void OnDestroy(); afx_msg void OnSetFocus(CWnd* pOldWnd); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnInsertObject(); afx_msg void OnCancelEditCntr(); afx_msg void OnFilePrint(); DECLARE_MESSAGE_MAP() public: CString m_Status; CString m_ExperimentName; CString m_PathName; CString m_Experiment; afx_msg void OnNewExperiment(); afx_msg void OnBrowsePath(); }; #ifndef _DEBUG // Debugversion in MsbmView.cpp inline CMsbmDoc* CMsbmView::GetDocument() const { return reinterpret_cast<CMsbmDoc*>(m_pDocument); } #endif //MsbmView.cpp (hier hab ich nur Teile der Datei kopiert) void CMsbmView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); DDX_LBString(pDX, IDC_STATUS, m_Status); } BOOL CMsbmView::PreCreateWindow(CREATESTRUCT& cs) { return CFormView::PreCreateWindow(cs); } void CMsbmView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_pSelection = NULL; // Auswahl initialisieren } // Dlg_NewExperiment.h #pragma once // CNewExperiment-Dialogfeld class CNewExperiment : public CDialog { DECLARE_DYNAMIC(CNewExperiment) public: CNewExperiment(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CNewExperiment(); // Dialogfelddaten enum { IDD = IDD_NEW_EXPERIMENT }; CNewExperiment* m_pNewExp; protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() public: CString m_ExperimentName; CString m_PathName; afx_msg void OnClickedBrowsePath(); }; // Dlg_NewExperiment.cpp: Implementierungsdatei #include "stdafx.h" #include "Msbm.h" #include "Dlg_NewExperiment.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CNewExperiment-Dialogfeld IMPLEMENT_DYNAMIC(CNewExperiment, CDialog) CNewExperiment::CNewExperiment(CWnd* pParent /*=NULL*/) : CDialog(CNewExperiment::IDD, pParent) { m_ExperimentName = _T(""); m_PathName = _T(""); } CNewExperiment::~CNewExperiment() { } void CNewExperiment::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EXPNAME, m_ExperimentName); DDX_Text(pDX, IDC_EXPPATH, m_PathName); } BEGIN_MESSAGE_MAP(CNewExperiment, CDialog) ON_BN_CLICKED(IDB_BROWSE_PATH, &CNewExperiment::OnClickedBrowsePath) END_MESSAGE_MAP() // CNewExperiment-Meldungshandler void CNewExperiment::OnClickedBrowsePath() { int x=1; }
Wenn ich mich mit dem Breakpoint auf int x=1; stelle, kommt er dort nie an. Ich habe auch schon versucht diese Funktion in der Hauptansichtsklasse aufzurufen, aber auch dort kommt er nicht an.
Wo liegt mein Fehler?? Bitte helft mir, ich weiß echt nicht mehr weiter. So schwer kann es doch nicht sein! Braucht ihr noch mehr Code?
Danke schon mal im Voraus
-
Ich sehe keinen Code wo Du den Dialog aufrufst?
Bist Du sicher, dass die IDs stimmen?
-
Hallo Martin,
sorry aber den Code zum Anzeigen des Dialogfensters habe ich vergessen mit zu posten.
void CMsbmView::OnNewExperiment() { CDialog dlgNewExp(IDD_NEW_EXPERIMENT); dlgNewExp.DoModal();
Er gehört in MsbmView.cpp rein
Ich hab die ID`s nochmal überprüft, sie stimmen überein.
-
na ich würde mal dreist behaupten das es am erstellen des Dialoges liegt
CDialog dlgNewExp(IDD_NEW_EXPERIMENT);
sollte doch eher
CNewExperiment dlgNewExp(IDD_NEW_EXPERIMENT);
heissen, so wird auch die richtige Klasse erstellt
-
Hallo CTecS
vielen Dank für deine Hilfe, doch leider funktioniert es so auch nicht.
Erst möchte er IDD_NEW_EXPERIMENT von int in CWnd* konvertiert haben, dann stürzt er bei DoModal(); ab und ohne DoModal() zeigt er den Dialog erst gar nicht an.
Schade, aber vielleicht hast du noch eine Idee.
-
CDialog dlgNewExp();
-
Ich meinte natürlich:
CNewExperiment dlgNewExp();
-
Hallo,
ich suche immer noch im MSDN und in den Foren nach einer Lösung meines obigen Problems.
Jetzt habe ich gelesen, dass die in einem Dialog eingebenen Daten erst nach dem Schliessen des Dialogs verarbeitet werden können. Da das im Zusammenhang mit Windows Forms stand, weiß ich nicht ob es auch für meine MFC-Anwendung zutrifft, denn dann wäre mein Rätsel gelöst.Was meint ihr?
Vielen Dank für eure Unterstützung im Voraus
Triple?
-
CNewExperiment dlgNewExp();
Hattest Du das schon ausprobiert? "IDD_NEW_EXPERIMENT" hat als Parameter im Konstruktor von CNewExperiment nämlich nichts zu suchen, hat Dein Compiler ja auch zu Recht angemeckert.
-
Hallo CTecS,
meine automatische "Neue email-Anzeige" scheint manchmal keine Lust zu haben, deshalb habe ich gerade erst deinen geänderten Code gesehen.Aber HURRA er funktioniert.
Danke, danke
Triple?
-
Die Änderung war zwar net wirklich von mir, oder zumindest war bei mir auch noch nen fehler drin, aber das is so wenn man was schnell nebenbei macht. Zumindest läuft es jetzt dann is ja gut
-
Hallo TecS,
sorry, aber am Ende ist mir egal, wer mir den richtigen Tipp gibt.
Manchml stehe ich eben mächtig auf der Leitung. Ist doch eigentlich klar, dass ich nicht von irgendeiner Klasse ableiten kann, sondern von der jeweils erforderlichen.Jedenfalls vielen, vielen Dank und (ehrlich gesagt) bis zur nächsten Frage,
Triple?