Programmieren in C

Transcription

Programmieren in C
Programmieren in C
Teil 2
IDE
ƒ Integrierte Entwicklungsumgebung
ƒ Editor
ƒ Compiler / Linker
ƒ Debugger
ƒ Hilfe / SDK /API
ƒ Verwaltung aller Projektbezogenen Daten
ƒ C Dateien
ƒ Header
ƒ Resourcen
Visual Studio 2008
Aufgaben
ƒ Neues Projekt anlegen (Konsolenanwendung)
ƒ Neues Projekt
ƒ Win32
ƒ Konsole
ƒ Leeres Projekt
ƒ Neue Datei
ƒ C++ Datei (Speichern als C-Datei)
ƒ Dem Projekt hinzufügen
ƒ Beispiel der strcpy()-Funktion programmieren und übersetzen
Benutzung des Debuggers
ƒ Haltepunkte
ƒ Marken, an denen die Programmausführung angehalten wird
ƒ Schrittweite Ausführung des Programms
ƒ Überwachung der Variablen
ƒ Bei Ausführung des Programms im Debugger wird bei einem
Fehler automatisch die Stelle, an der der Fehler auftrat,
angezeigt
Aufgabe
ƒ Fehler im Beispiel strcpy() einbauen
ƒ Fehlerhaften Zeiger übergeben
ƒ Fehlerhaften String (nicht Null-terminiert) übergeben
Stack
ƒ FiLo (First in/Last out)
ƒ Z.B. Speicherbereich zum Speichern von
Rücksprungadressen eines Tasks
ƒ Benötigte Info
ƒ Start-Adresse
ƒ Aktuelle Position (Offset)
ƒ Länge des Speicherbereichs
ƒ Schreiben und lesen passieren an „einer“
Speicherstelle
Start
Start +1
…
Akt. Pos
…
Ende
FiFo
ƒ First in/First out
Start
ƒ Z.B. Tastatur-Puffer
ƒ Ringbuffer
ƒ Benötigte Info
ƒ Startadresse
…
ƒ Länge
Akt. schreiben
ƒ Schreibposition
ƒ Leseposition
…
ƒ Info über „Umbruch“
ƒ Schreiben und lesen sind
entkoppelt
Start +1
Start
…
…
…
…
Akt. lesen
Akt. lesen
…
Akt.
schreiben
…
Ende
Verkette Listen
ƒ Variabel erweiterbar
ƒ Liste wir durch Verknüpfung der einzelnen
Elemente durch Zeiger aufgebaut
ƒ Effektiv zum Speichern sich ändernder
Daten (einzig durch Zeigeroperationen)
ƒ Einfaches Hinzu-/Einfügen
ƒ Löschen
ƒ Sortieren
Element 1
….
Element 2
….
Element 3
….
Aufgabe
ƒ 2. Versuch der Benutzerdatenbank mit verketteten Listen
Windows klassisch
ƒ Versteckt – Betriebssystem
ƒ Verwaltung von Speicher, Laufwerken, Grafikkarte, CPU usw.
ƒ Bereitstellung von Bibliotheken für den Zugriff auf diese Resourcen
ƒ Sichtbar – Grafische Oberfläche
ƒ Mauszeiger
ƒ Fenster
ƒ „Multitasking“ (kooperativ, preemptiv)
Arbeitsweise einer grafischen
Oberfläche
Abruf der
Meldung
Meldungen
(Ereignisse)
• Mouse Events
• Keyboard Events
• Aktualisierung
des Fensters
• Timer …
Meldungsschleife
Bearbeitung
der Meldung
Meldungswarteschlange
(Message Queue)
Aufgaben beim Entwickeln eines
Windows Programmes
ƒ Implementierung der Meldungsschleife
ƒ 1mal, sieht quasi immer gleich aus
ƒ Implementierung des spezielle Verhaltens der Anwendung
ƒ Darstellung des Inhalts des Fensters
Ein Windows Programm
(oder was hat das mit C zu tun?)
#include <windows.h>
int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{
MSG msg;
WNDCLASS wndclass;
HWND hwndMain;
wndclass.style = (unsigned int) CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_BYTEALIGNWINDOW;
wndclass.lpfnWndProc = (WNDPROC) WndProc;
wndclass.cbClsExtra = (int) 0;
wndclass.cbWndExtra = (int) 5;
wndclass.hInstance = (HINSTANCE) hInstance;
wndclass.hIcon = (HICON) LoadIcon (NULL, "MainIcon");
wndclass.hCursor = (HCURSOR) LoadCursor(NULL, IDC_CROSS);
wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
wndclass.lpszMenuName = (char *) NULL;
wndclass.lpszClassName = (char *) szWndClass;
RegisterClass (&wndclass);
if (RegisterClass (&wndclass))
{
hwndMain = CreateWindowEx (0,
szWndClass, // window class name
szWndCaption,
WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
(GetSystemMetrics (SM_CXSCREEN) - 640) / 2,
|
| 14
// window caption
// window style
Das Graphics Device Interface (GDI)
ƒ Vereinheitlichte Schnittstelle zur Darstellung der Informationen
ƒ Abstrahiert die Art des Geräts (Drucker und Bildschirme sind gleich
anzusprechen)
ƒ "Versteckt" die Grafikkarte
ƒ Kern ist der Gerätekontext (Device Context – DC)
ƒ Ist letztendlich der Grafikkartenspeicher
ƒ Enthält den angezeigten Inhalt des Fensters
|
| 15
Das Fenster
Caption
System Menü
0
Fenster Höhe
Client
Rectangle
Border
Fenster Breite
0
|
| 16
Der Gerätekontext
ƒ Ist der Client-Bereich
ƒ Wenn ein Teil zu aktualisieren ist, wird eine WM_PAINTMeldung gesendet
ƒ Mit BeginPaint() wird ein Handle auf den Device-Kontext
angefordert und eine PAINTSTRUCT-Struktur gefüllt
ƒ Ein Member der PAINTSTRUCT-Struktur gibt den ungültigen
Bereich an
Ungültige
r Bereich
Muss neu
gezeichnet
werden
|
| 17
typdef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
}
PAINTSTRUCT
System-Werte
ƒ Vorgaben der Installation für diverse Größen
ƒ Darstellbare Pixel
ƒ Breite des Rahmens
ƒ Größe der Titelleiste
ƒ Anzahl der Monitore
ƒ Mouse / Mouse-Rad
ƒ GetSystemMetrics()
|
| 18
Formatierte Textausgabe
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cyChar;
switch (iMsg)
{
case WM_CREATE:
{
TEXTMETRIC tm;
HDC hdc;
hdc = GetDC (hwnd);
GetTextMetrics (hdc, &tm);
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC (hwnd, hdc);
return (0);
}
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
char szText[] = "Hello World";
RECT rcClient;
int i = 0;
int iMetric;
char szBuffer[128];
…
Systemmetrics\Systemmetrics.sln
|
| 19
Aufgabe
ƒ Alle Systemwerte ausgeben lassen
|
| 20
Arbeiten mit dem DC
ƒ Linien zeichnen
ƒ LineTo(), MoveToEx(), PolyLine(),…
ƒ Kurven, Ellipsen
ƒ Arc(), AbgleArc(), Ellipse()…
ƒ Bezier-Kurven
ƒ PolyBezier(), PolyBezierTo(),…
ƒ Zeichenstifte
ƒ CreatePen(), CreatePenIndirect(), SelectObject(),…
ƒ Pinsel
ƒ CreateBrushIndirect(), SelectObject(),…
ƒ Koordinatensysteme
ƒ SetViewportOrgEx(), MapWindowPoints(), SetWorldTransform(),..
ƒ Regionen/Clipping
ƒ CreateRectRgn(),…
|
| 21
WICHTIG!
ƒ Alle GDI-Objekte, die neu erzeugt werden, müssen auch wieder
freigegeben werde!
ƒ Objekte, z.B. erzeugt mit CreateBrush(), CreatePen(),
CreateBitmap(),…, werden durch DeleteObject() wieder
freigegeben
ƒ DCs werden mit unterschiedlichen Funktionen freigegeben, abhängig
von der Art der Erzeugung
ƒ Welche Funktion zum Freigeben benutzt werden muss, steht in der
Beschreibung zur jeweiligen Create…() Funktion
ƒ Werden Objekte nicht freigeben, führt die zu
ƒ Speicher Leck
ƒ Keine freien Handels (neue Objekte können nicht mehr erzeugt
werden)
ƒ Programm-Absturz
|
| 22
Aufgabe
ƒ Funktion f(x)=x^2 in einem Fenster mit Koordinatensystem
plotten lassen
Fensterklassen
ƒ Fensterklassen definieren Eigenschaften eines Fensters
ƒ Z.B. Cursor
ƒ Menü
ƒ…
ƒ Legen eine Funktionalität fest
ƒ WndProc()
ƒ Von jeder Klasse können mehrere "Instanzen" existieren
ƒ Erzeugt wird die Instanz mit CreateWindow()
ƒ WndProc sollte so programmiert sein, dass es keine Konflikte gibt
ƒ Eine mit RegisterClass() registrierte Fensterklasse kann von
jedem Windows Programm benutzt werden
|
| 24
Was sind Steuerelement
ƒ Element, die i.d.R. innerhalb von Dialogen zur
Benutzerinteraktion benutzt werden
ƒ Buttons
ƒ Statics
ƒ Edit-Control
ƒ Combo-Boxes
ƒ Ab Windows 95 kommen die "Common Controls" dazu
ƒ List-View
ƒ Tree-View
ƒ…
|
| 25
Benutzung von Steuerelementen
ƒ Steuerelemente sind Fenster, deren Fenster-Prozedur für die
wesentliche Funktionalität schon existiert
ƒ Diese Fenster können innerhalb des eigenen Fensters integriert werden
ƒ Beispiel: Edit-Control
case WM_CREATE:
{
HINSTANCE hInstance;
hInstance = GetWindowLong (hwnd, GWL_HINSTANCE);
hwndEdit = CreateWindowEx (0, "EDIT", "", WS_CHILD | WS_VISIBLE |
ES_MULTILINE,0, 0, 0, 0, hwnd, NULL,
hInstance, NULL);
return (0);
}
|
| 26
ƒ Edit\Edit.sln
Gängige Fensterklassen
ƒ Edit-Control
ƒ Combo-Boxes
ƒ Buttons
ƒ Push Button
ƒ Radio Button
ƒ Check Box
ƒ Klassen\Klassen.sln
|
| 27
Aufgaben
ƒ Einfachen Texteditor programmieren
ƒ Benutzen der Fensterklasse EDIT
Common Controls
ƒ Erweiterung seit Windows 95
ƒ Explorer-Styles
ƒ Tab-Reiter
ƒ Bilder/Animationen usw.
ƒ Muss zur Benutzung initialisiert werden!
ƒ InitCommonControlsEx (LPINITCOMMONCONTROLSEX lpInitCtrls)
ƒ Mit lpInitCtrls können die gewünschten Controls ausgewählt
werden
ƒ ICC_WIN95_CLASSES für alle
ƒ Definiert in <commctrl.h>
ƒ Weiterhin muss im Projekt die zugehörige Library angegeben
werden
ƒ Commctl32.lib
|
| 29
Aufgaben
ƒ Fenster mit den Edit-Control, List Box, Combo-Box und Buttons
Programmieren
ƒ Unterschiedliche Styles auspropieren (WS_..., ES_..., LBS_...,
CBS…, BS_...)
ƒ "Kommunikation" zwischen Hauptfenster und Control über Meldungen
(WM_..., EM_..., LM_..., BM_...)
ƒ Text in Listbox/Combobox einfügen
|
| 30
Standard Dialoge
ƒ Message Boxes
ƒ Information für den Benutzer, einfache Auswahl
ƒ Common Dialogs (Common Dialog Library)
ƒ Farbauswahl
ƒ Speichern/Laden
ƒ Auswahl von Schriftarten
ƒ Drucker Dialog
ƒ Druck-Eigenschaften Dialog
ƒ Text suchen
ƒ "Eigene" Dialoge
ƒ Modal
ƒ Modeless
|
| 31
Modale Dialog
ƒ Dialoge sind fangen alle Eingaben ab, das übergeordnete Fenster ist
nicht mehr erreichbar
ƒ Fast alle gängigen Dialoge sind modal (Speichern/Laden, Drucken, usw.)
ƒ Synchron (d.h. der Code "läuft" erst weiter, wenn der Dialog geschlossen
wurde)
ƒ Erstellen des Dialogs
ƒ "Malen" im Resource-Editor
ƒ Schreiben einer Dialogbox Prozedur (DlgProc)
ƒ Leicht unterschiedlich zur Fensterprozedur
ƒ Wird dargestellt durch Aufruf von DialogBox() oder
DialogBoxParam()
Font2.dsw
|
| 32
Kommunikation zwischen Dialog und
Control
ƒ Kommunikation zwischen Dialog und Controls über Meldungen
ƒ Abfragen von Controls z.B. mit der Funktion SendDlgItemMessage()
ƒ Benachrichtigung der Dialog Prozedur über Änderungen eines
Controls über
ƒ WM_COMMAND Meldung
ƒ WM_NOTIFY Meldung
ƒ Alle Controls kennen außer der Standard-Meldungen noch
spezielle Meldungen
ƒ Buttons: BM_... / BN_...
ƒ Edit: EM_.../EN_...
ƒ…
|
| 33
Modeless Dialoge
ƒ Eingaben an das übergeordnete Fenster werden weitergereicht
ƒ Das übergeordnete Fenster "arbeitet weiter"
ƒ Nur wenige Anwendungen benötigen diese Funktionalität (z.B.
"Suchen/Ersetzen")
ƒ Asynchron (d.h. der Code läuft weiter, auch wenn der Dialog noch
geöffnet ist)
ƒ Verwendung genau wie modale Dialoge, außer
ƒ Darstellung durch CreateDialog() oder CreateDialogParam()
ƒ Das WS_VISIBLE Flag muss explizit gesetzt werden oder der Dialog
muss durch den Aufruf von ShowWindow() explizit dargestellt werden
ƒ Schließen mit DestroyWindow()
|
| 34
Aufgabe
ƒ Uhr programmieren
ƒ Umschaltbar zwischen digital und analog (Menü)
ƒ Weitere benötigte Funktion time(),…
ƒ Weitere benötigte Library math.h (für sin() und cos())
|
| 35