nicht modales Fenster

Cycrow

Grünschnabel
#1

Hallo,
Ich hab grad mit VC++ angefangen und natürlich schon die ersten Probleme.
Ich möchte von meinem Hauptdialog aus einen weiteren (nichtmodalen) Dialog aufrufen. Dazu hab ich hier auch schon Hilfe gefunden und es Funktioniert.
Auf diesem Dialogfenster sind im Moment ein Textfeld und 2 Optionsbuttons, probehalber auch ein Kontrollkästchen. Diese möchte ich beinm Aufruf initialisieren.
Im Hauptdialogfenster klappt dies, wenn ich die Variablen dafür in OnInitDialog initialisiere.
Wenn ich dem 2. Fenster OnInitDialog hinzufüge , werden die entspr. Variablen nciht gesetzt.
Weiß jemand woran das liegt?
 
OnInitDialog() wird überhaupt nicht aufgerufen, wenn der Dialog nicht mit DoModal() geöffnet wird, also nichtmodal ist. Du solltest deine Initialisierung vielleicht in OnCreate() setzen -- das müsste gehen. Oder ruf OnInitDialog() selber explizit auf.
 
Zuletzt bearbeitet:
Bist du sicher, das WM_INITDIALOG nicht kommt? Hast du den OnInitDialog Handler über den Assistenten anlegen lassen (so soll es sein), nicht per Hand eingesetzt?

Laut MSDN kommt WM_INITDIALOG (bzw. OnInitDialog) bei modalen ebenso wie bei nicht modalen Dialogen.
 
Endurion hat gesagt.:
Bist du sicher, das WM_INITDIALOG nicht kommt? Hast du den OnInitDialog Handler über den Assistenten anlegen lassen (so soll es sein), nicht per Hand eingesetzt?

Laut MSDN kommt WM_INITDIALOG (bzw. OnInitDialog) bei modalen ebenso wie bei nicht modalen Dialogen.
Ich bin mir ziemlich sicher, dass es nicht kommt. Aber ich lasse mich gerne aufklären. Ich habe die Initialisierung jedenfalls immer anders erledigt, nachdem ich da mehrere Male Probleme mit hatte.
 
Kann eventuell bei MFC sein, je nachdem, wie der Dialog erstellt wird (Dies ist eine Annahme, keine Tatsache). Ich hab nur kurz unter CreateDialog für Win32 nachgesehen, und da steht in der MSDN, dass WM_INITDIALOG gesendet wird.

Ich weiss, dass es beim CDialogBar sowas nicht gibt, weil der eigentlich kein echter CDialog ist.
 
Zuletzt bearbeitet:
Danke ersteinmal für die Antworten.
Ich würde es gerne ausprobieren, aber die entspr. Haupt-cpp-Datei ist irgendwie weg. Ich hab das Problem schonmal gehabt.
Löscht Visual Studio gerne mal was? Kann mich nicht erinnern, die gelöscht zu haben.
Ansonsten brauch ich nochmal einen Abend um das wieder so weit zu bringen.
 
Bis jetzt tu sich gar nihts. Hier mal die Quellcodes :
Wenn ein Button mit der Bezeichnug "Rechner geklickt wird, soll sich ein neues, nichtmodales Fenster aufmachen. in dem sind bis jetzt eine Checkbox und ein Textfeld, die beide initialisiert werden sollen.

aus der Haupt cpp:
Code:
   void CHelper3Dlg::OnRechner() 
   {
   	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
   	CDialog* pDialog;
   
   	pDialog = new CDialog();
   	if(pDialog != NULL)
   	{
   		BOOL ret = pDialog->Create(IDD_NEWBEE,this);
   		if(!ret) //Create failed.
   		AfxMessageBox("Error creating Dialog");
   		pDialog->ShowWindow(SW_SHOW);
   		
   	}
   	else
   	AfxMessageBox("Error Creating Dialog Object");
   	
   }

DIe cpp des 2. Fensters:
Code:
   /////////////////////////////////////////////////////////////////////////////
   // Dialogfeld CNewbee 
   
   
   CNewbee::CNewbee(CWnd* pParent /*=NULL*/)
   	: CDialog(CNewbee::IDD, pParent)
   {
   	//{{AFX_DATA_INIT(CNewbee)
   	m_strAnzeige = _T("");
   	m_ctlCheck = FALSE;
   	//}}AFX_DATA_INIT
   
   }
   
   
   void CNewbee::-)oDataExchange(CDataExchange* pDX)
   {
   	CDialog::-)oDataExchange(pDX);
   	//{{AFX_DATA_MAP(CNewbee)
   	DDX_Text(pDX, IDC_Anzeigen, m_strAnzeige);
   	DDX_Check(pDX, IDC_CHECK1, m_ctlCheck);
   	//}}AFX_DATA_MAP
   
   }
   
   
   BEGIN_MESSAGE_MAP(CNewbee, CDialog)
   	//{{AFX_MSG_MAP(CNewbee)
   	ON_WM_CREATE()
   	ON_WM_SHOWWINDOW()
   	//}}AFX_MSG_MAP
   
   END_MESSAGE_MAP()
   
   /////////////////////////////////////////////////////////////////////////////
   // Behandlungsroutinen für Nachrichten CNewbee 
   
 BOOL CNewbee::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
   {
   	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
   
   
   	return CDialog::Create(IDD, pParentWnd);
   }
   
   int CNewbee::OnCreate(LPCREATESTRUCT lpCreateStruct) 
   {
   	if (CDialog::OnCreate(lpCreateStruct) == -1)
   		return -1;
   	
   	// TODO: Speziellen Erstellungscode hier einfügen
   	m_ctlCheck = TRUE;
   	m_strAnzeige = "Testtext";
   	return 0;
   }




Wo genau muss ich denn da eine Funktion explizit aufrufen, damit mir die Felder initialisiert werden?
 
Ach ihr immer mit eurem Direkt-Variablen-an-Controls-Kleb-Kram. Da muss ein UpdateData( FALSE) -Aufruf hinterher. Wenn die Variablen gesetzt werden, kriegt das das jeweilige Control ja nicht mit, das UpdateData erledigt das dann (so eine Art aufgepropfter Properties-Handler).

Wegen genau so was und noch mehr benutz ich das nie.
 
Bin für alternative voschläge immer offen.
Wenns eine andere Lösung dafür gibt (vom Grundsatz her) dann immer her damit.
 

Neue Beiträge

Zurück