Dialog erstellen mit Buttons



  • naja ich denk mal den neuen Dialog nun einzeln verwalten is nicht mehr so das prob, den kann ich ja genauso programmieren wie jeden anderen. Wo ich z.Zt. noch nicht weiter weis is wie ich den dann anzeige, wieder schliesse, und wie ich meinem Hauptdialog mitteile welcher button nun geklickt wurde^^
    LG Basti



  • also zum Anzeigen gibts die Funktion

    CDialog.DoModal

    zum Schließen hab ich sowas in der Funktion die beim Klick auf den Button ausgeführt wird.

    CDialog::OnOK();

    hast du sowas wie ein globales Anwendungsobjekt? dann könntest dort Membervariablen definieren und diese im Dialog ändern



  • oder zum Schließen

    EndDialog(IDOK);

    beim drücken auf den Button ausführen.

    wobei IDOK der Rückgabewert ist.

    if(CDialog.DoModal()==IDOK)
    {
     // Code der ausgeführt wird, wenn der Dialog mit dem OK Button beendet wurde
    }
    


  • okay, danke ich werd mich mal durchfuchsen... wenns nicht klappt meld ich mich nochmal 🙂



  • also im Moment sieht der Quelltext bei mir so aus, habe leider versäumt nen vernünftigen Namen für den Dialog zu vergeben -.-

    // Platzwahl.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "Schweissdraht.h"
    #include "Platzwahl.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // Platzwahl dialog
    
    Platzwahl::Platzwahl(CWnd* pParent /*=NULL*/)
    	: CDialog(Platzwahl::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(Platzwahl)
    	//}}AFX_DATA_INIT
    }
    
    void Platzwahl::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(Platzwahl)
    	DDX_Control(pDX, IDC_BUTTON55, m_LagerButton5);
    	DDX_Control(pDX, IDC_BUTTON44, m_LagerButton4);
    	DDX_Control(pDX, IDC_BUTTON33, m_LagerButton3);
    	DDX_Control(pDX, IDC_BUTTON11, m_LagerButton1);
    	DDX_Control(pDX, IDC_BUTTON22, m_LagerButton2);
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(Platzwahl, CDialog)
    	//{{AFX_MSG_MAP(Platzwahl)
    	ON_BN_CLICKED(IDC_BUTTON11, OnButton11)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // Platzwahl message handlers
    
    void Platzwahl::OnButton11() 
    {
    	// TODO: Add your control notification handler code here
    
    }
    

    Wie öffne ich dieses DialogFenster nun aus einem anderen Dialogfenster heraus?



  • Platzwahl dlg;
    if (dlg.DoModal() == IDOK)
    {
      // mach was mit Daten aus Dialog, z.B. dlg.GetReihe() oder was auch immer
    }
    


  • Also ich habe nun mal versucht in der SchweissdrahtDlg.cpp folgendes gemacht:

    Platzwahl dlg2;
    

    Fehlermeldung:
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Schweissdraht\SchweissdrahtDlg.cpp(27) : error C2146: syntax error : missing ';' before identifier 'dlg2'
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Schweissdraht\SchweissdrahtDlg.cpp(27) : error C2501: 'Platzwahl' : missing storage-class or type specifiers
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Schweissdraht\SchweissdrahtDlg.cpp(27) : fatal error C1004: unexpected end of file found

    Ich habe auch grade mal ein wenig in "Visual C++ Windows-Programmierung mit den MFC" gelesen, aber da steht auch nur was von DoModal == IDOK.
    Ich habe aber wie es scheint schon Probleme bei der Deklaration des zweiten Dialog-Fensters.
    Und meine zweite Frage wäre:
    Wenn man mit DoModal sozusagen den "Rückgabewert" des Dialogs geliefert bekommt... Wie kann man verscheidene Rückgabewerte vereinbaren? in meinem Fall die Zahlen 1-5. Muss ich das dann über Member-Variablen des neuen Dialogs realisieren?
    Liebe Grüße
    Basti



  • Okay, habe es nun hinbekommen:
    Habe lediglich vergessen die Platzwahl.h in den anderen Dialog einzubinden -.-
    Aufgerufen habe ich es dann testweise mit:

    Platzwahl	PlatzwahlDlg;
    
    	if (PlatzwahlDlg.DoModal() == IDCANCEL)
    	{
    		MessageBox(_T("Platzwahl"),_T("New Dialog"),MB_OK);
    	}
    

    LG Basti



  • der Rückgabewert "IDOK" kommt ja von deinem vordefinierten OK Button
    wenn du nun einen anderen Rückgabewert möchtest, dann ruf bei dem Drücken des Buttons

    EndDialog(rückgabewert);

    auf.



  • Super, das klappt soweit 🙂
    Nun hat sich noch ein kleines Typenproblem eingeschlichen ^^
    Ich deklariere in der Schweissdraht.h (mein hauptdialog)

    extern CString cs_freieplaetze;
    

    weil diese cs_freieplaetze von 2 Dialogen benötigt wird.
    So hier sieht dann mein Code teilweise in der Platzwahl.cpp aus:

    BOOL Platzwahl::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	int i_freieplaetze_length;
    
    	// TODO: Add extra initialization here
    
    	m_LagerButton1.EnableWindow(false);
    	m_LagerButton2.EnableWindow(false);
    	m_LagerButton3.EnableWindow(false);
    	m_LagerButton4.EnableWindow(false);
    	m_LagerButton5.EnableWindow(false);
    
    	MessageBox(cs_freieplaetze,_T("freie Plätze"),MB_OK);
    	i_freieplaetze_length = cs_freieplaetze.GetLength;
    	for (int i=0; i<=i_freieplaetze_length-1;i++)
    	{
    		switch (cs_freieplaetze[i])
    		{
    		case '1':
    			{
    				m_LagerButton1.EnableWindow(TRUE);
    			}
    		case '2':
    			{
    				m_LagerButton2.EnableWindow(TRUE);
    			}
    		case '3':
    			{
    				m_LagerButton3.EnableWindow(TRUE);
    			}
    		case '4':
    			{
    				m_LagerButton4.EnableWindow(TRUE);
    			}
    		case '5':
    			{
    				m_LagerButton5.EnableWindow(TRUE);
    			}
    		} //switch-Anweisung
    	} // for-Schleife
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    

    Und der Compiler zeigt mir in der Zeile

    i_freieplaetze_length = cs_freieplaetze.GetLength;
    

    C:\...\Platzwahl.cpp(68) : error C2440: '=' : cannot convert from 'int (__cdecl CString::*)(void) const' to 'int'



  • probiers mal mit

    i_freieplaetze_length = cs_freieplaetze.GetLength();

    GetLength() ist eine Funktion, also müssen Klammern hin


Anmelden zum Antworten