Zugriff auf Funktionen der Dialog-Klasse (C++/MFC/VS2010)

lmeinel

Grünschnabel
Hallo zusammen,

ich arbeite daran ein Projekt zu Bildverarbeitung, dass ich als Konsolenprogramm und auch mit GTK unter Linux entwickelt habe auf eine Windows GUI umzuschreiben. Nach ersten Versuchen mit Windows Forms und C++/CLI hab ich mich nun für MFC entschieden.
Ich bin also MFC-Neuling und habe deshalb einige Grundlagenfragen, für die ich im Internet keine Lösung gefunden habe.

Um möglichst wenig an den ursprünglichen Funktionen und der Struktur ändern zu müssen, möchte ich die Bildverarbeitungsfunktionen in einer eigenen .cpp belassen. Was mir nicht gelingt ist, aus diesen Funktionen auf die Elemente der Dialogklasse zuzugreifen, um z.B. einen String (z.B. Pfad) einzulesen oder ein paar Informationen in eine ListBox zu schreiben.

Quelltextbeispiele:

Dialog-Klasse
Code:
// CImageLab2011Dlg-Dialogfeld
class CImageLab2011Dlg : public CDialogEx
{
// Konstruktion
public:
	CImageLab2011Dlg(CWnd* pParent = NULL);	// Standardkonstruktor

// Dialogfelddaten
	enum { IDD = IDD_IMAGELAB2011_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung


// Implementierung
protected:
	HICON m_hIcon;

	// Generierte Funktionen für die Meldungstabellen
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnEnChangeMfceditbrowse2();
	afx_msg void OnBnClickedOk();
	afx_msg void OnBnClickedMfcbutton1();
	afx_msg void OnBnClickedButton1();
	afx_msg void OnEnChangeMfceditbrowse1();
	CMFCEditBrowseCtrl m_Pfad1;
	CMFCEditBrowseCtrl m_Pfad2;
	CMFCEditBrowseCtrl m_Pfad3;
	afx_msg void OnBnClickedResetbtn();

	CString StrPfad1;
	CString StrPfad2;
	CString StrPfad3;
	CListBox m_LogList;

        //falls man die eigene Funktion als Member der Dialog-Klasse deklariert
	void processImage();
};

"externe" cpp-Datei
Es soll z.B. ein Element zur ListBox m_LogList hinzugefügt werden.
Code:
//processImage.cpp: Hauptprojektdatei 
#include "stdafx.h"
#include "processImage.h"    //beinhaltet MFC-Header

//eigene Fkt. als Member der Dialog-Klasse - funktioniert:
void CImageLab2011Dlg::processImage()
{
	m_LogList.AddString("geschrieben durch Member-Funktion");
}

//funktioniert natürlich nicht:
void externe_funktion()
{
	m_LogList.AddString("geschrieben durch externe Funktion");
}

Die 2 Header, die die durch das VS2010/MFC erstellt werden sind eingebunden und ich könnte meine Funktionen als Memberfunktionen der Dialogklasse deklarieren. Das möchte ich aber nicht und das ist sicher auch keine saubere Variante, oder?

Dennoch hätte ich aber gern eine ähnlich einfache Schreibweise wie in der unteren Funktion. Die Listbox ist ja selbst eine Klasse vom Typ CListBox innerhalb der Dialogklasse. Ist es möglich auf diese Elemente ohne weiteres zuzugreifen?

Danke für eure Hilfe!

Mfg lmeinel
 
Hi und Willkommen bei tutorials.de :)

Gibt es einen Grund, warum du auf MFC umsteigst? GTK gibts doch auch für Windows.

Jedenfalls brauchst du für dein Vorhaben die Instanz von CImageLab2011Dlg.
Da MFC auch (leider) alles andere als sauber ist (und mangels Weiterentwicklung auch nie werden wird), wirst du die nicht wirklich sauber bekommen.

Eine Möglichkeit wäre zB, dass der Konstruktor der Klasse die Objektadresse in einer globalen Variable ablegt, über die man das Objekt wiederfindet. Hässliche Lösung, funktioniert aber.

Aber nocheinmal, wenn du dich mit GTK schon auskennst, warum verwendest du es nicht weiter?

Gruß
 
Zuletzt bearbeitet:
Hallo sheel,

vielen Dank für die freundliche Begrüßung und die schnelle Hilfe. Du hattest völlig Recht. Das mit dem globalen Zeiger auf die Dialog-Klasse funktioniert.

Meine Motivation, das VS2010 und MFC zu nutzen kommt einfach daher, dass es in der Firma, in der ich als Werkstudent arbeite, die bevorzugte Entwicklungsumgebung ist. Da kann ich nicht mit Glade und KDevelop ankommen. Deshalb wollte ich mich auch damit mal weiterbilden. Am Anfang lässt sich ein MFC-Projekt ja auch ganz einfach erstellen.


Für alle, die eine ähnliche Frage haben, ich habe es so realisiert:

Header in dem die Dialog-Klasse definiert ist:
Code:
// Zeiger auf Klasse CImageLab2011Dlg
#ifndef LABDLG
#define LABDLG
	CImageLab2011Dlg* LabDlg;
#endif

Konstruktor der Dialog-Klasse
Code:
CImageLab2011Dlg::CImageLab2011Dlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CImageLab2011Dlg::IDD, pParent)

{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	LabDlg = this;
}

In allen Programmteilen, die den Dialog-Klassen-Header inkludiert haben, kann man man dann einfach auf die Dialog-Elemente zugreifen.

Beispiel:
Code:
void textout(string sText)
{
	LabDlg->UpdateData(TRUE);
	LabDlg->m_Status = sText.c_str()
	LabDlg->UpdateData(FALSE);

	LabDlg->m_LogList.AddString(sText.c_str());
}

Beste Grüße
lmeinel
 
Zurück