Windows - programmierung in c++(mfc)
Windows - Programmierung in C++(MFC)
Einleitung zu MFC
MFC = Microsoft Foundation Classes
MFC ist ein objektorientierter Überbau über Windows API.
Vorteile zu normaler C-Programmierung:
Betriebssystemunabhängiger
Einige Routinearbeiten bleiben erspart wie z.B.: Meldungsschleife im Hauptprogramm
Wenig Type Casting = höhere Sicherheit. Statt dessen spezialisierte Element
Funktionen
Namen
Alle Klassen in MFC beginnen mit C(CWnd, CString, CPoint)
Member Variable beginnen mit m_(z.B.
: m_hInstance)
Ungarische Notation verwenden
Allgemeine Hilfsfunktionen beginnen mit Afx(z.B.: AfxMessageBox)
Wizards:
Application Wizard: zum generieren eines Programm - Gerüsts das auf der Document - View Architektur basiert.
Grundlage der Document-View Architektur ist die Trennung von Daten - Speicherung und Daten - Darstellung.
Die Daten des Programmes werden in einem Dokument Objekt abgespeicher. Die Klasse von der das Objekt abgeleitet wird ist CDocument, das die technische Realisierung der Datenspeicherung des Programmes enthält.
Das Hauptfenster wird mit einem Frame-Objekt verwaltet (Basisklasse CFrameWnd). Dieses Objekt verwaltet den Fensterrahmen, Menü, Symbolleiste und die Statuszeile.
Das Anzeigen der Daten erfolgt mit dem View Objekt, das von CView abgeleitet wird. Zu einem Document - Objekt kann es mehrere Views geben.
Class Wizard: Zum Erstellen von neuen oder ändern und erweitern von bereits bestehenden Klassen. Mit dem Class Wizard kann man die Elementfunktionen einer Klasse mit Windows Ereignissen verbinden.
Der Wizard erleichtert außerdem einige weitere Dinge wie das Überladen von virtuellen Funktionen oder das automatische Generieren des Dialog Datenaustausches. Die Objekte
Das Anwendungs Objekt
Ein MFC-Programm hat immer ein Anwendungs Objekt, welches die wesentlichen Aufgaben von WinMain übernimmt z.B.:
Registrieren, Erzeugen und Anzeigen des Hauptfensters
Meldungsschleife
Das eigene Anwendungsobjekt wird von der MFC-Klasse CWinApp abgeleitet und normalerweise als globale Variable erzeugt, und der Ablauf, der WinMain entspricht, verbirgt sich im Konstruktor des Objekts.
Durch das Überladen von virtuellen Funktionen wird die eigene Klasse an die entsprechenden Bedürfnisse angepaßt. Z.
B.: Überladen von "InitInstance"
Das Hauptfenster Objekt
Das Hauptfenster Objekt wird von der Funktion InitInstance angelegt und verwaltet das Hauptfenster der Anwendung. Die Klasse des Hauptfensters muß von der passenden MFC Fenster Klasse abgeleitet werden(z.B.:CFrameWnd).
Das Windows Objekt wird im Konstruktor durch Aufruf der Create Methode erzeugt:
CmyWindow:: CmyWindow()
{
Create (NULL, "Hello Windows Programm", WS_OVERLAPPEDWINDOW, RectDefault,NULL,"MENU_1");
}
Die Schnittstellen- und Steuerelement Objekte
Die Schnittstellen Objekt ermöglichen ein objektorientiertes Arbeiten mit den Elementen von Windows Fenstern wie
z.
B.: Listboxen Liste->AddString("Erste Zeile");
im Gegensatz zu
SendDlgItemMessage (hWnd,IDC_LIST,LB_ADDSTRING,0,(LPARAM) (LPSTR) "Erste Zeile");
Mit Hilfe der Schnittstellen Objekte ist es außerdem möglich auf Windows Nachrichten durch Nachrichten Tabellen (Message Maps) und Nachrichten-Behandler-Funktionen zu reagieren.
Alle vordefinierten Klassen die als Ausgangspunkt für eigene Klassen verwendet werden (wie z.B.: CDialog, CDistBox, CView) haben CWnd als Basisklasse.
Für Steuerelemente gibt es verschiedene Klassen:
CButton, CEdit, CStatic, CListbox,.
...
Ein Steuerelement wird folgendermaßen einem Resource Element zugeordnet:
CListBox *liste = (CListBox *) GetDlgItem (IDD_LIST1)
Häufige Elementfunktionen bei Steuerelementen.:
Bei Buttons. SetCheck, GetCheck
Bei Listen: AddString, InsertString, DeleteString, ResetContent, SetItemData, GetItemData, GetCurSel, SetCurSel, GetCount, FindString, SelectString
Das Dokument Objekt
Das Dokument Objekt ist von CDocument abgeleitet und verwaltet die Daten der Anwendung.
Z.B.: das Speichern und Laden der Daten vom/in die Datei und kommuniziert mit den View-Objekten.
Wichtige Element Funktionen:
SetModifiedFlag Diese Funktion bewirkt, daß beim Schließen, Öffnen usw. der
Benutzer gefragt wird, ob er das Dokument speichern will.
UpdateAllViews Ruft für alle View Objekte die Element Funktion OnUpdate auf.
OnNewDocument Initialisiert die Daten des Dokuments
OnOpenDocument Zum Initialisieren der Daten, die nicht aus der Datei gelesen
werden.
DeleteContents Entfernt alte Daten des vorherigen Dokuments aus dem Speicher
und gibt Ressourcen frei.
Serialize Zum Lesen und Schreiben der Daten in die Datei. Das Öffnen
und Schließen der Datei wird von Anwendungs-Rahmen
übernommen.
Aufruf Sequenzen:
OnNewDocument: DeletContents
OnOpenDocument: Datei öffnen, DeleteContents, Serialize, Datei schließen
OnCloseDocument: DeleteContents
Serialize
Die Serialize Funktion dient zum Speichern und Laden aus Dateien. Diese Funktionen können
mittels Überladungder virtuellen Serialize Funktion erreicht werden.
à Serialize(CArchive& ar)
Wichtige Methoden des CArchive Objektes sind:
IsStoring()
Read()
Write()
Z.B.: if(ar.IsStoring()) ar << Info << pos;
Die Verwendung ist ähnlich der cin und cout Funktionen.
Das View Objekt
Das View Objekt ist von CView oder CScrollView abgeleitet und verwaltet zum Beispiel
Fenster Ausgaben, Maus Aktionen oder Keybord Eingaben.
Vom View Objekt aus kann auf das Dokument Objekt und dessen Daten mittels
GetDocument() zugegriffen werden.
Wichtige Element Funktionen:
OnDraw Entspricht OnPaint. Ein Zeiger auf das DC-Objekt wird bereits als Parameter überliefert.
Wichtigste zu überladende Funktion.
OnUpdate Wird zum Beispiel durch UpdateAllViews des Dokument Objektes aufgerufen.
OnInitialUpdate Zur Initialisierung des View Objektes. Ruft standardmäßig OnUpdate auf.
Dialog Objekte
Die eigenen Dialogklassen werden von CDialog abgeleitet, und werden der Resource im Konstruktor zugeordnet.
Bei modalen Dialogen:
CmyDialog:: CmyDialog (CWnd* pwnd): Cdialog (IDD_DIALOG1, pwnd) {...}
Bei nicht modalen Dialogen:
CmyDialog:: CmyDialog (CWnd* pwnd) { Create (IDD_DIALOG1, pwnd); }
Abhängig davon, ob es sich um einen modalen oder einen nicht modalen Dialog handelt, wird er entweder am Stack oder am Heap angelegt:
Modal:
CmyDialog dlg(this);
Nicht Modal:
PDlg = new CmyDialog (this);
Auch die Ausführung und die Beendung des Dialogs ist von der Art des Dialogs abhängig:
Ausführung Beendung
Modal: dlg.DoModal(); Aufruf von: Cdialog::EndDialog(int)
Nicht Modal: Create im Konstruktor Aufruf von: CWnd::DestroyWindow()
Falls Buttons mit den Kennungen IDOK und IDCANCEL erstellt werden, so rufen diese beiden standardmäßig EndDialog auf.
Das heißt, daß OnOk() und OnCancel() bei nicht modalen Dialogen unbedingt überladen werden müssen.
Die Freigabe des Dialog Objektes geschieht bei modalen Dialogen automatisch. Bei nicht modalen Dialogen muß man das Objekt manuell mit delete(this) löschen.
Wenn man bei Dialogen Steuerelemente vor dem Anzeigen belegen oder den Focus setzen will, so muß an die virtuelle Methode BOOL Cdialog::OnInitDialog() überladen.
Die Nachrichten Tabelle funktioniert genauso wie im Hauptfenster. Nicht in die Message Map gehören allerdings OnInitDialog, OnOK und OnCancel.
In die MessageMap gehört OnClose.
Nachrichten - Tabellen
Nachrichten Tabellen (Message Maps) sind dazu da, um beim Eintreffen von Windows Meldungen automatisch Element Funktionen aufzurufen. Dadurch ist kein manuelles analysieren von wParam und lParam mehr notwendig.
Nachrichten Tabellen werden mittels Makros realisiert, da diese den virtual Mechanismus nach bauen aber effizienter sind.
Beispiel.
class CmyWindow : public CFrameWnd
{
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT, Cpoint);
DECLARE_MESSAGE_MAP(); //Legt fest, das die Klasse eine Message-Map verwendet
};
BEGIN_MESSAGE_MAP(CmyWindow,CframeWnd) //Definiert die Message-Map
ON_WM_PAINT() //Angabe ohne Parameter, da diese fix vorgegeben sind.
ON_WM_LBUTTONDOWN() //Angabe ohne Parameter, da diese fix vorgegeben sind.
END_MESSAGE_MAP()
Der Dialog-Daten-Austausch Der Dialog-Daten-Austausch(DDX/DDV) ist ein Mechanismus zum Austausch zwischen dem Dialog Objekt und den Steuerelementen des Dialoges.
Für die Steuerelemente müssen passende Member-Variablen im Dialog Objekt enthalten sein.
Bei Modalen Dialogen wird der Transfer automatisch bei OnInitDialog und OnOK ausgeführt.
Der Transfer der Daten kann auch manuell mittels UpdateDate(TRUE/FALSE) aktiviert werden:
UpdateData(TRUE) Transfer vom Dialogobjekt zu den Steuerelementen
UpdateData(FALSE) Transfer von den Steuerelementen zum Dialogobjekt
Kernstück des DDX/DDV ist die Funktion DoDataExchange.
Anmerkungen: |
| impressum | datenschutz
© Copyright Artikelpedia.com