Frage zu GUI Design / MFC

Angiii

Erfahrenes Mitglied
Hallo,

Ich will ein einfache Panel generieren mit ein paar Knöpfen und Slidern drauf. Das ganze soll unabhänig von .Net laufen, also fällt CLR schon einmal weg. Mit der alternativen MFC-Bibliothek komme ich aber bisher gar nicht zurecht.

Ich vermisse die Visualisierung meines GUI, so das ich halbwegs live sehe was ich gerade erstelle. Gibts das bei MFC etwa nicht? Wenn ja, welche Alternativen habe ich?
Ich komme aus der Java-Ecke und bin dort den VisualEditor gewöhnt. Nach Stunden langen suchen und probieren bin ich in Sachen C++ und GUI leider immer noch nicht schlauer.

Ich hoffe Ihr könnt mir weiterhelfen!
Danke schonmal!
 
Hallo,

das mit der Visualisierung geht bei der MFC auch. Wenn in der Resourcenansicht einen Dialog angelegt wird, wird auch ein grafischer Designer geöffnet. Zu dem Dialog muss noch eine Klasse angelegt werden, was man mit Rechtsklick auf die Dialogoberfläche erledigen kann. Alles in allem ist es aber trotzdem nicht so komfortabel wie in der .NET-Welt. Man benötigt mehr Hintergrundwissen und die MFC ist nicht so leistungsfähig wie die .NET-Bibliothek.

Eine Alternative wäre z.B. der QtCreator, der mit Qt eine modernere und leistungsfähigere Klassenbibliothek mitbringt, die zudem noch plattformübergreifend eingesetzt werden kann: http://qt.nokia.com/developer

Gruß
MCoder
 
Dialoge? Wieso heißen Benutzerinteraces Dialoge? Mann, gestern hab ich Stunden damit verbraucht eine Lösung zu finden und dann ists so billlig! Hatte einfach am falschen Fleck gesucht.

Normal wollte ich auch .NET statt MFC verwenden, schon allein deswegen weil ich da nach 15 Minuten schon ein lauffähiges Programm hatte. Aber auf meinen Zielsystem ist für die Runtime kein Platz. QtCreator werd ich mir mal ansehen.

Vielen Dank für deine Hilfe. Hat mir wirklich weitergeholfen!
 
So MFC bringt mich langsam an den Rand der Verzweiflung. Ich finde MFC im Vergleich zu Java bzw. .NET furchtbar unlogisch aufgebaut, brauchbare Tutorials sind mangelware und überhaupt...

Meine Hauptfunktion steht ja, nur was mir fehlt ist ein einfaches GUI mit zwei drei Buttons und einer einzigen 0815-Slider. Die Dinger einfügen ist kein Problem. Aber das Eventhandling will einfach nicht klappen.

1. Wie ändere die Beschriftung von Button und Slider ohne das manuell über das Eigenschaftfeld zu machen (Code?)

2. Ich habe z.B. folgenden Code um auf Änderungen meiner Slider zu reagieren

Code:
void CCGOS_MFCDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
	m_Slider1.SetRangeMin(1, false);
	
m_Slider1.SetRangeMax(100, false);
	m_Slider1.SetPos(5);	
	*pResult = 0;


Bei einem ganz einfachen Beispiel will ich jetzt beim verschieben der Slider ihren jeweiligen Wert in der Console oder einem Textfeld anzeigen. Bei .net brauchte ich dafür...5 Minuten. Hier wird die Slider nichtmal angezeigt und das mit dem Werte anzeigen geht auch nicht. Gibt es da kein ganz einfaches Beispiel?

Danke nochmal!
 
So hi also den Namen eines Buttons oder was auch immer änderst du in der resource Datei.

Code:
BEGIN
    DEFPUSHBUTTON   "LOL",IDOK,15,13,50,14  <-- hier änderst du den namen
    CONTROL         "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | 
                    TBS_NOTICKS | WS_TABSTOP,85,125,126,15
    CONTROL         "Progress1",IDC_PROGRESS1,"msctls_progress32",WS_BORDER,
                    84,95,123,19
END

Ja dann hast du dein Slider und ne Prograssbar oder auch nicht^^

über den Klassenassistenten geht das doch ganz einfach.
in deiner Dialog-Klasse brauchst du die Variablen
m_sliderctrl, (jen ach dem m_progressctrl) und m_slider
C++:
// Dialogfelddaten
	//{{AFX_DATA(CMfc_testDlg)
	enum { IDD = IDD_MFC_TEST_DIALOG };
	CSliderCtrl	m_sliderctrl;
	CProgressCtrl	m_progressctrl;
	int		m_slider;
	//}}AFX_DATA

in der OnInit kannste dann z.B. die farbe setzen
C++:
m_progressctrl.SendMessage(PBM_SETBARCOLOR,0,(LPARAM) RGB(255,0,0));
bei dem Slider machst du folgendes
C++:
void CMfc_testDlg::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    UpdateData(TRUE);
	m_progressctrl.SetPos( m_slider );
	m_progressctrl.SendMessage( PBM_SETPOS, (WPARAM) m_slider, 0 ); 	
	UpdateData(FALSE);
	*pResult = 0;
}

UpdateData(TRUE); und FALSE nicht vergessen sonst steht in m_slider immer 0 ^^

Ach und es gibt wirklich genügend im Internet z.B.:
http://www.henkessoft.de/C++/MFC/MFC Tutorials.htm
die Seite ist für dich genau das richtige für dich glaube ich

MFG Nik
 
Zuletzt bearbeitet von einem Moderator:
Achso und der Wert steht immer in m_slider
Ja du legst ein Eingabefeld an und ordnest diesem eine CString variable zu, welche bei mir m_ausgabe heißt und dann sieht der Code einfach so aus:
C++:
void CMfc_testDlg::OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    UpdateData(TRUE);
	m_progressctrl.SetPos( m_slider );
	m_progressctrl.SendMessage( PBM_SETPOS, (WPARAM) m_slider, 0 ); 
	
    CString str;                          
    str.Format("%d",m_slider);
    m_ausgabe = str;

	UpdateData(FALSE);
	*pResult = 0;
}
 
Zuletzt bearbeitet von einem Moderator:
Ich finde MFC im Vergleich zu Java bzw. .NET furchtbar unlogisch aufgebaut, brauchbare Tutorials sind mangelware und überhaupt...
Auf jeden Fall sehr umständlich in der Handhabung. Es ist eigenlich nur ein besserer Wrapper für die Win32 API. Ich persönlich würd's für Neuentwicklungen nicht mehr hernehmen.
1. Wie ändere die Beschriftung von Button und Slider ohne das manuell über das Eigenschaftfeld zu machen (Code?)
Falls du eine Membervariable angelegt hast mit:
Code:
m_myMember.SetWindowText(_T("Bla Bla"));
oder sonst mit
Code:
SetDlgItemText(ID_MYCONTROL, _T("Bla Bla"));
2. Ich habe z.B. folgenden Code um auf Änderungen meiner Slider zu reagieren
NM_CUSTOMDRAW ist die falsche Message. Um auf Änderungen zu reagieren, solltest du besser TRBN_THUMBPOSCHANGING verwenden. Die Einstellung des Bereiches (SetRange...) sollte auch nicht an der Stelle, sondern vielleicht bei der Initialisierung des Dialogs erfolgen.

Gruß
MCoder
 
Zurück