Programmieren unter MS-Windows

Kapitel 6: Konventionen, Konstanten und Definitionen

Letzte Änderung: 2.11.97 von B. Tritsch

Überblick

Zurück zum Index "PC- und MS-Windows-Support"

Zurück zum Inhalt


Ungarische Namenskonvention

Unter Windows besteht eine besondere Vereinbarung bezüglich der Variablen- und Funktionsnamen: Die ungarische Namenskonvention. Der Grund ist die Forderung nach aussagekräftigen Bezeichnungen, die die Lesbarkeit des Programm-Codes verbessern und helfen unsinnige Zuweisungen zu vermeiden.

Bei Variablen beginnt der Name mit einem Präfix aus Kleinbuchstaben, die den Charakter definieren. Danach folgt der eigentliche Name, der sich aus einer kombinierten Groß/Kleinschreibung zusammensetzt.

Beispiel:

lpszFirstName (long pointer to null terminated string FirstName)
lpszName = cbName (Byteanzahl an einen long pointer) = Sinnlose Operation
Präfix Datentyp
a
b
c
cb
ch
cs
dw
f
h
hdc
hwnd
i
l
lp
n
pt
sz
w
Array, Feld
Boolean
Class
Count of Bytes, Byteanzahl
Character, Zeichen
String Class CString
unsigned long = DWORD (32 Bit)
Funktion
Handle, 16-Bit-Identifikation (32 Bit bei WIN32)
Handle on Display Context (dto)
Handle on Window (dto)
Index
long integer (Redundant unter WIN32)
long (far) pointer (Redundant unter WIN32)
Integer
x, y Point
Null terminated String
unsigned integer = WORD (16 Bit)

Neben den Präfixen der Ungarischen Notation gibt es noch weitere Präfixe, die für das AFX-Rahmenwerk (AFX = Application Framework) und die Objektklassen benutzt werden.

Präfix Datentyp
C
m_
Afx
afx
_Afx
_afx
AFX_
AFX_ID
Klasse oder Struktur
Elementvariable einer Klasse
public-Funktion des Anw.-Rahmens
public-Variable des Anw.-Rahmens
interne Funktion des Anw.-Rahmens
interne Variable des Anw.-Rahmens
interne Struktur des Anw.-Rahmens
interner Bezeichner des Anw.-Rahmens

Bei Funktionen wird häufig ein Verb in Verbindung mit einem Hauptwort verwendet, um die betreffende Operation zu beschreiben, oder es werden (teilweise abgekürzte) Hauptworte zusammengesetzt. Die Groß/Kleinschreibung ist wie oben.

Beispiele:

CreateWindow,
DrawText,
DialogBox,
DlgProc,
MinWndProc

Die Datei WINDOWS.H

Während die Bibliotheken von C in Form vieler kleiner Header-Dateien ausgeliefert werden, besteht die Windows-Bibliothek aus einem File WINDOWS.H mit über 100 kByte Größe. In WINDOWS.H sind enthalten: Symbolische Konstanten, Datentypen und Prototypen.

Symbolische Konstanten

In WINDOWS.H sind rund 1500 symbolische Konstanten definiert, die Zahlenwerte in einer verständlichen Form repräsentieren.

Beispiele:

WM_CREATE
WM_DESTROY (für Fenstermeldungen)

Datendefinitionen

In WINDOWS.H werden eine Reihe von Windows-spezifischen C-Datentypen definiert. Hierbei sind die folgenden die am meisten verwendeten:

WINDOWS.H-Definition C-Definition (Win 3.x/WinNT und Win95)
BOOL
BYTE
DWORD
HANDLE
HDC
HWND
LONG
LPARAM
LPSTR
NPSTR
UINT
WPARAM
WORD
int (16/32 Bit)
unsigned char (8/8 Bit)
unsigned long (32/32 Bit)
unsigned int (16/32 Bit)
unsigned int (16/32 Bit)
unsigned int (16/32 Bit)
long (32/32 Bit)
long (32/32 Bit)
char far * (Redundant unter WIN32)
char near * (Redundant unter WIN32)
unsigned int (16/32 Bit)
int (16/32 Bit)
unsigned int (16/16 Bit)

Eine Reihe von Makros erleichtern den Übergang von Windows 3.x zu einer 32-Bit Umgebung

Makro Definiert als Anmerkung
VOID ((void *) 0) Unter Win 3.x war VOID als 0 definiert
FAR NULL Abwärtskompatibilität
NEAR NULL Abwärtskompatibilität
PASCAL __stdcall War _pascal unter Win 3.x
WINAPI __stdcall War _far _pascal unter Win 3.x
CALLBACK __stdcall War _far _pascal unter Win 3.x
FALSE 0  
TRUE 1  

Andere Makros wie LOBYTE, HIWORD und MAKELONG sind in ihrer Funktion im wesentlichen unverändert geblieben.

Neben einfachen Datentypen und Makros enthält WINDOWS.H auch eine Reihen von Strukturdefinitionen.

Funktionsprototypen

WINDOWS.H enthält viele Funktionsprototypen, die dem Compiler sagen, wie der Aufruf einer Routine auszusehen hat. Dies ermöglicht dem C-Compiler eine wirksame Fehlerprüfung.

Beispiel:

BOOL WINAPI TextOut (HDC, int, int, LPSTR, int);

Der Compiler weiß nun welche und wieviele Parameter die Routine hat und wie ihr Rückgabewert aussieht.

Jede Windows-Funktion verfügt über einen Prototyp in WINDOWS.H

Auch für eigene Funktionen sollte diese Technik übernommen werden: Deklaration der Funktionsprototypen in einer eigenen Header-Datei. Dies entspricht auch schon weitgehend C++-Konventionen.

Handles

Ein Handle ist ein Bezeichner und besteht aus einem unsigned integer mit der Länge von 16 Bits (32 Bits unter Windows/32 und Windows NT). Windows setzt Handles ausschließlich zum Identifizieren von Objekten ein, wobei jedes Handle einzigartig ist. Im Fehlerfall gibt eine entsprechende Funktion einen NULL-Handle zurück.

Die beiden wichtigsten Handle-Typen für Windows sind Fenster- und Display Context Handles. Es werden jedoch auch Menüs, Strings, Icons, Cursor, Stift, Pinsel, Schriftarten und sogar Speicherbereiche durch Handles identifiziert.

Messages

Windows basiert auf einem nicht-sequentiellen, meldungsgetriebenen Programmiermodell, um das herum sich die Programme strukturieren. Eine Meldung (Message) besteht dabei aus Informationen hinsichtlich einer Veränderung der Benutzerschnittstelle oder anderen internen Attributen.

Prinzipiell bestehen Messages aus vorzeichenlosen 16-Bit-Werten (32-Bit-Werten), die aber aus Verständlichkeitsgründen bestimmte Namen haben. Diese fangen immer mit dem Präfix WM_ an und können leicht mit dem Programm SPY aus dem MS-SDK betrachtet werden.

Hierbei gilt zu beachten, daß die Reihenfolge der Messages unvorhersehbar ist und sie von Programmen beachtet oder auch ignoriert werden können. Dies ist ein großer Unterschied zu prozedur-orientierten und sequentiellen Programmen.

Es gibt unter Windows acht verschiedene Meldungstypen:

Typ Beschreibung
- Hardware
- Fensterpflege
- Schnittstelle
- Beendigung
- Privat
- Systemressourcen
- Gem. Daten
- Systemintern
Maus- und Tastatureingabe
Benachrichtigung, Abfrage
Menü, Mauszeiger, Scrollbars, Dialoge
Beenden von Anwendung oder System
Dialogboxkontollen
Farbänderung, Schriftarten, Spooler, Modi
Clipboard, DDE, OLE
Nicht dokumentierte Meldungen

Zum nächsten Kapitel