Dialog erstellen mit Buttons
-
Achso, das sollte ich vllt. noch erwähnen:
Ich arbeite mit eVC++, das ist ähnlich VC++ 6.0
Also nix mit VS2005/2008
Aber ich habe jetzt über insert New Form einen neuen Dialog hinzugefügt. Ich werde da jetzt mal schnell 5 Buttons hinklatschen, da erübrigt sich das aus mienem Thread mit dem Erstellen des Dialogs und den Buttons zur Laufzeit schonmal.
Aber wie arbeite ich dann genau mit diesem Dialog?
Gruß
Basti
-
Achso, naja ich hab bisher nur Erfahrung mit Microsoft Visual Studio 6.0.
Da hilft einem der Assistent bei sowas.
-
Wenn du deine Buttons manuell erstellst, dann weist denenen bestimmt auch sowas wie eine ID zu oder?
-
Ja, also ich habe jetzt schon einen neuen Dialog IDD_PLATZWAHL_DIALOG mit 5 Buttons drauf erstellt.
-
Also bei mir sieht sowas so aus:
Steht in der Dialogklasse.BEGIN_MESSAGE_MAP(CBlubbi, CDialog) //{{AFX_MSG_MAP(CBlubbi) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Behandlungsroutinen für Nachrichten CBlubbi void CBlubbi::OnButton1() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen }IDC_BUTTON1 ist die ID des Buttons. CBlubbi ist meine Dialogklasse.
Verwendet eVC++ auch so eine Art MESSAGE_MAP?
-
In der MESSAGE_MAP wird also das Ereignis auf die Button ID mit der zugehörigen Funktion verknüpft.
Dann diese Funktion noch schnell schreiben und fertig.
-
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 foundIch 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 ButtonsEndDialog(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