1 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Grundlagen
Grundlagen in Visual Studio in Visual Studio MFC und .net
MFC und .net
Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
Hochschule Harz
FB Automatisierung und Informatik
mwilhelm@hs-harz.de
Raum 2.202
Tel. 03943 / 659 338
Inhalt
1. Einführung, Windows-Schleife, API, MFC 2. Grafik
3. Dialogfenster
4. MFC-Zusatzklassen
5. SDI-Programme
3 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Visual Studio Wizard:
1. File / New / Project STRG+Shift+N 2. Visual Studio
3. MFC
4. MFC-Application
Visual Studio Wizard:
5 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Auswahl: Dialog
Dialog: Programmtyp: Dialog, SDI, MDI
7 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Dialog: User Interface Features
Dialog: Erweiterte Eigenschaften
9 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Dialog: Klassennamen
Erzeugte Dateien:
Header-Dateien:
• dialog.h
• dialogDlg.h
• resource.h
Quellcode-Dateien:
• dialog.cpp Windowsrahmen, erzeugt das Dialogfenster, ruft es auf
• dialogDlg.cpp Dialogfenster
• dialog.rc Klassen:
• CDialogApp abgeleitet von CWinApp
• CDialogDlg abgeleitet von CDialog
11 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Dialog: IDE, Klassen
Weitere Eigenschaften
Vorgehensweise:
■
Anzeige der Werkzeugleiste, GUI-Elemente
•
Menü View, Eintrag: Toolbox (STRG+ALT+X)
■
Änderung des Unicode-Eintrags
•
Menü Project, Eintrag: Properties (ALT+7)
•
Eintrag: Configuration Properties
•
Eintrag: General
•
Eintrag: Use UNICODE Response File
•
Wert auf „No“ setzen
13 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
AfxMessageBox (_T("String"));
Zeigt eine modale Meldung
Wichtige Funktionen
int MessageBox(lpText, lpCaption: PChar;
uType: UINT);
Flag für Funktionen
MB_ABORTRETRYIGNORE MB_OK
MB_OKCANCEL
MB_RETRYCANCEL MB_YESNO
MB_YESNOCANCEL Flag des Symbols
MB_ICONEXCLAMATION, MB_ICONWARNING
MB_ICONINFORMATION MB_ICONASTERISK
MB_ICONQUESTION MB_ICONSTOP
MB_ICONERROR MB_ICONHAND
Wichtige Funktionen
Flag für den Default-Schalter (Eingabetaste) MB_DEFBUTTON1
MB_DEFBUTTON2 MB_DEFBUTTON3 MB_DEFBUTTON4
Flags der Modalität MB_APPLMODAL MB_SYSTEMMODAL MB_TASKMODAL
Gültige Rückgabewerte:
IDABORT IDCANCEL IDIGNORE IDNO
IDOK
IDRETRY
IDYES
18 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
retcode = MessageBox("Text","Caption",
MB_ABORTRETRYIGNORE | MB_ICONWARNING);
int retcode = MessageBox("Text","Caption",MB_OK | MB_ICONWARNING);
int retcode = MessageBox(_T("Text"), _T("Caption"), MB_YESNO | MB_ICONQUESTION);
switch (retcode) { case IDYES:
AfxMessageBox("YES gedrückt");
break;
case IDNO:
AfxMessageBox("NO gedrückt");
break;
}
20 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
retcode = MessageBox("Text","Caption",
MB_YESNOCANCEL | MB_ICONERROR | MB_DEFBUTTON3);
switch (retcode) { case IDYES:
AfxMessageBox("YES gedrückt");
break;
case IDNO:
AfxMessageBox("NO gedrückt");
break;
case IDCANCEL:
AfxMessageBox("CANCEL gedrückt");
break;
}
Label, CStatic
Editorfeld, CEdit
Groupbox
Schalter, Klasse CButton
•
check box
•
radio button
•
pushbutton
ComboBox, CComboBox
Listenfeld, CListBox
Bildlaufliste, CScrollBar
Drehfeld, CSpinButtonCtrl
Statusanzeige
Tab-Control
Dialogelemente in Visual Studio
Regler
Zugriffstasten
Listenelement
Strukturansicht (Baum)
Registerkarte
Animation
Rich Edit
Datum- Zeitauswahl
Kalender
IP-Adresse
Erweitertes Kombinationsfeld
22 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Propertie-Dialog
Eigenschaften eines Labels
ID-Kennung
Beschriftung
Textausrichtung
Enabled
Kein Umbruch
Mit Rand
Vertieft
Visible
Dialogelemente: CStatic
24 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Eigenschaften des Editorfeldes
ID-Kennung
Textausrichtung
Einzeilig, mehrzeilig
Kennwort
Groß- Kleinbuchstaben
Nummer
Readonly
Enabled
Visible
Dialogelemente: CEdit
Eigenschaften eines Radiobuttons
ID-Kennung
Groupbox ist nur optisch
Der Anfang einer Gruppe wird definiert durch Element „Gruppe“ mit dem Wert
„TRUE“
Tabulator-Reihenfolge ändern mit Strg-D
Dialogelemente: CRadioButton
26 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Eigenschaften einer CheckBox
ID-Kennung
Groupbox ist nur optisch
Sichtbar
Enabled
Tabulator-Reihenfolge ändern mit Strg-D
Dialogelemente: CCheckBox
Eigenschaften eines Drehfeldes
ID-Kennung
Verknüpft mit einem Editorfeld
Änderung per Mausklick
Buddy-Eigenschaft setzen
Sichtbar
Enabled
Tabulator-Reihenfolge ändern mit Strg-D
Dialogelement: Drehfeld, CSpinButtonCtrl
28 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Einfügen eines Drehfeldes
Einfügen eines Editorfeldes
Ändern der Number-Eigenschaften im Editorfeld
Sofort danach Einfügen des Drehfeldes
Ändern der beiden Buddy-Eigenschaften im Register „Formate“
Ändern der ID auf z. B. IDC_SPIN_XTICKS
Damit ist die Verknüpfung zum Editorfeld definiert
Leider ist die Reihenfolge (Decrement, Increment) falsch
Abhilfe:
Dazu muss in der OnInitDialog-Methode folgender Code eingefügt werden:
m_SpinX1.SetRange(0,12); // (Membervariable) m_SpinX2.SetRange(0,12);
Dialogelement: Drehfeld, CSpinButtonCtrl
Eigenschaften der Combox
Dialogelemente: CComboBox
• Dropdown (Liste und Editor)• Dropdown-Listenfeld (Keine weitere Eingabe möglich)
• Einfacher Editor
30 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Eigenschaften der Combox
• Eintrag Data
• Eingabe jedes Wertes
• Trennen mit Semikolon
Dialogelemente: CComboBox
Inhalt:
123;456;789
Erzeugen einer Combox mit Drag & Drop
• Anklicken in der Werkzeugleiste
• Im Dialogfenster auf die gewünschte aufklappbare Größe aufziehen. Mehrere Zeilen hoch!!
Dialogelemente: CComboBox: Wichtig
•
Blau ist der aufgezogene Bereich.
•
Der roter Rahmen ist die Abmessung der ComboBox (automatisch). Dieser
Bereich definiert die
aufklappbare Liste.
32 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Nachträgliches Ändern der Länge der Liste
Dialogelemente: CComboBox: Wichtig
•
Auf den Haken klicken, bis das untere mittlere Quadrat schwarz ist.
•
Nun mit der linken Maustaste dieses
Quadrat nach unten schieben
Membervariablen der ComboBox eintragen
• Rechte Maustaste
• Eintrag: Add Variable
Dialogelemente: CComboBox:
34 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Initialisierung der Combox (CString Membervariable)
Dialogelemente: CComboBox:
BOOL Cdialog1Dlg::OnInitDialog() {
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_ComboControl.AddString(_T("Value1"));
m_ComboControl.AddString(_T("Value2"));
return TRUE; // return TRUE unless you set the focus to a control }
•
_T ist ein Makro für Unicode
36 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Abfrage des aktuelles Textes der Combox (CString M-Var)
Dialogelemente: CComboBox:
void Cdialog1Dlg::OnBnClickedButton1() {
CString sStr;
UpdateData(true);
sStr = m_Combo;
AfxMessageBox(sStr);
}
UpdateData(bRichtung)
• TRUE ⇒ Aus GUI nach Membervariable
• FALSE ⇒ Aus Membervariable nach GUI
Member-Variablen
• Editfeld: CString
• CheckBox: BOOL
• ListBox: CString
• RadioButton: int (Gruppen bezogen, 0..N-1)
UpdateData(bRichtung)
TRUE ⇒ Aus GUI nach Membervariable
FALSE ⇒ Aus Membervariable nach GUI
Ereignisprozedur (Actionlistener)
Funktionen mit Dialogelemente
38 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
1. Beispiel: Strings
ID-Kennungen:
•
IDC_QUELLE
•
IDC_ZIEL1
•
IDC_ZIEL2
•
IDC_CALC
Aufgaben
•
Transportieren eines String per Schalter
•
Transportieren eines String bei Änderung
Erzeugen von Member-Variablen
Membervariablen der Quelle eintragen
• Rechte Maustaste
• Eintrag: Add Variable
40 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Member-Variablen
IDC_QUELLE IDC_ZIEL1 IDC_ZIEL2
m_ziel1_str
m_quelle_str m_ziel2_str
Member-Variablen: Überblick, gibt es nur in Visual Studio 6
42 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Erzeugen von Member-Variablen: Definition
void CDialogDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialogDlg)
DDX_Text(pDX, IDC_QUELLE, m_quelle_str);
DDX_Text(pDX, IDC_ZIEL1, m_ziel1_str);
DDX_Text(pDX, IDC_ZIEL3, m_ziel2_str);
//}}AFX_DATA_MAP }
Diese Methode bitte nicht direkt aufrufen ! (UpdateData)
Initialisierung von GUI-Elementen: 1. Variante
Vor dem Konstruktor wird die Member-Variable definiert BOOL Cbsp1Dlg::OnInitDialog()
{
m_quelle_str = "Hallo";
m_ziel1_str = "1. Ziel";
m_ziel2_str = "2. Ziel";
CDialog::OnInitDialog(); // // Elemente werden gezeichnet return TRUE;
}
44 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Initialisierung von GUI-Elementen: 2. Variante
Vor dem Konstruktor wird die Member-Variable definiert BOOL CDialogDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Elemente werden gezeichnet m_quelle_str = "Hallo";
m_ziel1_str = "1. Ziel";
m_ziel2_str = "2. Ziel";
UpdateData(FALSE); // // Elemente werden gezeichnet return TRUE;
}
Ereignisroutine definieren
Vorgehensweise:
•
Doppelklick auf den Schalter
•
Ändern des Namens der Methode in der Propertie-Liste
void Cbsp1Dlg::OnBnClickedButton1() {
// TODO: Add your control notification handler code here
}
46 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Ereignisroutine definieren
1. Version:
void CDialogDlg::OnCalc() {
m_ziel1_str = m_quelle_str;
}
2. Version:
void CDialogDlg::OnCalc() {
UpdateData(TRUE);
m_ziel1_str = m_quelle_str;
}
Ereignisroutine definieren
3. Version:
void CDialogDlg::OnCalc() {
// Übertragung in die MemberVariablen UpdateData(TRUE);
m_ziel1_str = m_quelle_str;
// Übertragung von den MemberVariablen UpdateData(FALSE);
}
48 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
1. Beispiel: Aufgabe: Transportieren eines String
von IDC_QUELLE nach IDC_ZIEL2 Aktion bei Änderung
Vorgehensweise:
•
Membervariablen erzeugen
•
Ereignisroutine OnChange definieren
•
Datentransfer von einer Variablen zur anderen
•
UpdateData aufrufen
Ereignisroutine definieren
Vorgehensweise:
•
Anklicken der Quelle im Dialog
•
In der Propertie-Liste: Auswahl Ereignisse
•
Auswahl in der ComboBox
•
Automatischer Name
•
OnEnChangeQuelle
50 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Ereignisroutine definieren
void CDialogDlg::OnEnChangeQuelle () {
// Übertragung in die MemberVariablen UpdateData(TRUE);
m_ziel2_str = m_quelle_str;
// Übertragung von den MemberVariablen UpdateData(FALSE);
}
GUI-Element: Button, Radionbutton, Checkbox
Dialogelemente: CButton:
CButton * pBtn1 = (CButton *) GetDlgItem(IDC_RADIO1);
CButton * pBtn2 = (CButton *) GetDlgItem(IDC_RADIO2);
UpdateData(true);
m_RadioFB_Control=2;
if (m_CheckboxFB) {
m_ComboFB=0; // group=true, init-Wert
pBtn1->EnableWindow( true); // Disabled(false) pBtn2->EnableWindow( true);
}
else {
pBtn1->EnableWindow( false);
pBtn2->EnableWindow( false);
}
UpdateData(false);
52 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Übertragung der Daten
Event-Methode eines RadioButtons // Alternative zur GUI-Variable
int k, iChangeButton;
// ID holen
k = GetCheckRadioButton( IDC_RADIO1, IDC_RADIO3);
// welcher Button wurde geändert?
iChangeButton = k - IDC_RADIO1+1;
// Setzen der Beschriftung
SetDlgItemInt( IDC_STATIC1, iChangeButton);
// für alle RadioButtons
Übertragung der Daten
Event-Methode eines RadioButtons
// Aufruf eines zusätzlichen Dialogfensters // Abfrage der gesetzten Werte
CMyDialog dlg;
dlg.m_radio1 = 0;
if (dlg.DoModal() == IDOK) { CString sStr;
sStr.Format("R1: %d R2: %d",dlg.m_radio1,dlg.m_radio2);
AfxMessageBox(sStr);
}
54 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
Übertragung der Daten
Eigenschaften der Liste
BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog();
…
// TODO: Hier zusätzliche Initialisierung einfügen
CListBox * pListBox = (CListBox *) GetDlgItem(IDC_LIST1);
pListBox->AddString("a");
pListBox->AddString("b");
pListBox->AddString("c");
pListBox->AddString("d");
return TRUE;
}
Manuelle Übertragung der Daten von einer Liste in ein Label
Eigenschaften der Liste // OnSelChange der Liste
BOOL CTestDlg::OnLbnSelchangeList1 () { // ohne Membervariable
CListBox * pListBox = (CListBox *) GetDlgItem(IDC_LIST1);
CString sMsg;
pListBox->GetText( pListBox->GetCurSel(), sMsg);
SetDlgItemText( IDC_STATIC1, sMsg);
}
Einfache Ausgabe
UpdateData(true);
AfxMessageBox(m_liste);
56 FB Automatisierung und Informatik: GUI mit Visual Studio: MFC / .net
// Ohne Membervariable
BOOL CTestDlg::OnSelchangeCombo1() { CComboBox * pComboBox;
pComboBox = (CComboBox *) GetDlgItem(IDC_COMBO1);
CString sMsg;
pComboBox->GetLBText( pComboBox->GetCurSel(), sMsg);
SetDlgItemText( IDC_STATIC1, sMsg);
}
Manuelle Übertragung der Daten von einer Liste in ein Label
Übungen
Dialogfenster mit Übertragung der Strings
Dialogfenster mit Übertragung einer Zahl
IDC_QUELLE eintragen einer Zahl
Wenn numerisch, dann Ausgabe: „Ergebnis: 123“
Dialogfenster mit Übertragung von berechneten Zahlen
Zwei Editfelder (Input, A und B)
Eine ComboBox (mathematische Operation)
Ein Schalter