Dialog erstellen?
-
Guten Tag
Mit welchen Befehl rufe ich aus einem Tabcontrol,mein eigenens Dialog das über dem Tab liegt auf.
Mit Createdialog() bekomme ich es nicht hin.
Mit DoModal() kann ich es erst behandeln. wenn es aus dem Dialog zurückkommt.Bin Anfänger.
Kann mir jemand helfen?
-
lol. DoModal ruft den Dlg modal auf und mit CMeinDialog* pDlg; pDlg->Create(); erstellt de deinen Dialog normal.. also unmodal
-
Danke
Ich Bekomme diesen Fehler
"nichtdeklarierter Bezeichner"Meine Klasse heist CDownDlg;
void CDialogMD::OnBnClickedBut() { CDownDlg* pDlg; pDlg->Create(); }
-
Das sollte ja wohl eher so lauten:
CDialog dlg(MEINE_DIALOG_ID); dlg.DoModal();
-
Jochen Kalmbach schrieb:
Das sollte ja wohl eher so lauten:
CDialog dlg(MEINE_DIALOG_ID); dlg.DoModal();
Das habe ich schon versucht.Aber wie bekomme ich zugriff im Dialog,
Erst wenn dlg.DoModal()wieder zurückkommt kann ich es auswerten.
-
Was willst Du denn machen?
Der korrekte ANsatz ist den CDialog abzuleiten und darin zu machen was Du willst.
Bzw. Du legst in den Resourcen einfach einen Neuen Dialog an, dann sollte auch eine passende Klasse (h/cpp-Datei) angelegt werden, wo Du normal mit dem Dialog "arbeiten" kannst.
Was ist denn genbau Dein Problem?
-
Wenn ich dlg.DoModal() aufrufe muss er doch in meiner Klasse
InitDialog aufrufen oder bin ich auf dem Holzweg?
Ich habe in meiner Klasse überall Breakpoints gesetzt,
aber er springt nicht in meine DialogKlasse!Weiss echt nicht weiter.
-
Wie hast Du denn jetzt die Klasse erstellt??? Dur VS indem Du einen neuen Dialog angelegt hast? Dann sollte er auch in InitDialog gehen...
Zeig doch mal die Deklaration Deines von CDialog abgeleiteten Objektes...
Sollte so ähnlich aussehen wie hier:class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialogfelddaten enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: DECLARE_MESSAGE_MAP() };
Und die Verwendung dann wie hier:
CAboutDlg dlgAbout; dlgAbout.DoModal();
-
class CDownDlg : public CDialog { DECLARE_DYNAMIC(CDownDlg) public: CDownDlg(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CDownDlg(); // Dialogfelddaten enum { IDD = IDD_DIALOG1 }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung DECLARE_MESSAGE_MAP() };
-
Und wo ist da bitte Deine "InitDialog", in welchem Du ein Breakpoint gesetzt hast!?
Du musst dies natürlich schon überladen:virtual BOOL OnInitDialog();
-
Danke erstmal,für deine Geduld.
Wäre ich doch bei der API geblieben,dann könnte ich deine und meine
Nerven schonen.Wie ich vorgehe!
1)Dialog erstellen.
2)Auf dem Dialog->Klasse hinzufügen.Warum wird dies "virtual BOOL OnInitDialog()" nicht erstellt?
Breakpoints:
Ich hatte die falsche Version der cpp Datei im Visual Studio geöffnet.
Passiert wohl mal beim Kopieren von Projecten.Ich glaube Visual Studio hat mir ein Streich gespielt.
-
Warum es nicht erstellt wird, weiss wohl nur MS...
Wenn Du z.B. ein CDHtmlDialog erstellst (anstelle eines CDialog), dann wird die OnInitDialog erstellt...
-
Ich versuch es jetzt mal mit einem ganz einfachen Project.
Ich habe das ganze Prinzip noch nicht richtig verstanden.
Danke
-
Das sollte ja wohl eher so lauten:
C/C++ Code:
CDialog dlg(MEINE_DIALOG_ID);
dlg.DoModal();Hmm nein... ich meine was ich schreibe -.- Er sollte sich eine Klasse zu seinem Dialog erstellen und diese dann mit CMeineDialogKlasse* pDlg; pDlg->Create()... aufrufen
-
Ich will Dir ja gar nicht wiedersprechen... der zitierte Code war ja nur ein "einfaches" Beispiel.
Wie Du aus meinen weiteren Posts sehen konntest, habe ich dann auch zu dem von Dir gesagten Vorgehen geraten (bzw. versucht zu erklären wie man das macht).
-
jumb schrieb:
Danke
Ich Bekomme diesen Fehler
"nichtdeklarierter Bezeichner"Meine Klasse heist CDownDlg;
void CDialogMD::OnBnClickedBut() { CDownDlg* pDlg; pDlg->Create(); }
An der Stelle hast du aber noch keinen Dialog, in dem du etwas Create()'n kannst, nur einen Pointer, der auf einen Haufen Datenmüll zeigt.
Richtig wäre folgendes:CDownDlg* pDlg = new CDownDlg();//Eventuell mit Parametern //JETZT hast du ein Dialog-Objekt, mit dem du arbeiten kannst pDlg->Create(); ... pDlg->DestroyWindow(); delete pDlg; }
(Eventuell kannst du den Dialog auch in einer Elementvariablen unterbringen und das DestryoWindow() aus einer anderen Methode heraus aufrufen)
-
Ich habe meine Schritte unten aufgeführt,
könnt ihr mir sagen was ich hier übersehe.
In der Messagebox kommt er nie an.1)Erstellen einer Dialogbasierende Anwendung.
2)Alles löschen und Button1 anlegen.
3)Ereignishändler für Button1 BN_Clicked einfügen.
4)CDialog dlg(IDD_DIALOG2);dlg.DoModal();im Ereignishändler für Button1 einfügen.
5)Dialog2 mit einem Button2 zeichnen.
6)Neue Klasse für Dialog2 in der Basisklasse CDialog erstellen.
7)Ereignishändler für Button2 BN_Clicked einfügen.
8)MessagBox im Ereignishändler für Button2 legen.
9)Ausführen.Vielen Dank für eure Mühe.
-
Also ich habe es endlich hinbekommen.
der Fehler war im Aufruf dlg.DoModal().Der Aufruf bei mir lautet jetzt
CDownDlg dlg; dlg.DoModal();
Damit klappt es jetzt.
1)Erstellen einer Dialogbasierende Anwendung.
2)Alles löschen und Button1 anlegen.
3)Ereignishändler für Button1 BN_Clicked einfügen.
4)CDownDlg dlg;dlg.DoModal();im Ereignishändler für Button1 einfügen.
5)Dialog2 mit einem Button2 zeichnen.
6)Neue Klasse für Dialog2 in der Basisklasse CDialog erstellen.
7)Ereignishändler für Button2 BN_Clicked einfügen.
8)MessagBox im Ereignishändler für Button2 legen.
9)Ausführen.Vielen Dank an alle.
CStoll (off) schrieb:
jumb schrieb:
Danke
Ich Bekomme diesen Fehler
"nichtdeklarierter Bezeichner"Meine Klasse heist CDownDlg;
void CDialogMD::OnBnClickedBut() { CDownDlg* pDlg; pDlg->Create(); }
An der Stelle hast du aber noch keinen Dialog, in dem du etwas Create()'n kannst, nur einen Pointer, der auf einen Haufen Datenmüll zeigt.
Richtig wäre folgendes:CDownDlg* pDlg = new CDownDlg();//Eventuell mit Parametern //JETZT hast du ein Dialog-Objekt, mit dem du arbeiten kannst pDlg->Create(); ... pDlg->DestroyWindow(); delete pDlg; }
(Eventuell kannst du den Dialog auch in einer Elementvariablen unterbringen und das DestryoWindow() aus einer anderen Methode heraus aufrufen)