|

Grundlagen der Grafikprogrammierung - Teil 4 - by Delax
Hallo mal wieder! Ich hoffe ihr habt im letzten Kurs nicht zu viel Staub geschluckt vor lauter trockenem Thema. Diesmal geht es ähnlich weiter, sorry.
Wir hatten uns das letzte Mal die Definition einer Windows Klasse angesehen. Gut und schön, aber wir müssen Windows auch mitteilen das wir diese unsere Windows Klasse auch wirklich nutzen wollen. Also müssen wir die Klasse registrieren, damit Windows überhaupt etwas damit anfangen kann. Das ist einfacher, als es sich anhört und ist mit einer Zeile schon getan:
Result := RegisterClass(WindowClass) <> 0;
Das RegisterClass(WindowClass) macht die Hauptarbeit und registriert unsere Windows Klasse. Wir prüfen aber in Result, ob auch wirklich alles glatt gegangen ist. Falls die Klasse nicht registriert werden konnte wissen wir das ein Fehler aufgetreten ist und können das Programm anhalten.
Nun gut, jetzt haben wir eine registrierte Windows Klasse. Die ist aber nichts wert ohne ein Fenster, welches mit dieser Klasse geöffnet wird. Schauen wir uns noch einmal das "Hello World" an.
{
$Id: winhello.pp,v 1.1 1998/12/20 22:23:54 peter Exp $
Copyright (c) 1996 by Charlie Calvert
Modifications by Florian Klaempfl
Standard Windows API application written in Object Pascal.
No VCL code included. This is all done on the Windows API
level.
}
{$APPTYPE GUI}
{$MODE DELPHI}
program WinHello;
uses
Strings, Windows;
const
AppName = 'WinHello';
function WindowProc(Window: HWnd; AMessage, WParam,
LParam: Longint): Longint; stdcall; export;
var
dc : hdc;
ps : paintstruct;
r : rect;
begin
WindowProc := 0;
case AMessage of
wm_paint:
begin
dc:=BeginPaint(Window,@ps);
GetClientRect(Window,@r);
DrawText(dc,'Hello world by Free Pascal',-1,@r,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(Window,ps);
Exit;
end;
wm_Destroy:
begin
PostQuitMessage(0);
Exit;
end;
end;
WindowProc := DefWindowProc(Window, AMessage, WParam, LParam);
end;
{ Register the Window Class }
function WinRegister: Boolean;
var
WindowClass: WndClass;
begin
WindowClass.Style := cs_hRedraw or cs_vRedraw;
WindowClass.lpfnWndProc := WndProc(@WindowProc);
WindowClass.cbClsExtra := 0;
WindowClass.cbWndExtra := 0;
WindowClass.hInstance := system.MainInstance;
WindowClass.hIcon := LoadIcon(0, idi_Application);
WindowClass.hCursor := LoadCursor(0, idc_Arrow);
WindowClass.hbrBackground := GetStockObject(WHITE_BRUSH);
WindowClass.lpszMenuName := nil;
WindowClass.lpszClassName := AppName;
Result := RegisterClass(WindowClass) <> 0;
end;
{ Create the Window Class }
function WinCreate: HWnd;
var
hWindow: HWnd;
begin
hWindow := CreateWindow(AppName, 'Hello world program',
ws_OverlappedWindow, cw_UseDefault, cw_UseDefault,
cw_UseDefault, cw_UseDefault, 0, 0, system.MainInstance, nil);
if hWindow <> 0 then begin
ShowWindow(hWindow, CmdShow);
UpdateWindow(hWindow);
end;
Result := hWindow;
end;
var
AMessage: Msg;
hWindow: HWnd;
begin
if not WinRegister then begin
MessageBox(0, 'Register failed', nil, mb_Ok);
Exit;
end;
hWindow := WinCreate;
if longint(hWindow) = 0 then begin
MessageBox(0, 'WinCreate failed', nil, mb_Ok);
Exit;
end;
while GetMessage(@AMessage, 0, 0, 0) do begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
Halt(AMessage.wParam);
end.
{
$Log: winhello.pp,v $
Revision 1.1 1998/12/20 22:23:54 peter
* new name
}
Hier als Datei zum download
Wieder ist nur ein bestimmter Teil interessant - jener mit der Überschrift "Create the Window Class". Das ist der Standard um ein Fenster
(oder fensterähnliche Objekte) zu öffnen.Gehen wir wieder Schritt für Schritt vor. Als erstes jedoch mal ein Muster einer WinCreate Funktion.
CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam);
Ich bin nicht so ganz sicher, ob das so 100% stimmt, aber es stimmt genug, um nicht ganz falsch zu liegen ;)
lpClassName: Das ist der Name eurer Windows Klasse. Wenn ihr euch erinnert haben wir deren Name mit der Konstanten "AppName" angegeben.
lpWindowName: Hier kommt der Titel eures Fensters hinein. Also "Mein erstes Windows Fenster" oder so.
dwStyle: Wichtig. Dies beschreibt wie sich das Fenster verhält. Ihr könnt unheimlich viele Einstellungen vornehmen wie "Fenster zu Anfang geschlossen", "Fenster als Pop Up", "Fenster mit Scrollbalken" und so weiter. Schafft euch eine Liste an, da es zu viele sind sie hier eingehend zu beschreiben. Ich werde aber in späteren Kursen immer mal wieder unterschiedliche Werte hier nutzen.
x/ y: Die beiden Werte sind einfach nur die X und Y Position eures Fensters ausgehend von der linken oberen Ecke. Wenn es euch egal ist nutzt CW_USEDEFAULT und Windows wird eurem Fenster einen Platz zuweisen.
nWidth/ nHeight: Das ist die Höhe und Breite eures Fensters in Pixeln. CW_USEDEFAULT ist wieder die Alternative.
hWndParent: Das ist ein Handle zu einem übergeordneten Fenster (falls es denn eines gibt). Die meißten Programme haben den Desktop als übergeordnetes Fenster, aber wenn ihr innerhalb eurer Applikation noch Fenster öffnen wollt ist eure Applikation das übergeordnete Fenster.
hMenu: Hier könnt ihr eine Menüleiste zu eurem Fenster hinzufügen. Ist bei Spielen und Demos ziemlich sinnlos, bei Applikationen aber wichtig. NULL fürs erste
hInstance: Wichtig. Dies ist die Instanz unseres Programmes. Erinnert ihr euch noch an den ersten Teil und wie Windows arbeitet? Dies ist das Handle eures Programmes, welches ihr in der WinMain definiert.
lpParam: Im Moment nicht wichtig. NULL
So. Wenn das Fenster nicht erstellt werden konnte nach diesem Versuch wird Windows NULL zurückliefern. Somit können wir die ganze Sache in eine IF-Prüfung packen und gleich Alarm geben wenn etwas schief gegangen ist. Im ganzen wird dann etwa folgendes daraus:
if longint(hWindow) = 0 then begin
MessageBox(0, 'WinCreate failed', nil, mb_Ok);
Exit;
end;
Ihr könnt wieder aufatmen. Ihr wisst jetzt wie man Fenster initialisiert. Zumindest theoretisch. Praktisch fehlt noch ein bischen um das ganze zu einem fertigen Programm zusammen zu fügen. Aber das kommt das nächste Mal. Freut euch schon jetzt auf Event Handling - der wahre Genuß!
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|