nicht modales Fenster

Böses Forum, hat meine Antwort verschluckt! Böse! (klatschmitzeitung)

Es reicht, wenn du nach dem Variablensetzen einfach UpdateData( FALSE ) aufrufst. MFC überträgt dann die Werte in die tatsächlichen Controls.

Ich persönlich setze immer die Werte selbst in die Controls; da muss man zwar dann immer Variablen-in-String-Umwandeln-und-zurück, aber dafür weiss ich wo was wann passiert.
 
Jetzt weiss ich, warum mir die Antwort so vertraut vorkam. Habs in der alten Version schon dringehabt und hier vergessen. Aber der sagt trotzdem nichts. ist das neue Fenster evtl nicht richtig aktiv oder so?
Ich habe jetzt einen zusätzlichen Button ins neue Fenster angebracht, und die Initialisierungen in seine Funktion geschrieben, trotzdem nichts. Kann es sein dass die Nachricht irgendwo hängenbleibt?
 
Kannst du denn da ein kleines Testprojekt fertig kompilierbar hier reinstellen, dann gugg ich mal drüber? Manchmal ist es schwer, so auf die Distanz das rauszukriegen.
 
Also, an dem Projekt habe ich herumprobiert.
Bitte nicht über die Bezeichnungen wundern, ich war wirklich nur am testen.

Mir ist aufgefallen, dass das neue Fenster kein Taskleistensymbolerzeugt. Ich nehme an, dafür muss ich von Hand sorgen?

Und mit den Variablen an den Controls:
Sobald ich weiss, wie genau das mit dem wandeln geht teste ich es gerne mal aus.
 

Anhänge

  • Helper3.zip
    36 KB · Aufrufe: 14
So, hab jetzt mal drübergeguggt. Der eigentliche Fehler war wie üblich ganz woanders:

Im Hauptdialog hast du beim Dialog-Erstellen CDialog statt CNewbee benutzt, dann wird natürlich auch nicht der Code von CNewbee aufgerufen. Ich hab das mal ausprobiert, und dann kommt auch WM_INITDIALOG bzw. OnInitDialog.

Ich hab auch noch die (zu frühen) Aufrufe von UpdateData in OnCreate ausgeklammert und in DoDataExchange muss der sowieso raus, weil er sonst in eine Endlosschleife gerät.

Ich habe auch die Create-Überladung entfernt, da sonst der Create-Aufruf zuviele Parameter benötigt (und die Routine eigentlich nichts bringt).

Newbee.cpp geändert:
Code:
// Newbee.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "Helper3.h"
#include "Newbee.h"
#include ".\newbee.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// 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::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNewbee)
	DDX_Text(pDX, IDC_Anzeigen, m_strAnzeige);
	DDX_Check(pDX, IDC_CHECK1, m_ctlCheck);
	//}}AFX_DATA_MAP

  // Anmerkung, wird rekursiv, wenn hier UpdateData aufgerufen wird
  /*
		m_ctlCheck = TRUE;
	m_strAnzeige = "Testtext";

	UpdateData(FALSE);
  */

}


BEGIN_MESSAGE_MAP(CNewbee, CDialog)
	//{{AFX_MSG_MAP(CNewbee)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}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
	m_ctlCheck = TRUE;
	m_strAnzeige = "Testtext";

	UpdateData(FALSE);

	return CDialog::Create(IDD, pParentWnd);
}
*/

int CNewbee::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Speziellen Erstellungscode hier einfügen
  /*
  // Anmerkung OnCreate ist noch zu früh
	m_ctlCheck = TRUE;
	m_strAnzeige = "Testtext";

	UpdateData(FALSE);
  */
	return 0;
}

void CNewbee::initmich(void)
{
	m_ctlCheck = TRUE;
	m_strAnzeige = "Testtext";

	UpdateData(FALSE);

}

void CNewbee::OnButton1()   //Button mit bezeichnung KNOPF
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
	m_ctlCheck = TRUE;
	m_strAnzeige = "Testtext";

	UpdateData(FALSE);
}


BOOL CNewbee::OnInitDialog()
{
  CDialog::OnInitDialog();

	m_ctlCheck = TRUE;
	m_strAnzeige = "Testtext";

	UpdateData(FALSE);

  return TRUE;  // return TRUE unless you set the focus to a control
  // EXCEPTION: OCX Property Pages should return FALSE
}

Newbee.h geändert:
Code:
#if !defined(AFX_NEWBEE_H__CB801BC6_0078_40EB_A781_906B1381F15D__INCLUDED_)
#define AFX_NEWBEE_H__CB801BC6_0078_40EB_A781_906B1381F15D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Newbee.h : Header-Datei
//

/////////////////////////////////////////////////////////////////////////////
// Dialogfeld CNewbee 

class CNewbee : public CDialog
{
// Konstruktion
public:
	void initmich();
	CNewbee(CWnd* pParent = NULL);   // Standardkonstruktor

// Dialogfelddaten
	//{{AFX_DATA(CNewbee)
	enum { IDD = IDD_NEWBEE };
	CString	m_strAnzeige;
	BOOL	m_ctlCheck;
	//}}AFX_DATA


// Überschreibungen
	// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
	//{{AFX_VIRTUAL(CNewbee)
	public:
    // Anmerkung: Create entfernt, ist nicht nötig zu überschreiben
	//virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
	//}}AFX_VIRTUAL

// Implementierung
protected:

	// Generierte Nachrichtenzuordnungsfunktionen
	//{{AFX_MSG(CNewbee)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnButton1();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
public:
  virtual BOOL OnInitDialog();
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.

#endif // AFX_NEWBEE_H__CB801BC6_0078_40EB_A781_906B1381F15D__INCLUDED_

Und hier die OnRechner-Routine in Helper3Dlg.cpp:
Code:
void CHelper3Dlg::OnRechner() 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen

  CNewbee* pDialog;

	pDialog = new CNewbee();
	if(pDialog != NULL)
	{
		BOOL ret = pDialog->Create(IDD_NEWBEE, NULL);
		if(!ret) //Create failed.
		AfxMessageBox("Error creating Dialog");
		pDialog->ShowWindow(SW_SHOW);
		
	}
	else
	AfxMessageBox("Error Creating Dialog Object");
  /*
	CDialog* pDialog;

	pDialog = new CDialog();
	if(pDialog != NULL)
	{
		BOOL ret = pDialog->Create(IDD_NEWBEE, NULL);
		if(!ret) //Create failed.
		AfxMessageBox("Error creating Dialog");
		pDialog->ShowWindow(SW_SHOW);
		
	}
	else
	AfxMessageBox("Error Creating Dialog Object");
  */

}
 

Neue Beiträge

Zurück