Dialog einbinden



  • Hallo.
    Ich habe mit Hilfe eines Tutorials ein kleine erste MFC-Anwendung geschrieben:

    #include "EinfachesFenster.h"  
    
    CMyApplication MyApp;   //Ein Objekt der abgeleiteten Anwendungsklasse erzeugen 
    
    CMyWindow::CMyWindow()
    {
      m_brushMyBackground.CreateHatchBrush( HS_CROSS, RGB( 240, 240, 240 ) );
      CString strWndClass =
      AfxRegisterWndClass
      ( CS_HREDRAW | CS_VREDRAW, MyApp.LoadStandardCursor( IDC_ARROW ),
        m_brushMyBackground,
        MyApp.LoadIcon( IDI_ICON1 ) //eigenes Icon eingebunden ansonsten: MyApp.LoadStandardIcon( IDI_WINLOGO ) 
      );
      Create( strWndClass, _T("Mein erstes MFC Fenster") );
    } 
    
    BOOL CMyApplication::InitInstance() //CWinApp::InitInstance() überschreiben
    {
     m_pMainWnd = new CMyWindow;
     m_pMainWnd ->ShowWindow( m_nCmdShow ); //Erzeugtes Fenster anzeigen
     return TRUE; 
    }
    
    BEGIN_MESSAGE_MAP (CMyWindow, CFrameWnd) //Nachrichtenverarbeitung
      ON_WM_LBUTTONDOWN()
      ON_WM_RBUTTONDOWN()
      ON_WM_PAINT() 
    END_MESSAGE_MAP() 
    
    void CMyWindow::OnLButtonDown(UINT nFlags, CPoint point)
    {
      MessageBox( L"Linke Maus", L"Info" );
    
    }
    
    void CMyWindow::OnRButtonDown(UINT nFlags, CPoint point)
    {
      MessageBox( L"Rechte Maus", L"Info" );
    } 
    
    void CMyWindow::OnPaint()
    {
      CPaintDC dc(this);
      dc.TextOut( 10, 10, _T("Text Text Text Text Text Text Text ") );
      dc.TextOut( 10, 50, _T("Text Text Text Text ") );
    }
    

    Mein erstes Ressource (Icon) habe ich auch schon angelegt und eingebunden.

    Nun möchte ich ein weiteren Ressource ertellen: Dialog.
    Den hab ich auch schon erstellt und ist im Projektordner auch erfolgreich abgespeichert unter IDD_DIALOG1

    Wie binde ich aber nun so ein Dialog ein?
    Z.b. wenn ich möchte das beim Rechtsklick nicht

    MessageBox( L"Rechte Maus", L"Info" );
    

    kommt, sondern mein Dialog IDD_DIALOG1

    Also irgendwie so:

    void CMyWindow::OnRButtonDown(UINT nFlags, CPoint point)
    {
      hier ein befehl, damit sich Dialog IDD_DIALOG1 öffnet..
    }
    


  • Rechtsklick,
    Klassenassistent,
    Dialog mit deiner Dialogklasse verbinden

    dann bei rechtklick:

    CMeinDialog dlg;
    dlg.DoModal();
    

    MfG



  • du must dir im klassenassi für deinen Dialog (IDD_DIALOG1) eine Klasse erstellen. zB CMyDlg_1

    die headerdatei der klasse CMyDlg_1 bindest du dann in die headerdatei deiner hauptanwendung (CMyWindow) ein.

    danach erstellst du dir in der headerdatei von CMyWindow eine membervariable deiner klasse CMyDlg_1 (m_MyDlg1)

    danach kannst du unter der funktion OnRButtonDown über diese membervariable und DoModal deinen dialog öffnen.

    void CMyWindow::OnRButtonDown(UINT nFlags, CPoint point)
    {
        if(m_MyDlg1.DoModal() == IDOK)
        {
            //Machwas wenn Dialog mit OK beendet wurde.
        }
    
    }
    


  • Erstmal Danke für die Antworten.
    Aber ich muss doch irgendwie das bestimmte Dialogfenster mit der ID einbinden?

    Habs nun erstellt:

    Das wurde generiert.

    Class MeinDialog_1
    {
    public:
    	MeinDialog_1(void);
    	~MeinDialog_1(void);
    	MeinDialog_1 (m_MeinDialog1); //das hab ich geschrieben...eine membervari erzeugt
    };
    

    Aber wie sag ich dem jetzt

    "öffne das Diaologfenster mit IDD_DIALOG1



  • du must im klassenassi(stenten) eine klasse für die dialogresource IDD_DIALOG1
    erstellen.

    wenn der klassenassi das macht, sieht die erstellte klasse wie folgt aus

    class CAboutTestDlg : public CDialog
    {
    // Konstruktion
    public:
    	CAboutTestDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(CAboutTestDlg)
    	enum { IDD = IDD_ABOUTTEST_DIALOG};
    		// HINWEIS: der Klassenassistent fügt an dieser Stelle Datenelemente (Members) ein
    	//}}AFX_DATA
    .....
    .....
    

    unter

    code oben schrieb:

    //{{AFX_DATA(CAboutTestDlg)
    enum { IDD = IDD_ABOUTTEST_DIALOG};

    wird die Dialogresource mit der jeweiligen klasse verbunden...

    und wie du deinen dialog öffnest hab ich dir schon geschrieben 😉



  • @rT!f@Ct schrieb:

    du must im klassenassi(stenten) eine klasse für die dialogresource IDD_DIALOG1
    erstellen.

    Und wie mache ich das genau?
    Also wenn ich eine neue Klasse hinzufügen klicke, kommt dieses Fenster:
    http://img203.imageshack.us/i/sreen.jpg/



  • LOL ok, mann hätte vorher fragen können...
    ich ging von vc 6 aus.

    ich hab nur die kostenlose vc 2008 und da kann man nicht bzw. nur SEHR eingeschrängt mit resourcen arbeiten.

    versuch mal auf den erstellten dialog zu klicken ob du da auch klassen erstellen kannst. vieleicht is ja vc2008 so schlau und generiert dir dann dafür ne klasse.

    ansonsten kuck mal wie es in deinem Hauptdialog CMyWindow gemacht wird und versuch das abzukupfern.



  • Hallo,

    ja, das ist ok, Rechtsklick auf den Dialog im Dialog-Editor, dann "Klasse hinzufügen" wählen, Name vergeben, als Basisklasse CDialog wählen. So wird eine Klasse erstellt, die auch die ID berücksichtigt.

    MfG,

    Probe-Nutzer



  • Hey danke für eure netten Antworten.
    Hat soweit alles geklappt.
    Der Klassenassisten hat folgendes erstellt:

    MyDialog.h

    #pragma once
    
    // MyDialog dialog
    
    class MyDialog : public CDialog
    {
    	DECLARE_DYNAMIC(MyDialog)
    
    public:
    	MyDialog(CWnd* pParent = NULL);   // standard constructor
    	virtual ~MyDialog();
    
    // Dialog Data
    	enum { IDD = IDD_DIALOG1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    	DECLARE_MESSAGE_MAP()
    };
    

    Und MyDialog.cpp

    // MyDialog.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "EinfachesFenster.h"
    #include "MyDialog.h"
    
    // MyDialog dialog
    
    IMPLEMENT_DYNAMIC(MyDialog, CDialog)
    
    MyDialog::MyDialog(CWnd* pParent /*=NULL*/)
    	: CDialog(MyDialog::IDD, pParent)
    {
    
    }
    
    MyDialog::~MyDialog()
    {
    }
    
    void MyDialog::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    END_MESSAGE_MAP()
    
    // MyDialog message handlers
    

    Die generierte .cpp File ist doch nicht zu beachten oder?
    Denn ich will ja in der Haupt.cpp mein Dialog einbinden.
    Ich muss sicherlich die MyDialog.h mit in die Haupt.h includen.

    Wie gehe ich nun weiter vor?!



  • Die generierte .cpp File ist doch nicht zu beachten oder?

    nicht für das erstellen der Variable mit der du den Dialog öffnen willst.

    Ich muss sicherlich die MyDialog.h mit in die Haupt.h includen.

    ja

    Wie gehe ich nun weiter vor?!

    jetzt aber ganz schnell hoch zur 1 post von Barados und meiner wenigkeit und lesen...



  • "Haupt.h"? Sehe ich jetzt nicht, du meinst wohl in die "EinfachesFenster.cpp"? Dort einfach ein #include hinzufügen:

    EinfachesFenster.cpp:

    #include "EinfachesFenster.h"
    #include "MyDialog.h"
    
    CMyApplication MyApp;   //Ein Objekt der abgeleiteten Anwendungsklasse erzeugen 
    
    CMyWindow::CMyWindow()
    {
      m_brushMyBackground.CreateHatchBrush( HS_CROSS, RGB( 240, 240, 240 ) );
      CString strWndClass =
      AfxRegisterWndClass
      ( CS_HREDRAW | CS_VREDRAW, MyApp.LoadStandardCursor( IDC_ARROW ),
        m_brushMyBackground,
        MyApp.LoadIcon( IDI_ICON1 ) //eigenes Icon eingebunden ansonsten: MyApp.LoadStandardIcon( IDI_WINLOGO ) 
      );
      Create( strWndClass, _T("Mein erstes MFC Fenster") );
    }
    
    //usw...
    

    Verwendung dann in z.B. CMyWindow::OnRButtonDown wie schon oben geschrieben...

    MfG,

    Probe-Nutzer



  • Was für ein Datentyp nehme ich denn?
    Wenn ich eine (Member)Variabel deklariere, muss ich ja auch den Typ angeben.



  • Ah nun habe ich es!

    VIELEN DANK! Das war ein Spitze Support von Euch..

    Schönen Abend noch.



  • na deinen klassennamen
    MyDialog m_MyDlg;//<- that's it

    [NEW EDIT]
    👍



  • @rT!f@Ct schrieb:

    na deinen klassennamen
    MyDialog m_MyDlg;//<- that's it

    [NEW EDIT]
    👍

    Habs nun direkt in der Schleife deklariert:

    void CMyWindow::OnRButtonDown(UINT nFlags, CPoint point)
    {
    
    	MyDialog dlg1;
        dlg1.DoModal();
    
    }
    

    Funktioniret aber auch.
    Denn wenn ich es in der MyDialog.h deklarieren will, meckert er rum:

    http://img202.imageshack.us/img202/6641/sreen.jpg

    aber naja es klappt ja nun



  • Denn wenn ich es in der MyDialog.h deklarieren will, meckert er rum:

    😕 <-(wie viele davon soll ich jetzt hier hin machen?)

    nicht in der MyDialog.h ne membervariable von sich selbst deklarieren
    sondern in der MyWindow.h



  • class MyDialog: 
    {
     public:
     MyDialog m_Dlg1
    };
    

    So meinst du oder?
    Also in der EinfachesFenster.h



  • in die Headerdatei in der die Klasse CMyWindow erstellt wird



  • wie kommst du eigentlich zu dem doch eher anspruchsvollen visual studio standard(+) ?

    MfG



  • @rT!f@Ct schrieb:

    in die Headerdatei in der die Klasse CMyWindow erstellt wird

    Geht nicht.
    Ist meine deklaration auch richtig?



  • weis nicht mehr was ich dir noch schreiben könnte damit du es verstehst.
    du willst es in der datei ansprechen in der

    void OnRButtonDown(UINT nFlags, CPoint point)
    

    deklariert ist, damit du es in der funktion ansprechen kannst.

    und eben in diese headerdatei wo OnRButtonDown deklariert ist must du die MyDialog.h includen und in der Klassen von OnRButtonDown die membervariable (MyDialog m_Dlg1;)erstellen.

    ansonsten bin ich jetzt am ende meines lateins... 🙄


Anmelden zum Antworten