Dialog erstellen mit Buttons



  • 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