Ce source montre comment écrire dans votre fichier projet DELPHI .dpr la procedure de fenêtre WndProc et le programme principal WinMain, tout comme dans un programme API écrit, par exemple, sous Borland C++ .
Au lieu de créer un "form" avec un fichier .pas, c'est le programme écrit dans WinMain qui crée votre fenêtre principale en utilisant la fonction API CreateWindow ,la structre WNDCLASS, et en utilisant le boucle de message qui envoie les événements à la procédure de fenêtre WndProc.
Il montre aussi comment utiliser un menu défini dans un fichier ressource (ressource.res).
Source / Exemple :
program WinMain;
uses
Forms,
Dialogs,
Windows, SysUtils,
Messages;
{$R *.RES}
{$R ressource.RES} // Ressource Menu
const
IDNEW = 101;
IDOPEN = 102;
function WndProc(hWnd : HWND; Msg : UINT; WParam : WPARAM; LParam: LPARAM): UINT; stdcall;
var
hdc : Integer;
ps : TPaintStruct;
Rect : TRect;
begin
case Msg of
WM_PAINT :
begin
hdc := BeginPaint(hWnd, ps);
SetBkMode(hdc, TRANSPARENT);
GetClientRect(hWnd, Rect);
DrawText(hdc, 'My program in Delphi with API style.', -1, Rect,
DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(hwnd, ps);
end;
WM_COMMAND:
begin
case wParam of
IDNEW :
ShowMessage('Vous avez cliqué sur "Nouveau"');
IDOPEN :
ShowMessage('Vous avez cliqué sur "Ouvrir"');
end;
end;
WM_DESTROY:
PostQuitMessage(0);
end;
Result := DefWindowProc(hwnd, Msg, wParam, lParam);
end;
var
Msg : TMsg;
hwnd, hAccel : Integer;
szAppName : LPSTR = 'lpFetraDelphi';
nCmdShow : Integer = SW_SHOWNORMAL;
TempClass, UtilWindowClass : TWndClass;
ClassRegistered : Boolean;
begin
with UtilWindowClass do
begin
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @DefWindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := 0;
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := GetStockObject(WHITE_BRUSH);
lpszMenuName := 'FETRA'; // Menu dans le ressource.res
lpszClassName := szAppName;
end;
UtilWindowClass.hInstance := hInstance;
ClassRegistered := GetClassInfo(hInstance, UtilWindowClass.lpszClassName, TempClass);
if not ClassRegistered or (TempClass.lpfnWndProc <> @DefWindowProc) then
begin
if ClassRegistered then
Windows.UnregisterClass(UtilWindowClass.lpszClassName, hInstance);
end;
Windows.RegisterClass(UtilWindowClass);
// Créer la fenêtre principale
hWnd := CreateWindow(UtilWindowClass.lpszClassName,
'',
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
hInstance,
nil);
// Procédure de fenêtre
SetWindowLong(hwnd, GWL_WNDPROC, LongInt(@WndProc));
// Titre de la fenêtre
SetWindowText(hwnd, 'Création dynamique de Form en Delphi');
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Boucle de message
while (GetMessage(Msg, 0, 0, 0)) do
begin
TranslateMessage(Msg);
DispatchMessage (Msg);
end;
end.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.