Winmain, wndproc, createwindow, wndclass, boucle de message dans votre fichier projet delphi (.dpr)

Soyez le premier à donner votre avis sur cette source.

Vue 7 097 fois - Téléchargée 469 fois

Description

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.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_koko
Messages postés
654
Date d'inscription
lundi 14 janvier 2002
Statut
Membre
Dernière intervention
20 février 2005
-
hi c marrant ! bien joue
é ;)
agemis
Messages postés
1
Date d'inscription
vendredi 20 juin 2003
Statut
Membre
Dernière intervention
20 juin 2003
-
Très bonne idée. Merci. Ca peut être didactique de nos jours de revenir aux bases :-)
Mais utiliser Forms et Dialogs, ca ajoute 200 ko à l'exécutable juste pour un simple Windows.MessageBox

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.