Grundlagen der Informatik Die Programmierung mit der MFC Prof. Dr.-Ing. Thomas Wiedemann Prof. Dr.rer.nat. Ralph Großmann Fachgebiet Informatik / Mathematik Überblick / Gliederung • Die Microsoft Foundation Classes MFC • Beispielprogramm • Weitere MFC-Bibliotheken 2 Die MFC • die erste Windows-API basierte noch auf einer reinen CProgrammierung und bot nur reine C-Funktionen an, oft nur sehr schwer erweiterbar bei sehr komplexer Programmierung • zur Vereinfachung später wurde eine objektorientierte Schicht darüber gesetzt - die Microsoft Foundation Classes (MFC) Überblick: • ca. 200 teilweise sehr komplexe Klassen siehe http://msdn.microsoft.com/de-de/library/ws8s10w4.aspx http://msdn.microsoft.com/de-de/library/bk77x1wx.aspx • heute zusätzliche Unterstützung von Datenbankprogrammierung, Object Linking and Embedding (OLE) und Netzwerken • Tipp: Zum Generieren von MFC-Anwendungen verwenden Sie günstig den MFC-Anwendungs-Assistent (EXE) in der Projekterstellung mit dem jeweiligen Visual Studio. 3 Wiederholg.: Das Nachrichtensystem von WINDOWS Windows-Applikation Fenster mit Callbackfunc. WndProc zur Reaktion auf Ereignisse WinMain ( ) Fenstererzeugung/Registrierung while (getmessage) { dispatchmessage } 2. 3. 0. Start Nachrichtenwarteschlange Kodierung und Windows-Betriebssystem Ablage als Nachricht Fensterverwaltung (Sichtbarkeit / Ereigniszuordn.) 1. Hardwareereignis (z.B. Mausklick) Hardware ( Bildschirm, Tastatur, Maus, Massenspeicher, Drucker, ...) 4 MFC – Die Objekthierarchie Die MFC-Klassenhierarchie ist eine gutes Beispiel für die Erstellung komplexer Klassenstrukturen: • Fast ALLE MFC-Klassen haben die Klasse CObject als Urmutter. • davon abgleitet ist die Klassen CCmdTarget als eine Hauptklasse, welche Windowsnachrichten verarbeiten kann. • Eine davon weiter abgeleitete Klasse ist CWnd als Basis aller WindowsFensterelemente. Dies sind neben allen echten Fenstern, Dialogen und Rahmen auch alle Bedienelemente (Controls) (siehe volle Liste ff). CObject CCmdTargetObject CWinThread CWinApp CDocument CWnd Controls CDialog 5 Gesamtüberblick zur MFC - Objekthierarchie Quelle: MSDN Library Visual Studio 6.0 6 Die MFC - Objekthierarchie Quelle: MSDN Library Visual Studio 6.0 7 Anlegen eines MFC-Projektes Anlegen einer MFC-Anwendung über C++ -> MFC -> MFC –Anwendung Danach Auswahl der Application-Optionen (vgl. Rechte Maske) - Single-Doc- entspricht einfacher App wie Notepad - Multiple doc. entspricht komplexen Apps wie Winword 8 Initialkonfiguration eines MFC-Projektes In den weiteren Masken des MFC-Assistenten können die Standardeigenschaften der App definiert werden: - Frame Styles definiert die Bedienelemente von Windwos ( Min/Max etc.) und die Konfiguration der Menüleisten - Adv. Features: Hilfekonf., MAPI - Email-Kommunikation, Windows-Socket für direkte Netzwerkkommunikation, Anzahl der Filereferenzen 9 Ableitung eines MFC – Programm durch Vererbung Die MFC-Bibliotheken werden durch #include "stdafx.h" eingebunden (AFX war die erste Bezeichnung der MFC) • Ein neues Windowsprogramm auf MFC-Basis wird von der Klasse System::Windows::Forms::Form abgeleitet , z.b. die neue (app-spezifische) Klassen Form1 mit : public class Form1 : public System::Windows::Forms::Form { … • Die Methoden dieses neuen Objektes werden dann an die speziellen Aufgaben angepasst. • Bei Standardverhalten werden die bereits vorhandenen Methoden von Form verwendet (spart sehr viel Code) 10 MFC – Klassen - Konstruktor und Destruktor Die Konstruktoren / Destruktoren der neue Klasse sind ggf. anzupassen: // Konstruktor public: Form1(void) { InitializeComponent(); // Routine zum Aufbau des Formulars (siehe ff.) // //TODO: weiteren Konstruktorcode hier hinzufügen. } // Destruktor protected: ~Form1() { if (components) { delete components; } // wieder aufräumen beim Schliessen } 11 MFC – Klassen – Der Formularaufbau Mit der Methode InitializeComponent() wird das Formular aufgebaut: void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); // Erzeugung der Objekte als dynamische Objekte this->label1 = (gcnew System::Windows::Forms::Label()); // Erzeugung dyn. this->button1 = (gcnew System::Windows::Forms::Button()); // Parametrisierung der Objekte this->label1->Location = System::Drawing::Point(13, 13); // Pos. des Labels this->label1->Name = L"label1"; // Name this->label1->Size = System::Drawing::Size(210, 25); // Größe this->label1->Text = L"MiniCAD-System 0.1"; // Beschriftung // nach Erzeugen aller dyn. Elemente werden diese an das Form gebunden this->Controls->Add(this->button1); this->Controls->Add(this->label1); } 12 Ein typisches MFC – Programm II • Am einfachsten lassen sich die Vorgehensweisen am Beispiel eines typischen Windows-Dialoges demonstrieren (-> MFC-Assistent -> DialogAnwendung ...) • In der Ressourcenansicht kann dann mit einem relativ komfortablen Editor gearbeitet werden : Rechte Maustaste -> Eigenschaften 13 Ein typisches MFC – Programm III Zum Testen und einfachen Kennlernen eigenen sich folgende Programmbausteine (Details der Aufrufe über Hilfe ... ): - Generierung einer Meldungsbox (Messagebox) MessageBox::Show("beim Laden ...“ Info“ ,MB_OK|MB_ICONSTOP); Text - Titel Buttonanzeige das Schreiben eines Textes auf dem Windows-Screen ist aufwendiger: CPaintDC dc (this); CFont f; f.CreatePointFont(160,"Desdemona"); dc.SelectObject(&f); CRect rect; GetClientRect (&rect); dc.FillSolidRect(&rect,RGB(128,128,128)); dc.SetBkColor(RGB(192,192,0)); dc.SetTextColor(RGB(255,0,0)); dc.DrawText ("Gelber Hintergrund - roter Text", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); 14 MFC – Funktionen für Datenbankprogrammierung Datenbankprogrammierung - die MFC stellt Data Access Objects (DAO) zum Zugriff auf Datenbanken bereit: CdbDBEngine CdbDatabase m_cDBEngine; // gesamte Datenbankschicht als Objekt m_cNWDatabase; // eine konkrete Datenbank CdbRecordset m_cEmpRecordSet; // eine Tabelle oder Abfrage • Spezielle Unterstützung für Microsoft® SQL Server™ 6.0 (Datenbankserver) • Für den Zugriff auf größere Datenbankserver existieren entweder spezielle Bibliotheken der jeweiligen Datenbankhersteller oder universelle MicrosoftSchnittstellen über ODBC (Open Database Connectivity ) 15 MFC – DAO-Datenbankbeispiel BOOL CDAOEMP2Doc::ConnectToDatabase() { CFileDialog cOpenFile(TRUE, T("MDB"), T("employee.mdb"), ... } /* Get the location of database (assume it's the Employee example) */ cOpenFile.DoModal(); CdbDBEngine m_cDBEngine; CdbDatabase m_Database; CdbRecordset m_RecordSet; m_cDatabase = m_cDBEngine.OpenDatabase( cOpenFile.m_ofn.lpstrFile); m_cRecordSet =m_cNWDatabase.OpenRecordset(_T("Employees"), _ dbOpenDynaset); char a[50]; a = m_cRecordSet.Fields["FirstName"].GetValue(); } 16 Weitere MFC – Bibliotheken Grafik und Multimedia-Funktionen : - Multimedia - Audio Compression Manager (ACM) zur Wiedergabe komprimierter Musik - Musical Instrument Digital Interface (MIDI) zur Ansteuerung von Musikinstrumenten • DirectX: Funktionen zum sehr schnellen Zugriff auf die Grafikkarte (teilweise direktes Schreiben in den Grafikspeicher) • Video for Windows • Abspielen von AVI –Dateien, Video Capture zum Aufzeichnen • OpenGL - spezielle 3D-Grafik-Beschreibungssprache von Silicon Graphics, Inc. 17 Weitere MFC – Bibliotheken II Netzwerk-und Kommunikationsfunktionen : - NetBios – unterste Ebene der Kommunikation - Remote Access Service (RAS) für den Fernzugriff auf Rechner - Simple Network Management Protocol (SNMP) zur Verwaltung von Netzwerken - Microsoft Remote Procedure Call (RPC) für die verteilte Realisierung von Abwendungen - Internet services : Active Server Pages zum Einhängen in der Microsoft Internet Information Server (IIS) - Telephony Application Programming Interface (TAPI) für die Anbindungen von Telefonen an Windows-Applikationen 18 Weitere MFC – Bibliotheken III - COM/ ActiveX - Entwicklung von Softwarekomponenten für Internet- und Desktopanwendungen - ActiveX Script – analog zu anderen Internet-Skripsprachen Hinweis: Die ActiveX Technologie hat sich aufgrund von Sicherheitsproblemen bisher nicht durchgesetzt. - Automation-Objects zur Kopplung und zum Datenaustausch zwischen Microsoft bzw. Windowsprogrammen 19 Zusammenfassung zur MFC – Bibliothek Generelle Vorteile - relativ starke Vereinfachung der Windowsprogrammierung - Das gesamte Messagingsystem ist gekappselt, WindowsMessages werden automatisch an die entsprechenden Objekte weitergeleitet - 90 bis 99% der Funktionalität kann von den vorhandenen Basisklassen nachgenutzt werden, nur die Abweichungen sind zu programmieren Probleme und offene Fragen: • Die relativ starke Verwendung von Pointern (Verweise auf alle Objekte) kann bei falscher Anwendung zu Instabilitäten führen. • Dieses Problem wurde mit .NET und dem neuen C# adressiert und zu einem Großteil gelöst. 20