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_DIALOG1Wie binde ich aber nun so ein Dialog ein?
Z.b. wenn ich möchte das beim Rechtsklick nichtMessageBox( 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 verbindendann 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 handlersDie 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?